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:
- ef248d5de4469fb6bbaf8dbe0c4c47800080d648
- d663944dbad81bb0e3635d7090db4713e6300858
- 76023560d60f10b4f808941163aa2975f1631683
Отсутствие сведений в источниках не означает, что эксплойт не существует. Проверка актуальных дистрибутивных пакетов и 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:
- ef248d5de4469fb6bbaf8dbe0c4c47800080d648 — mainline.
- d663944dbad81bb0e3635d7090db4713e6300858 — stable 6.12.x.
- 76023560d60f10b4f808941163aa2975f1631683 — stable 7.6.x.
Обновите пакет ядра до версии, содержащей соответствующий 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 практическая значимость уязвимости может быть ниже, но это не подтверждено источниками.
Официальные источники
- NVD — CVE-2026-89972
- FIRST EPSS — CVE-2026-89972
- nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
- nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
- nvme: add missing SRCU grace period in error path - kernel/git/stable/linux.git - Linux kernel stable tree
- CVEs — The Linux Kernel documentation
История обновлений статьи
- 21.09.2026 — Опубликована первая версия материала.
