Katalog CVE

CVE-2026-89973

WysokieCVSS 8.2
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Streszczenie

W jądrze Linux w funkcji nvme_tcp_handle_c2h_data() brakowało sprawdzenia kierunku danych dla PDU typu C2HData. Złośliwy lub błędnie działający kontroler NVMe/TCP mógł odpowiedzieć na polecenie zapisu ramką C2HData, co prowadziło do ostrzeżenia jądra (WARN_ON_ONCE) i zresetowania kontrolera. Nie dochodzi do uszkodzenia pamięci, ponieważ żadne dane nie są kopiowane.

Ocena ryzyka

Kontroler może wywołać ostrzeżenie jądra na żądanie, co przy uruchomieniu z parametrem panic_on_warn powoduje awarię hosta (odmowa usługi). W środowiskach produkcyjnych może to prowadzić do nieplanowanych restartów serwerów.

Rekomendacja

Zaktualizuj jądro Linux do wersji zawierającej poprawkę odrzucającą PDU C2HData dla poleceń innych niż odczyt. Do czasu aktualizacji rozważ wyłączenie opcji panic_on_warn na hostach korzystających z NVMe/TCP.

Inne podatności w Linux kernel

Zobacz wszystkie
Oryginalny opis (angielski, źródło NVD)

In the Linux kernel, the following vulnerability has been resolved: nvme-tcp: check the data direction of a C2HData PDU nvme_tcp_handle_c2h_data() finds the request by command id and checks that it has a payload, but it does not check that the command asked for data to be read. A controller that answers a write command with C2HData therefore reaches nvme_tcp_recv_data(), where _copy_to_iter() hits WARN_ON_ONCE(i->data_source) and returns 0. The receive path turns that into -EFAULT and resets the controller. No data is copied, so this is not memory corruption. What a controller gets is a kernel warning it can raise at will, which is fatal on a host booted with panic_on_warn. The send path already knows the direction - it consults rq_data_dir() when it builds a command - and nvme_tcp_handle_r2t() checks the length and the offset of the request it names. The C2HData path does not check the direction at all. Reject a C2HData PDU whose command is not a read. Rejecting it fails the command and resets the controller, as the neighbouring check in this function does; what goes away is the warning. [ 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

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS