CVE-2026-89686 в Linux Kernel: гонка в nfsd, уязвимые версии и защита

CVE: CVE-2026-89686
Продукт: Linux Kernel
Дата публикации: 11.09.2026
Критичность: CRITICAL
CVSS: 9.8 (3.1)
EPSS: 0,67%; процентиль 50,05%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


В модуле nfsd ядра Linux обнаружена гонка, позволяющая удаленному клиенту NFS4 вызвать сбой ядра через конфликт между отзывом делегирования и запросом LAYOUTGET. Ошибка нарушает дисциплину блокировок при чтении указателя на файл и приводит к срабатыванию BUG_ON. Статья разбирает механику атаки, условия эксплуатации и способы проверки исправления.

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


Уязвимость позволяет удаленному атакующему вызвать отказ в обслуживании (DoS) сервера NFS, заставив ядро упасть. Риск реализуется через штатные протокольные операции NFSv4, не требующие привилегий или взаимодействия пользователя.

  • Тип ошибки: Гонка (race condition) при доступе к разделяемым данным без блокировки.
  • CVSS 3.1: 9.8 (CRITICAL). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.
  • Условия атаки: Сетевой доступ к сервису NFSv4 с поддержкой pNFS.
  • Эксплуатация: Подтверждена техническим описанием и патчем; публичный PoC в источниках не указан.
  • EPSS: 0,67% (процентиль 50,05%). Вероятность эксплуатации в ближайшие 30 дней оценивается как низкая.

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


Уязвимость затрагивает реализацию NFSv4 в ядре Linux, а именно подсистему nfsd. Ошибка была введена в коммите c5c707f96fc9 («nfsd: implement pNFS layout recalls») и присутствует в версиях, содержащих этот код.

  • Компонент: fs/nfsd/nfs4layouts.c.
  • Функция: nfsd4_alloc_layout_stateid.
  • Версии: Точный список уязвимых версий ядра не указан в переданных источниках. Для определения актуальности необходимо свериться с официальными релизами дистрибутива и наличием патча ca94ba36172046be6a694a7986f6931e47ed4d51 в текущем ядре.

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


Причина ошибки заключается в нарушении дисциплины блокировок при обработке запросов LAYOUTGET. Функция nfsd4_alloc_layout_stateid читает поле fp->fi_deleg_file без удержания спина-лока fp->fi_lock, если родительский stateid является делегированием (delegation).

В то же время механизм отзыва делегирования (laundromat) может параллельно очистить это поле под защитой fi_lock. В результате возникает состояние, при котором указатель становится невалидным, а функция nfsd_file_get() возвращает NULL. Код не обрабатывает этот случай корректно, а вместо этого вызывает BUG_ON, что приводит к аварийному завершению работы ядра.

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


Атака эксплуатирует временное окно между отзывом делегирования и запросом на получение layout. Атакующий использует два NFS-клиента: один удерживает делегирование на файле, второй инициирует открытие того же файла, что заставляет сервер отозвать делегирование.

Если первый клиент не отвечает на запрос отзыва, сервер принудительно отзывает делегирование через фоновый процесс laundromat. В этот момент атакующий отправляет запрос LAYOUTGET, используя stateid отозванного делегирования. Если запрос попадает в окно гонки, ядро читает очищенный указатель и срабатывает BUG_ON.

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


Для успешной эксплуатации атакующему необходимо иметь сетевой доступ к серверу NFSv4, который поддерживает pNFS и делегирования.

  • Протокол: NFSv4 с поддержкой pNFS.
  • Доступ: Возможность выполнять операции OPEN и LAYOUTGET.
  • Синхронизация: Необходимость попасть в узкое временное окно между отзывом делегирования и обработкой запроса layout.
  • Привилегии: Не требуются, если клиент имеет право на доступ к файлам.

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


Сценарий атаки начинается с того, что клиент A получает делегирование на файл. Клиент B открывает тот же файл, что инициирует отзыв делегирования у клиента A. Если клиент A не подтверждает отзыв, сервер запускает laundromat для принудительного отзыва.

В момент, когда laundromat очищает fi_deleg_file, клиент A (или любой другой клиент с этим stateid) отправляет LAYOUTGET. Ядро пытается получить файл по невалидному указателю, nfsd_file_get возвращает NULL, и срабатывает BUG_ON. Сервер NFS падает, нарушая доступность для всех клиентов.

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


В предоставленных источниках отсутствует информация о публичном PoC или подтвержденной эксплуатации в реальных атаках. Ошибка была обнаружена и исправлена в рамках стандартного процесса разработки ядра. Патч опубликован в ветке stable, что подтверждает техническую реализуемость сценария, описанного в коммите.

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


Специфичных индикаторов компрометации (IOC) для этой уязвимости в источниках не приведено. Так как атака приводит к падению ядра, основным признаком является внезапная перезагрузка сервера или сбой NFS-сервиса.

  • Журналы ядра: Записи о срабатывании BUG_ON в fs/nfsd/nfs4layouts.c.
  • Сетевая активность: Аномальные последовательности OPEN и LAYOUTGET от разных клиентов для одного файла.
  • Состояние сервиса: Внезапное прекращение работы nfsd.

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


Для обнаружения атаки или срабатывания уязвимости следует анализировать журналы ядра и логи NFS-сервера. Ищите сообщения о панике ядра (kernel panic) с указанием функции nfsd4_alloc_layout_stateid или BUG_ON в модуле nfsd.

  • Проверка логов: dmesg | grep -i "BUG_ON.*nfsd".
  • Мониторинг NFS: Отслеживание частых отзывов делегирований и последующих запросов LAYOUTGET.
  • Аудит: Проверка, не был ли сервер перезагружен в момент пиковой нагрузки NFS.

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


Для проверки версии ядра и определения, требуется ли обновление, используйте следующие команды. Они позволяют узнать текущую версию ядра, чтобы сравнить ее с официальными списками исправленных версий вашего дистрибутива.

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

После получения версии сверьтесь с базой данных безопасности вашего дистрибутива (например, Debian, Ubuntu, RHEL) для подтверждения наличия патча ca94ba36172046be6a694a7986f6931e47ed4d51.

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


Единственным надежным способом устранения уязвимости является обновление ядра до версии, содержащей исправление. Патч был принят в ветку stable и распространяется через официальные каналы дистрибутивов.

  • Обновление ядра: Установите последние доступные обновления ядра через пакетный менеджер.
  • Перезагрузка: После установки обновленного ядра выполните перезагрузку системы для его активации.
  • Проверка: Убедитесь, что новая версия ядра содержит коммит ca94ba36172046be6a694a7986f6931e47ed4d51.

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


Пока обновление не установлено, можно снизить риск, ограничив доступ к NFS-серверу или отключив поддержку pNFS, если это допустимо в инфраструктуре.

  • Ограничение доступа: Настройте файрвол так, чтобы к NFS-серверу имели доступ только доверенные хосты.
  • Отключение pNFS: Если возможно, отключите поддержку pNFS в конфигурации nfsd, так как уязвимость связана с обработкой layout.
  • Мониторинг: Усиленный мониторинг журналов на предмет сбоев ядра.

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


После обновления ядра необходимо убедиться, что патч применен. Проверьте версию ядра и наличие соответствующих изменений в исходном коде, если вы собираете ядро самостоятельно.

  • Проверка версии: uname -r.
  • Проверка патча: В сборках из исходников можно проверить наличие коммита ca94ba36172046be6a694a7986f6931e47ed4d51 в истории git.
  • Функциональное тестирование: Проведите нагрузочное тестирование NFS-сервера, чтобы убедиться в стабильной работе.

Вывод​


CVE-2026-89686 представляет собой критическую уязвимость в nfsd, позволяющую удаленному атакующему вызвать отказ в обслуживании. Механизм атаки основан на гонке при обработке делегирований и запросов layout.

Обновление ядра до версии с патчем является обязательным для всех серверов, предоставляющих NFSv4 с pNFS. Администраторам следует проверить актуальность своих систем и применить обновления в приоритетном порядке.

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


  1. NVD — CVE-2026-89686
  2. FIRST EPSS — CVE-2026-89686
  3. nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing delegation revoke - kernel/git/stable/linux.git - Linux kernel stable tree
  4. nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing delegation revoke - kernel/git/stable/linux.git - Linux kernel stable tree
  5. nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing delegation revoke - kernel/git/stable/linux.git - Linux kernel stable tree
  6. nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing delegation revoke - kernel/git/stable/linux.git - Linux kernel stable tree
  7. CVEs — The Linux Kernel documentation

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


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