CVE-2026-97433 в Linux Kernel: ошибка размеров FDP descriptor в драйвере NVMe

CVE: CVE-2026-97433
Продукт: Linux Kernel
Дата публикации: 24.09.2026
Критичность: HIGH
CVSS: 8.2 (3.1)
EPSS: 0,32%; процентиль 22,19%
CISA KEV: нет подтверждения в каталоге CISA KEV

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


В Linux Kernel уязвимость CVE-2026-97433 связана с обработкой FDP configuration log в драйвере NVMe хоста. В функции nvme_query_fdp_granularity невалидация размера дескриптора могла приводить к бесконечной итерации или чтению за пределами буфера. Исправление добавляет проверку dsze до смещения указателя.

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


Ошибка находится в драйвере NVMe хоста Linux Kernel и затрагивает обработку FDP configuration log. Неправильный размер дескриптора не проверялся до изменения позиции обхода, из-за чего цикл мог не продвигаться или читать память вне ожидаемого буфера.

  • Компонент: драйвер NVMe хоста, файл drivers/nvme/host/core.c.
  • Функция: nvme_query_fdp_granularity().
  • CVSS 3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:H, оценка 8.2, severity HIGH.
  • EPSS: 0,319%, процентиль 22,19%.
  • Статус в NVD: Received.
  • Исправление: коммит 0ef4daa6534a510d61ea67c8ad9bb5097b0dd5f8 и stable backport 97efd7a41aac08b43ea2337c5913a2bc75484f9f.

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


Затронут Linux Kernel с компонентом драйвера NVMe хоста.

Изменённый файл:

  • drivers/nvme/host/core.c

Функция:

  • nvme_query_fdp_granularity()

Исправление внесено в стабильное дерево ядра коммитом 0ef4daa6534a510d61ea67c8ad9bb5097b0dd5f8 и в ветку stable коммитом 97efd7a41aac08b43ea2337c5913a2bc75484f9f.

В предоставленных источниках нет списка конкретных версий ядра, которые содержат ошибку или уже исправлены. Версию ядра нужно проверять локально и сопоставлять с веткой stable или дистрибутивным пакетом ядра.

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


Ошибка возникает в цикле обхода FDP configuration descriptors внутри функции nvme_query_fdp_granularity.

Прежде исправления код выполнял:

C:
log += le16_to_cpu(desc->dsze);
desc = log;
if (log >= end) {
    dev_warn(ctrl->device,
        "FDP invalid config descriptor list\n");
    ret = 0;
    goto out;
}

После исправления код проверяет размер до сдвига указателя:

C:
u16 dsze = le16_to_cpu(desc->dsze);

if (!dsze || log + dsze > end) {
    dev_warn(ctrl->device,
        "FDP invalid config descriptor at index %d\n", i);
    ret = 0;
    goto out;
}
log += dsze;
desc = log;

Нарушенная проверка — отсутствие валидации dsze == 0 и отсутствия проверки, что log + dsze > end. Если размер равен нулю, указатель не смещается. Если размер указывает за пределы лога, следующий дескриптор читается вне ожидаемого буфера.

Исправление добавляет проверку до изменения позиции обхода.

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


Цель атаки — повлиять на ядро через драйвер NVMe при обработке FDP configuration log.

Путь данных:

  • NVMe устройство предоставляет лог FDP configurations.
  • Ядро вызывает nvme_query_fdp_granularity() для анализа этого лога.
  • Код обходит дескрипторы по указателю log до границы end.
  • Размер каждого дескриптора берётся из поля desc->dsze.
  • Если размер невалиден, указатель смещается за пределы буфера или остаётся на месте.

До исправления:

  • при dsze == 0 указатель не двигался; цикл мог продолжать обход без продвижения по логу;
  • при большом значении dsze следующий дескриптор читался за пределами конца лога.

После исправления:

  • размер сохраняется в локальную переменную u16 dsze;
  • проверяется условие !dsze || log + dsze > end;
  • при нарушении условия функция завершает обработку с предупреждением и кодом возврата 0.

В предоставленных источниках нет описания способа доставки невалидного лога от устройства или пользователя. Механика ограничена внутренним обработчиком драйвера NVMe.

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


Для анализа ошибки нужны:

  • система с ядром Linux, использующим драйвер NVMe хоста;
  • наличие в ядре кода функции nvme_query_fdp_granularity из файла drivers/nvme/host/core.c;
  • доступ к обработке FDP configuration log внутри драйвера NVMe.

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

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

Bash:
uname -r

или:

Bash:
uname -a

и:

Bash:
cat /proc/version

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


Сценарий ограничен техническим описанием ошибки.

  • NVMe устройство или внутренний механизм ядра вызывает обработку FDP configuration log.
  • В логе присутствует дескриптор с невалидным размером dsze.
  • Код до исправления не проверял размер перед смещением указателя.
  • Указатель мог остаться на месте при нулевом размере или перейти за границу буфера.
  • Это могло привести к бесконечной итерации или чтению памяти вне ожидаемого буфера.

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

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


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

Источники содержат:

  • описание ошибки;
  • коммит исправления в стабильном дереве ядра;
  • дифф изменения в drivers/nvme/host/core.c;
  • метрики CVSS и EPSS.

Отсутствие публичного эксплойта в источниках не означает, что эксплуатация невозможна. Оно означает только, что в предоставленном пакете доказательств нет отдельного PoC, рабочего кода или подтверждённого случая эксплуатации.

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


Специфичных IOC для CVE-2026-97433 в источниках нет.

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

  • неожиданные сообщения FDP invalid config descriptor или FDP invalid config descriptor list в ядре;
  • аномальные задержки или зависания при инициализации NVMe устройств;
  • нехарактерная активность драйвера NVMe в журналах системы;
  • изменения в файле drivers/nvme/host/core.c относительно стабильной ветки.

Эти признаки не являются подтверждёнными признаками эксплуатации конкретной уязвимости. Они подходят только для общей диагностики проблем с NVMe.

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


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

  • проверку версии ядра и наличие исправленного кода в файле drivers/nvme/host/core.c;
  • поиск строки предупреждения FDP invalid config descriptor at index %d в логах ядра;
  • сравнение локального файла с веткой stable или дистрибутивным пакетом ядра.

Команды проверки:

Bash:
uname -r

Bash:
cat /proc/version

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

Bash:
grep "FDP invalid config descriptor" /var/log/messages

или:

Bash:
dmesg | grep "FDP invalid config descriptor"

Эти команды не являются подтверждёнными средствами обнаружения эксплуатации. Они помогают проверить наличие сообщений, связанных с обработкой FDP log.

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


Проверка версии ядра:

Bash:
uname -r

Полная информация о ядре:

Bash:
uname -a

Альтернативный способ:

Bash:
cat /proc/version

Для проверки, применён ли коммит исправления, нужно сравнить локальный файл drivers/nvme/host/core.c с веткой stable или дистрибутивным пакетом ядра.

В предоставленных источниках нет команды для автоматической проверки наличия конкретного коммита. Можно использовать:

Bash:
git log --oneline | grep 0ef4daa6534a510d61ea67c8ad9bb5097b0dd5f8

в исходном дереве ядра, если оно доступно.

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


Исправление состоит из коммита в стабильном дереве ядра:


Изменённый файл:

Код:
drivers/nvme/host/core.c

Исправление добавляет проверку размера дескриптора до смещения указателя.

Для применения исправления нужно обновить ядро до версии, содержащей коммит 97efd7a41aac08b43ea2337c5913a2bc75484f9f или более новый стабильный релиз.

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

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


В предоставленных источниках нет временных мер защиты.

Общие защитные выводы:

  • ограничить доступ к NVMe устройствам, если это возможно в конкретной конфигурации;
  • отключать функции FDP, если они не используются; однако в источниках нет подтверждения, что отключение FDP полностью исключает обработку лога драйвером;
  • обновить ядро до версии с исправлением как основной способ.

Эти меры не являются подтверждёнными временными защитами для CVE-2026-97433. Они основаны на общем понимании области обработки NVMe.

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


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

  • версию ядра;
  • наличие исправленного кода в drivers/nvme/host/core.c;
  • отсутствие предупреждений FDP invalid config descriptor list и появление нового сообщения FDP invalid config descriptor at index %d при невалидных данных, если они присутствуют.

Команды:

Bash:
uname -r

Bash:
grep -A 5 "nvme_query_fdp_granularity" /lib/modules/$(uname -r)/kernel/drivers/nvme/host/core.ko

или проверка исходного файла, если он доступен:

Bash:
grep -n "FDP invalid config descriptor at index" drivers/nvme/host/core.c

Если строка FDP invalid config descriptor at index присутствует, исправление применено.

Вывод​


CVE-2026-97433 — ошибка в драйвере NVMe Linux Kernel, связанная с невалидацией размера FDP configuration descriptors. Без проверки размер мог быть равен нулю или указывать за пределы лога, что приводило к бесконечной итерации или чтению вне буфера.

Исправление добавляет проверку до смещения указателя. Для защиты нужно обновить ядро до версии с коммитом 97efd7a41aac08b43ea2337c5913a2bc75484f9f или более новым стабильным релизом.

В источниках нет подтверждённой эксплуатации, публичного эксплойта и списка затронутых версий. Проверка версии ядра и наличие исправленного кода в drivers/nvme/host/core.c — основные способы контроля.

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


  1. NVD — CVE-2026-97433
  2. FIRST EPSS — CVE-2026-97433
  3. nvme: validate FDP configuration descriptor sizes - kernel/git/stable/linux.git - Linux kernel stable tree
  4. nvme: validate FDP configuration descriptor sizes - kernel/git/stable/linux.git - Linux kernel stable tree
  5. CVEs — The Linux Kernel documentation

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


  • 25.09.2026 — Опубликована первая версия материала.
  • 26.09.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
 
Последнее редактирование:
Назад
Верх Низ