CVE-2026-89972 в Linux Kernel: уязвимость NVMe, уязвимые версии и защита

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

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


В ядре Linux обнаружена ошибка в модуле NVMe. При ошибке выделения namespace структура освобождается без ожидания завершения чтения SRCU-читателями. Это приводит к use-after-free в путях multipath. Проблема подтверждена в stable-ветках ядра и требует обновления соответствующих пакетов ядра.

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


Риск связан с повреждением памяти в ядре Linux при работе NVMe-контроллера в режиме multipath. Ошибка возникает из-за отсутствия синхронизации SRCU перед освобождением структуры namespace в ошибочном пути функции nvme_alloc_ns().

  • Тип ошибки: use-after-free в ядре Linux, компонент drivers/nvme/host/core.c.
  • CVSS 3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, оценка 9.8, критическая.
  • Вектор атаки: удалённый доступ без привилегий и взаимодействия пользователя; требуется активное использование NVMe с multipath.
  • Факт эксплуатации: в предоставленных источниках не подтверждено.
  • EPSS: 0,598% (процентиль 47,28%).

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


Затронуты версии Linux Kernel, содержащие код nvme_alloc_ns() без вызова synchronize_srcu(&ns->head->srcu) в ошибочном пути out_unlink_ns.

  • Linux kernel stable: commit ef248d5de4469fb6bbaf8dbe0c4c47800080d648 — исправление в mainline.
  • Linux kernel 6.12.x: commit d663944dbad81bb0e3635d7090db4713e6300858 — backport в stable-ветку.
  • Linux kernel 7.6.x: commit 76023560d60f10b4f808941163aa2975f1631683 — backport в stable-ветку.

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

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


Функция nvme_alloc_ns() в drivers/nvme/host/core.c освобождает структуру namespace через kfree(ns) после удаления из списка siblings с помощью list_del_rcu(&ns->siblings).

В ошибочном пути out_unlink_ns вызов synchronize_srcu(&ns->head->srcu) отсутствует. В нормальном пути nvme_ns_remove() этот вызов присутствует и гарантирует, что все SRCU-читатели завершили работу до освобождения памяти.

Без синхронизации параллельный читатель в nvme_find_path() или nvme_mpath_revalidate_paths() может удерживать ссылку на namespace после её освобождения. Это создаёт use-after-free.

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


Атака использует гонку между двумя потоками ядра.

Первый поток вызывает nvme_alloc_ns(), который при ошибке удаляет namespace из списка и освобождает память через kfree(ns). Второй поток одновременно выполняет srcu_read_lock() и итерацию head->list в nvme_find_path() или nvme_mpath_revalidate_paths().

После освобождения памяти читатель продолжает обращаться к структуре namespace. Это приводит к чтению или записи по уже освобождённым адресам.

Повреждение памяти может повлиять на соседние объекты ядра, что потенциально позволяет изменить состояние системы.

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


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

  • Система использует NVMe-контроллер с включённым multipath.
  • В ядре активен код nvme_find_path() или nvme_mpath_revalidate_paths().
  • Произошла ошибка в nvme_alloc_ns(), вызвавшая переход к out_unlink_ns.
  • Случайная гонка между освобождением namespace и чтением списка SRCU.

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

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


Сценарий предполагает работу NVMe-контроллера в режиме multipath на системе с уязвимым ядром.

При обработке ошибки в nvme_alloc_ns() namespace удаляется из списка и освобождается без ожидания завершения SRCU-читателей. Одновременно другой поток выполняет проверку путей через nvme_find_path() или nvme_mpath_revalidate_paths().

Если читатель успевает получить доступ к структуре namespace после kfree(ns), происходит обращение к освобождённой памяти. Это может привести к повреждению данных ядра и нарушению работоспособности системы.

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


В предоставленных источниках нет подтверждённого публичного PoC или эксплойта.

Исправление доступно в commit'ах Linux kernel stable tree:


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

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


Специфичные IOC для этой уязвимости в предоставленных источниках не раскрыты.

Неспецифичные точки контроля:

  • Внезапное падение ядра или panic при работе NVMe с multipath.
  • Аномальные записи в /var/log/messages или journalctl, связанные с NVMe или kernel panic.
  • Нестабильность работы NVMe-устройств после обновления или изменения конфигурации multipath.
  • Изменение состояния системных объектов ядра без видимых внешних действий.

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


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

  • Проверка версии ядра: uname -r, uname -a, cat /proc/version.
  • Поиск NVMe-устройств: lsblk -o NAME,TYPE,MOUNTPOINT и nvme list.
  • Журналы ядра: journalctl -k | grep -i nvme или анализ /var/log/messages.
  • Проверка multipath: multipath -ll для просмотра активных путей NVMe.

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

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


Проверьте версию ядра и наличие исправлений:

  • uname -r — версия ядра.
  • uname -a — полная информация о системе.
  • cat /proc/version — версия ядра из /proc.

Для проверки наличия commit'ов в текущем дереве ядра используйте:

  • git log --oneline | grep ef248d5de4469fb6bbaf8dbe0c4c47800080d648
  • git log --oneline | grep d663944dbad81bb0e3635d7090db4713e6300858
  • git log --oneline | grep 76023560d60f10b4f808941163aa2975f1631683

Замените <имя-пакета> на фактический пакет ядра вашей дистрибуции при проверке обновлений через пакетный менеджер.

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


Исправление доступно в следующих commit'ах Linux kernel:


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

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


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

  • Отключите multipath для NVMe-устройств, если это допустимо для работы системы.
  • Ограничьте доступ к NVMe-контроллерам с минимально необходимым набором путей.
  • Мониторинг ядра на аномальные ошибки NVMe и panic.
  • Отложенное обновление ядра до выпуска стабильной версии с исправлением.

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

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


После обновления проверьте:

  • Версию ядра: uname -r.
  • Наличие commit'ов в дереве ядра: git log --oneline | grep ef248d5de4469fb6bbaf8dbe0c4c47800080d648.
  • Работа NVMe с multipath: multipath -ll и тестовые операции чтения/записи.
  • Отсутствие ошибок в журналах ядра после обновления.

Если commit'ы не присутствуют, обновите пакет ядра или пересоберите ядро с патчем.

Вывод​


CVE-2026-89972 — критическая уязвимость use-after-free в ядре Linux, затрагивающая модуль NVMe. Проблема возникает из-за отсутствия синхронизации SRCU перед освобождением структуры namespace в ошибочном пути.

Исправление доступно в stable-ветках ядра. Обновление до версии с соответствующим commit'ом устраняет риск. Для систем без multipath NVMe практическая значимость уязвимости может быть ниже, но это не подтверждено источниками.

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


  1. NVD — CVE-2026-89972
  2. FIRST EPSS — CVE-2026-89972
  3. nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
  4. nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
  5. nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
  6. CVEs — The Linux Kernel documentation

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


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