CVE: CVE-2026-89969
Продукт: Linux Kernel
Дата публикации: 16.09.2026
Критичность: CRITICAL
CVSS: 9.8 (3.1)
EPSS: 0,69%; процентиль 51,48%
CISA KEV: нет подтверждения в каталоге CISA KEV
Краткое описание
В драйвере
nvmet-tcp ядра Linux обнаружена критическая уязвимость, позволяющая удалённому неаутентифицированному атакующему выполнить запись за пределы выделенного буфера. Ошибка возникает при обработке PDU, если вычисленная длина полезной нагрузки превышает размер фиксированного буфера queue->pdu.Исправление добавляет проверку длины перед чтением данных. Статья разбирает механику атаки, затронутые версии и способы проверки исправления.
Основные характеристики
Уязвимость позволяет удалённому атакующему повредить память ядра, отправив специально сформированный пакет NVMe over TCP. Это может привести к отказу в обслуживании или повышению привилегий.
- Тип ошибки: Out-of-bounds write (запись за пределы буфера).
- 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. Это означает высокую вероятность успешной атаки из сети без аутентификации.
- EPSS: 0,70% (процентиль 51,48%). Показатель отражает вероятность эксплуатации в ближайшие 30 дней.
- Условия атаки: Атакующий должен иметь сетевой доступ к порту NVMe over TCP и возможность отправлять пакеты ICReq.
- Эксплуатация: Публичные эксплойты не подтверждены, но техническое описание позволяет легко составить PoC.
Какие продукты и версии затронуты
Уязвимость затрагивает все версии ядра Linux, содержащие драйвер
nvmet-tcp (NVMe over TCP target driver), начиная с версии, в которой он был добавлен (commit 872d26a391da).Исправление внесено в следующие ветки стабильных версий ядра Linux:
- 6.12.x
- 6.11.x
- 6.10.x
- 6.9.x
- 6.8.x
- 6.6.x
- 6.1.x
Точные номера версий, содержащих патч, зависят от дистрибутива. Рекомендуется проверить наличие исправления в официальных репозиториях вашего дистрибутива.
Причина уязвимости
Причина уязвимости заключается в отсутствии проверки длины данных перед их чтением в фиксированный буфер.
Функция
nvmet_tcp_try_recv_pdu() читает заголовок PDU в буфер queue->pdu размером 128 байт. Затем она вычисляет оставшуюся длину полезной нагрузки по формуле queue->left = hdr->hlen - queue->offset + hdgst. Это значение используется для чтения дополнительных байтов в &queue->pdu + queue->offset.Проблема в том, что результат вычисления
queue->left никогда не сравнивается с размером буфера sizeof(queue->pdu). Если атакующий отправляет пакет ICReq с заголовком, длина которого (hlen) превышает допустимые 128 байт, но проходит проверку hlen == nvmet_tcp_pdu_size(), вычисленная длина может превысить размер буфера. В результате данные записываются за пределы выделенной области памяти.Как работает атака
Атака эксплуатирует логику обработки пакетов ICReq (Initial Connection Request) в протоколе NVMe over TCP.
- Атакующий устанавливает TCP-соединение с целевым хостом, работающим как NVMe target.
- Отправляется первый пакет ICReq с корректным заголовком. При этом может быть согласован header digest (hdgst = 4).
- Отправляется второй пакет ICReq. Его заголовок проходит проверку
hlen == nvmet_tcp_pdu_size(), но из-за смещенияoffsetи значенияhdgstвычисленная длинаqueue->leftстановится равной 124 байта.
- Функция пытается прочитать 124 байта в буфер, начиная с
queue->offset(8 байт). Это приводит к записи 4 байтов за пределы 128-байтного буфераqueue->pdu.
- Записываемые данные контролируются атакующим, так как ICReq не содержит digest. Повреждаются поля
queue->hdr_digestиqueue->data_digest, что может привести к непредсказуемому поведению ядра.
Условия успешной эксплуатации
Для успешной эксплуатации уязвимости атакующему необходимо:
- Иметь сетевой доступ к целевому хосту, работающему как NVMe over TCP target.
- Знать IP-адрес и порт целевого хоста.
- Иметь возможность отправлять TCP-пакеты с заголовками NVMe over TCP.
- Целевой хост должен использовать ядро Linux с уязвимым драйвером
nvmet-tcp.
Аутентификация не требуется, так как уязвимость находится на этапе установления соединения, до аутентификации.
Возможный сценарий атаки
Атакующий сканирует сеть в поисках хостов, открытых на порту NVMe over TCP. Обнаружив целевой хост, он отправляет специально сформированный пакет ICReq.
Пакет содержит заголовок, который проходит проверку длины, но приводит к вычислению
queue->left = 124. При чтении данных в буфер происходит запись 4 байтов за его пределы. Это повреждает память ядра, что может привести к падению ядра (panic) или выполнению кода с привилегиями ядра.Атакующий может повторять атаку, чтобы повысить вероятность успешного выполнения кода.
Есть ли публичный эксплойт
На момент публикации CVE-2026-89969 публичные эксплойты не подтверждены. Однако техническое описание уязвимости достаточно подробно, чтобы атакующие могли разработать PoC (Proof of Concept).
Отсутствие публичного эксплойта не означает, что уязвимость не эксплуатируется в реальных атаках. Рекомендуется считать её активно эксплуатируемой, учитывая критический уровень опасности и простоту атаки.
Признаки эксплуатации
Специфичные индикаторы компрометации (IOC) для CVE-2026-89969 не опубликованы. Однако можно использовать следующие неспецифичные признаки:
- Необычная активность на порту NVMe over TCP из неизвестных IP-адресов.
- Падения ядра (kernel panic) или ошибки в логах, связанные с драйвером
nvmet-tcp.
- Аномальные записи в
/var/log/kern.logилиdmesgс сообщениями об out-of-bounds доступе или segfault в контекстеnvmet-tcp.
- Необычные сетевые соединения с портом NVMe over TCP, особенно если они происходят из стран или IP-адресов, не связанных с вашей инфраструктурой.
Как обнаружить атаку
Для обнаружения атаки можно использовать следующие методы:
- Мониторинг сетевой активности на порту NVMe over TCP с помощью IDS/IPS (например, Suricata, Snort).
- Анализ логов ядра на наличие ошибок, связанных с драйвером
nvmet-tcp.
- Использование eBPF-инструментов для отслеживания вызовов
recvв контекстеnvmet-tcpи проверки аномальных размеров данных.
- Регулярная проверка обновлений ядра и наличие патча для CVE-2026-89969.
Как проверить свою версию
Для проверки версии ядра и наличия исправления используйте следующие команды:
Bash:
uname -r
uname -a
cat /proc/version
Затем сравните версию ядра с официальными списками исправленных версий вашего дистрибутива. Если вы используете дистрибутив, который предоставляет обновления ядра, проверьте наличие пакета с исправлением в репозитории. Например, для Debian:
Bash:
apt list --upgradable | grep linux-image
Для Ubuntu:
Bash:
apt list --upgradable | grep linux-image
Для RHEL/CentOS:
Bash:
dnf list --upgradable | grep kernel
Если обновление доступно, установите его.
Исправление
Единственный надёжный способ устранения уязвимости — обновление ядра Linux до версии, содержащей патч.
- Для Debian/Ubuntu:
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
- Для RHEL/CentOS:
sudo dnf update kernel
- Для Arch Linux: `sudo pacman -Syu linux
После обновления перезагрузите систему, чтобы загрузить новое ядро:
Bash:
sudo reboot
Убедитесь, что после перезагрузки используется новое ядро:
Bash:
uname -r
Если обновление ядра невозможно в краткосрочной перспективе, рассмотрите временные меры, описанные ниже.
Временные меры защиты
Временные меры защиты, если обновление ядра невозможно:
- Ограничьте сетевой доступ к порту NVMe over TCP с помощью файрвола. Разрешите доступ только из доверенных IP-адресов.
- Отключите драйвер
nvmet-tcp, если он не используется:sudo modprobe -r nvmet-tcp(если он загружен как модуль).
- Используйте сетевую сегментацию для изоляции хостов, работающих как NVMe targets, от внешней сети.
- Включите мониторинг и алертинг на аномальную активность на порту NVMe over TCP.
Эти меры снижают вероятность атаки, но не устраняют уязвимость полностью.
Как проверить устранение уязвимости
Для проверки успешного исправления:
- Убедитесь, что установлена последняя версия ядра:
uname -r.
- Проверьте наличие патча в исходном коде ядра (если вы компилируете ядро самостоятельно):
git log --oneline | grep 14cc5a7e77731497d5bea70f3bb05df7eda982e4.
- Проведите функциональное тестирование NVMe over TCP, чтобы убедиться, что соединение устанавливается корректно.
- Проверьте логи ядра на наличие ошибок после обновления.
Если все шаги выполнены успешно, уязвимость CVE-2026-89969 устранена.
Вывод
CVE-2026-89969 — критическая уязвимость в драйвере NVMe over TCP ядра Linux, позволяющая удалённому атакующему повредить память ядра. Обновление ядра до исправленной версии является обязательным.
Если обновление невозможно, ограничьте сетевой доступ к порту NVMe over TCP и включите мониторинг. Не откладывайте обновление, так как уязвимость легко эксплуатируется и может привести к полной компрометации системы.
Официальные источники
- NVD — CVE-2026-89969
- FIRST EPSS — CVE-2026-89969
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
- nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU - kernel/git/stable/linux.git - Linux kernel stable tree
История обновлений статьи
- 19.09.2026 — Опубликована первая версия материала.
