Ad

CVE-2026-89482

CRITICAL CVSS 3.1: 9,8 EPSS 0.63%
Обновлено 14 сентября 2026
Ubuntu
Параметр Значение
CVSS 9,8 (CRITICAL)
Поставщик Ubuntu
Публичный эксплойт Нет

В ядре Linux устранена следующая уязвимость: nvme-tcp: не принимать C2HData на основе только blk_rq_payload_bytes() Зафиксируйте 25e5cb780e62 («nvme-tcp: исправлен возможный сбой в write_zeroes обработка") установил, что blk_rq_payload_bytes() нельзя читать без предварительной проверки blk_rq_nr_phys_segments() и записал результат в nvme_tcp_setup_cmd_pdu() как req->data_len. Принимающая сторона оставили как было. Они различаются для REQ_OP_WRITE_ZEROES, у которого нет физических сегментов. но ненулевой blk_rq_bytes(), поэтому установка оставляет req->iter нетронутым в то время как шлюз приема пропускает C2HData и nvme_tcp_recv_data() копирует во все, что оставила там предыдущая команда для этого тега.

Частная область драйвера обнуляется только тогда, когда выделен набор тегов. Воспроизводится с помощью тестовой цели, которая оставляет в теге остаточный итератор. а затем отправляет C2HData для команды WRITE_ZEROES в том же теге: ОШИБКА: KASAN: доступ к дикой памяти в _copy_to_iter+0x642/0x1330. Запись размера 512 по адресу ffe728c2175dfa81 с помощью задачи kworker/0:1H/103.

ЦП: 0 UID: 0 PID: 103 Связь: kworker/0:1H Не испорчено 7.2.0-rc5-NVMETCP-gf5098b6bae76 #1 PREEMPT(ленивый) Имя оборудования: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, исправление Arch_caps, 1996), BIOS 1.16.3-debian-1.16.3-2 01.04.2014 Рабочая очередь: nvme_tcp_wq nvme_tcp_io_work Отслеживание вызова: <ЗАДАЧА> dump_stack_lvl+0x53/0x70 kasan_report+0xce/0x100 ? _copy_to_iter+0x642/0x1330 kasan_check_range+0x105/0x1b0 __asan_memcpy+0x3c/0x60 _copy_to_iter+0x642/0x1330 ? __pfx_sock_has_perm+0x10/0x10 ? рабочий_поток+0x45b/0xd10 ? __pfx__copy_to_iter+0x10/0x10 ? _raw_spin_lock_bh+0x83/0xe0 ? __pfx__raw_spin_lock_bh+0x10/0x10 __skb_datagram_iter+0xf3/0x820 ? __pfx_simple_copy_to_iter+0x10/0x10 ? __asan_memcpy+0x3c/0x60 ? skb_copy_bits+0x58d/0x830 skb_copy_datagram_iter+0x37/0x120 nvme_tcp_recv_skb+0xa07/0x4320 ? __pfx_nvme_tcp_recv_skb+0x10/0x10 __tcp_read_sock+0x1ab/0x810 ? __pfx_nvme_tcp_recv_skb+0x10/0x10 ? __pfx_lock_sock_nested+0x10/0x10 ? __pfx___tcp_read_sock+0x10/0x10 nvme_tcp_try_recv+0x152/0x1e0 ? __pfx_nvme_tcp_try_recv+0x10/0x10 ? __pfx_mutex_unlock+0x10/0x10 nvme_tcp_io_work+0x1e4/0x6c0 ? __расписание+0x181a/0x49f0 ? __pfx_nvme_tcp_io_work+0x10/0x10 процесс_one_work+0x633/0x1030 Сохраните тест blk_rq_payload_bytes() и добавьте к нему req->data_len. старый тест — это то, что отклоняет C2HData, называющий тег, которого больше нет в полет, потому что blk_update_request() обнуляет rq->__data_len на завершение; req->data_len и req->curr_bio являются частными для драйвера и пережить завершение, поэтому они не могут его заменить. Установка инициализируется итератор только тогда, когда установлены оба req->curr_bio и req->data_len, поэтому ворота теперь тестируют тех же двоих.

Показать оригинальное описание (EN)

In the Linux kernel, the following vulnerability has been resolved: nvme-tcp: do not accept C2HData based on blk_rq_payload_bytes() alone Commit 25e5cb780e62 ("nvme-tcp: fix possible crash in write_zeroes processing") established that blk_rq_payload_bytes() must not be read without first checking blk_rq_nr_phys_segments(), and recorded the result in nvme_tcp_setup_cmd_pdu() as req->data_len. The receive side was left as it was. The two differ for REQ_OP_WRITE_ZEROES, which has no physical segments but a non-zero blk_rq_bytes(), so setup leaves req->iter untouched while the receive gate lets a C2HData through and nvme_tcp_recv_data() copies into whatever the previous command on that tag left there. The driver-private area is zeroed only when the tag set is allocated. Reproduced with a test target that leaves a residual iterator on a tag and then sends a C2HData for a WRITE_ZEROES command on the same tag: BUG: KASAN: wild-memory-access in _copy_to_iter+0x642/0x1330 Write of size 512 at addr ffe728c2175dfa81 by task kworker/0:1H/103 CPU: 0 UID: 0 PID: 103 Comm: kworker/0:1H Not tainted 7.2.0-rc5-NVMETCP-gf5098b6bae76 #1 PREEMPT(lazy) Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 Workqueue: nvme_tcp_wq nvme_tcp_io_work Call Trace: <TASK> dump_stack_lvl+0x53/0x70 kasan_report+0xce/0x100 ? _copy_to_iter+0x642/0x1330 kasan_check_range+0x105/0x1b0 __asan_memcpy+0x3c/0x60 _copy_to_iter+0x642/0x1330 ? __pfx_sock_has_perm+0x10/0x10 ? worker_thread+0x45b/0xd10 ? __pfx__copy_to_iter+0x10/0x10 ? _raw_spin_lock_bh+0x83/0xe0 ? __pfx__raw_spin_lock_bh+0x10/0x10 __skb_datagram_iter+0xf3/0x820 ? __pfx_simple_copy_to_iter+0x10/0x10 ? __asan_memcpy+0x3c/0x60 ? skb_copy_bits+0x58d/0x830 skb_copy_datagram_iter+0x37/0x120 nvme_tcp_recv_skb+0xa07/0x4320 ? __pfx_nvme_tcp_recv_skb+0x10/0x10 __tcp_read_sock+0x1ab/0x810 ? __pfx_nvme_tcp_recv_skb+0x10/0x10 ? __pfx_lock_sock_nested+0x10/0x10 ? __pfx___tcp_read_sock+0x10/0x10 nvme_tcp_try_recv+0x152/0x1e0 ? __pfx_nvme_tcp_try_recv+0x10/0x10 ? __pfx_mutex_unlock+0x10/0x10 nvme_tcp_io_work+0x1e4/0x6c0 ? __schedule+0x181a/0x49f0 ? __pfx_nvme_tcp_io_work+0x10/0x10 process_one_work+0x633/0x1030 Keep the blk_rq_payload_bytes() test and add req->data_len to it. The old test is what rejects a C2HData naming a tag that is no longer in flight, because blk_update_request() zeroes rq->__data_len on completion; req->data_len and req->curr_bio are driver-private and survive completion, so they cannot stand in for it. Setup initialises the iterator only when both req->curr_bio and req->data_len are set, so the gate now tests the same two.

Характеристики атаки

Способ атаки
По сети
Атака возможна удалённо
Сложность
Низкая
Легко эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Высокое
Полная утечка данных
Целостность
Высокое
Полная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1