CVE-2026-72033 в Linux Kernel: переполнение в Orangefs и защита от DoS

CVE: CVE-2026-72033
Продукт: Linux Kernel
Дата публикации: 15.08.2026
Критичность: не определена
CVSS: нет данных
EPSS: 0,22%; процентиль 12,94%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


В файловой системе Orangefs ядра Linux обнаружена уязвимость, позволяющая вызвать чтение за пределами буфера (out-of-bounds read) при обработке записей каталога. Проблема возникает из-за некорректного приведения типа данных при вычислении размера записи, что приводит к переполнению 32-битного целого и обходу проверки границ. Результатом эксплуатации является отказ в обслуживании (DoS) через падение ядра (kernel oops).

Основные характеристики​


Уязвимость затрагивает подсистему файловой системы Orangefs, которая используется для доступа к распределенным файловым системам. Ключевая проблема заключается в функции fill_from_part(), отвечающей за заполнение данных из частей каталога. Функция вычисляет размер записи каталога, используя тип size_t, но сохраняет результат в переменную типа __u32. Если длина записи, предоставленная клиентом пользовательского пространства, близка к максимальному значению 32-битного беззнакового целого (U32_MAX), происходит переполнение (wrap-around). Значение уменьшается до малого числа, что позволяет обойти последующую проверку границ буфера. В результате ядро пытается прочитать данные за пределами выделенной области памяти, что вызывает ошибку ядра (oops) и потенциально приводит к зависанию или перезагрузке системы.

Какие продукты и версии затронуты​


Linux Kernel с поддержкой файловой системы Orangefs. Уязвимость присутствует в версиях ядра, содержащих коммит 480e3e532e31 («orangefs: support very large directories»), но не имеющих исправления 18227a6bc98bd0ba96ed3ce9d5b28776a5a28dfc. Исправление было применено в ветках стабильных версий ядра (stable tree) в июле 2026 года. Системы, не использующие файловую систему Orangefs, не подвержены риску.

Причина уязвимости​


Причиной уязвимости является ошибка в логике обработки типов данных в функции fill_from_part() файла fs/orangefs/dir.c. Разработчики вычисляли размер записи каталога (padlen) с использованием арифметики, совместимой с size_t, но присваивали результат переменной типа __u32. При этом длина строки имени файла (*len) поступает от клиента пользовательского пространства. Если клиент передает значение длины, близкое к U32_MAX, сумма (sizeof *len + *len + 1) переполняет 32-битный диапазон. В результате padlen принимает малое значение, которое проходит проверку if (part->len < i + padlen + sizeof *khandle). Это приводит к тому, что указатель смещается за пределы допустимой области памяти, и ядро пытается прочитать данные из недопустимого адреса.

Как работает атака​


Атакующий должен иметь возможность взаимодействовать с клиентом пользовательского пространства файловой системы Orangefs, который обслуживает запросы к ядру. Для эксплуатации уязвимости злоумышленник посылает специально сформированный запрос на чтение каталога (readdir), в котором поле длины записи (trailer) содержит значение, близкое к U32_MAX. Ядро принимает это значение, вычисляет размер записи, приводит его к __u32, что вызывает переполнение и получение малого значения. Проверка границ, основанная на этом искаженном размере, успешно проходит. Далее ядро использует смещение для доступа к памяти, выходя за пределы буфера part. Попытка чтения по этому адресу вызывает исключение ядра (kernel oops), что приводит к аварийному завершению работы процесса или, в худшем случае, к зависанию системы.

Условия успешной эксплуатации​


Для успешной эксплуатации необходимы следующие условия:

  1. Система использует файловую систему Orangefs.
  2. Атакующий имеет доступ к клиенту пользовательского пространства Orangefs или может контролировать данные, передаваемые от сервера к клиенту.
  3. Клиент передает в ядро данные с контролируемым полем длины записи.
  4. Ядро не содержит исправления, меняющего тип переменной padlen на u64.

Возможный сценарий атаки​


Сценарий атаки начинается с того, что атакующий, имеющий доступ к сети или локальной системе, взаимодействующей с распределенной файловой системой Orangefs, инициирует операцию чтения каталога. В запросе или ответе, обрабатываемом клиентом, атакующий подменяет или формирует поле длины записи так, чтобы оно было равно значению, близкому к 4294967295 (U32_MAX). Когда ядро обрабатывает этот запрос в функции fill_from_part(), оно вычисляет размер записи. Из-за приведения типа к __u32 происходит переполнение, и размер становится, например, 1 или 0. Проверка границ part->len < i + padlen + sizeof *khandle возвращает истину, так как вычисленный размер кажется допустимым. Ядро затем пытается прочитать данные по смещению, выходящему за пределы буфера part. Это вызывает ошибку сегментации в режиме ядра (oops), что фиксируется в системном журнале и может привести к падению системы.

Есть ли публичный эксплойт​


На момент публикации информации публичные эксплойты или PoC-коды для CVE-2026-72033 не зафиксированы. Уязвимость была обнаружена и исправлена в рамках внутренней разработки ядра. Доступны только ссылки на коммиты исправления в репозитории стабильных версий ядра Linux. Отсутствие публичного эксплойта не означает невозможности эксплуатации, но снижает вероятность массовых атак в краткосрочной перспективе.

Признаки эксплуатации​


Специфичные индикаторы компрометации (IOC) для этой уязвимости отсутствуют, так как эксплуатация приводит к отказу в обслуживании, а не к установке вредоносного ПО. Однако администраторы могут наблюдать следующие неспецифичные признаки:

  • Внезапные падения ядра (kernel oops) с упоминанием модуля orangefs или функции fill_from_part в системных журналах (dmesg, syslog).
  • Непредсказуемые зависания или перезагрузки системы при операциях чтения каталогов в распределенной файловой системе.
  • Сообщения об ошибках доступа к памяти (out-of-bounds read) в логах ядра.

Как обнаружить атаку​


Для обнаружения признаков эксплуатации или наличия уязвимости рекомендуется:

  1. Мониторинг системных журналов (dmesg, /var/log/syslog) на наличие сообщений об ошибках ядра, связанных с модулем orangefs.
  2. Проверка версии ядра и наличия примененных патчей.
  3. Анализ логов файловой системы на наличие аномальных запросов с экстремально большими значениями длины записи.
  4. Использование инструментов аудита ядра для проверки целостности модулей файловой системы.

Как проверить свою версию​


Для проверки версии ядра и определения подверженности системы уязвимости используйте следующие команды:

Bash:
uname -r
uname -a
cat /proc/version

Сравните полученную версию ядра с версиями, содержащими исправление. Исправление было применено в коммите 18227a6bc98bd0ba96ed3ce9d5b28776a5a28dfc и портировано в различные ветки стабильных версий. Если ваша версия ядра старше даты применения исправления (июль 2026 года) и содержит поддержку Orangefs, система уязвима.

Исправление​


Основным методом устранения уязвимости является обновление ядра Linux до версии, содержащей исправление. Исправление изменяет тип переменной padlen с __u32 на u64, что предотвращает переполнение при вычислении размера записи. Это гарантирует, что проверка границ будет корректно отклонять записи с недопустимо большим размером.

Обновите систему с помощью пакетного менеджера вашей дистрибуции:

Bash:
# Для Debian/Ubuntu
sudo apt update
sudo apt upgrade linux-image-generic

# Для RHEL/CentOS/Fedora
sudo dnf update kernel

После обновления перезагрузите систему, чтобы загрузить новое ядро.

Временные меры защиты​


Если немедленное обновление ядра невозможно, рекомендуется:

  1. Отключить использование файловой системы Orangefs, если она не критична для работы системы.
  2. Ограничить доступ к клиенту пользовательского пространства Orangefs, чтобы предотвратить обработку запросов от недоверенных источников.
  3. Настроить мониторинг системных журналов на предмет сообщений об ошибках ядра, связанных с orangefs, для раннего обнаружения попыток эксплуатации.
  4. Изолировать системы, использующие Orangefs, в отдельном сегменте сети, чтобы минимизировать поверхность атаки.

Как проверить устранение уязвимости​


Для проверки успешного применения исправления:

  1. Убедитесь, что система загружена с новым ядром:

    Bash:
    uname -r
  2. Проверьте наличие коммита исправления в истории ядра (если доступна информация о сборке):

    Bash:
    git log --oneline | grep 18227a6b

    (Эта команда применима только если ядро собрано из исходников с доступом к git).
  3. Убедитесь, что модуль orangefs загружен и работает корректно, выполнив тестовые операции чтения каталогов и проверив логи на отсутствие ошибок oops.
  4. Проверьте, что переменная padlen в исходном коде функции fill_from_part() имеет тип u64 (если есть доступ к исходникам ядра).

Вывод​


CVE-2026-72033 представляет собой уязвимость в файловой системе Orangefs ядра Linux, позволяющую вызвать отказ в обслуживании через переполнение 32-битного целого при вычислении размера записи каталога. Уязвимость эксплуатирована через предоставление клиентом пользовательского пространства недопустимо большого значения длины записи. Исправление заключается в изменении типа переменной на 64-битный, что предотвращает переполнение и обеспечивает корректную проверку границ. Администраторам рекомендуется обновить ядро до версии, содержащей исправление, или отключить использование Orangefs, если обновление невозможно.

Официальные источники​


  1. NVD — CVE-2026-72033
  2. FIRST EPSS — CVE-2026-72033
  3. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  4. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  5. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  6. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  7. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  8. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  9. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree
  10. orangefs: keep the readdir entry size 64-bit in fill_from_part() - kernel/git/stable/linux.git - Linux kernel stable tree

История обновлений статьи​


  • 17.08.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ