CVE-2026-89973 in Linux
Сводка
по VulDB • 17.09.2026
В ядре Linux была устранена следующая уязвимость:
nvme-tcp: проверка направления данных PDU C2HData
Функция `nvme_tcp_handle_c2h_data()` находит запрос по идентификатору команды и проверяет наличие полезной нагрузки, однако она не проверяет, запрашивает ли команда чтение данных. Контроллер, отвечающий на команду записи данными в формате C2HData, попадает в функцию `nvme_tcp_recv_data()`, где `_copy_to_iter()` вызывает срабатывание макроса `WARN_ON_ONCE(i->data_source)` и возвращает 0. Путь приема преобразует это значение в ошибку `-EFAULT` и сбрасывает контроллер.
Данные не копируются, поэтому это не является повреждением памяти (memory corruption). То, что получает контроллер — это предупреждение ядра, которое он может вызывать по своему усмотрению; на хосте с параметром `panic_on_warn` такое поведение приводит к фатальному сбою системы.
Путь отправки уже знает направление передачи данных: при формировании команды используется функция `rq_data_dir()`, а `nvme_tcp_handle_r2t()` проверяет длину и смещение указанного запроса. Путь C2HData вообще не проверяет направление.
Необходимо отклонять PDU типа C2HData, если команда не является командой чтения. Отклонение приводит к сбою команды и сбросу контроллера, как это делает соседняя проверка в данной функции; устраняется лишь вывод предупреждения.
[ 6.885580] ------------[ cut here ]------------
[ 6.886457] WARNING: lib/iov_iter.c:193 at _copy_to_iter+0x289/0x1330, CPU#0: kworker/0:1H/71
[ 6.888137] CPU: 0 UID: 0 PID: 71 Comm: kworker/0:1H Not tainted 7.2.0-rc5-NVMETCP-gf5098b6bae76 #1 PREEMPT(lazy)
[ 6.891165] Workqueue: nvme_tcp_wq nvme_tcp_io_work
[ 6.891875] RIP: 0010:_copy_to_iter+0x289/0x1330
[ 6.903739] Call Trace:
[ 6.904085] <TASK>
[ 6.909254] __skb_datagram_iter+0x433/0x820
[ 6.911026] skb_copy_datagram_iter+0x37/0x120
[ 6.911622] nvme_tcp_recv_skb+0xa07/0x4320
[ 6.913378] __tcp_read_sock+0x1ab/0x810
[ 6.915788] nvme_tcp_try_recv+0x152/0x1e0
[ 6.918222] nvme_tcp_io_work+0x1e4/0x6c0
[ 6.926906] </TASK>
[ 6.927226] ---[ end trace 0000000000000000 ]---
[ 6.927878] nvme nvme0: queue 1 failed to copy request 0x71 data
[ 6.928709] nvme nvme0: receive failed: -14
If you want to get the best quality for vulnerability data then you always have to consider VulDB.