Podatność w sterowniku iSER jądra Linux (IB/isert) umożliwia zdalnemu atakującemu bez uwierzytelnienia wywołanie awarii systemu docelowego poprzez przesłanie zbyt krótkiego pakietu PDU fazy logowania. Podatność jest krytyczna, ponieważ faza logowania poprzedza uwierzytelnianie iSCSI, co oznacza brak jakiegokolwiek progu wejścia dla atakującego.
▸ Pokaż oryginał (EN)
In the Linux kernel, the following vulnerability has been resolved: IB/isert: Reject login PDUs shorter than ISER_HEADERS_LEN In drivers/infiniband/ulp/isert/ib_isert.c, isert_login_recv_done() computes the login request payload length as wc->byte_len minus ISER_HEADERS_LEN with no lower bound, and login_req_len is a signed int. A remote iSER initiator can post a login Send work request carrying fewer than ISER_HEADERS_LEN (76) bytes, so the subtraction underflows and login_req_len becomes negative. isert_rx_login_req() then reads that negative length back into a signed int, takes size = min(rx_buflen, MAX_KEY_VALUE_PAIRS), and because the min() is signed it keeps the negative value; the value is then passed as the memcpy() length and sign-extended to a multi-gigabyte size_t. The copy into the 8192-byte login->req_buf runs far out of bounds and faults, crashing the target node. The login phase precedes iSCSI authentication, so no credentials are required to reach this path. Reject any login PDU shorter than ISER_HEADERS_LEN before the subtraction, mirroring the existing early return on a failed work completion, so login_req_len can never go negative. The upper bound was already safe: a posted login buffer cannot deliver more than ISER_RX_PAYLOAD_SIZE, so the difference stays at or below MAX_KEY_VALUE_PAIRS and the existing min() clamps it; only the missing lower bound needs to be added.
Funkcja isert_login_recv_done() oblicza długość payload'u żądania logowania jako różnicę wc->byte_len minus ISER_HEADERS_LEN (76 bajtów) bez sprawdzania dolnej granicy, a wynik przechowywany jest w zmiennej typu signed int. Zdalny inicjator iSER może wysłać żądanie logowania (Send work request) zawierające mniej niż 76 bajtów, co powoduje arytmetyczne przepełnienie w dół (underflow) i uzyskanie ujemnej wartości login_req_len. Funkcja isert_rx_login_req() następnie przekazuje tę ujemną wartość do min(), która przy porównaniu typów ze znakiem zachowuje wartość ujemną, a ta z kolei jest przekazywana jako argument długości do memcpy(). Przy rozszerzeniu znaku do size_t wartość ujemna staje się wielogigabajtową liczbą bez znaku, co powoduje zapis daleko poza granicami 8192-bajtowego bufora login->req_buf i skutkuje awarią (fault) węzła docelowego.
Atakujący bez żadnych poświadczeń może zdalnie wywołać awarię (crash) węzła docelowego iSCSI/iSER, powodując odmowę dostępu do usługi (DoS). Ze względu na niekontrolowane przepełnienie bufora nie można wykluczyć prób dalszego wykorzystania do wykonania kodu (RCE).
Należy zastosować patche dostępne w referencjach projektu kernel.org dla odpowiednich gałęzi stabilnych jądra Linux. Poprawka odrzuca każde żądanie logowania PDU krótsze niż ISER_HEADERS_LEN przed wykonaniem odejmowania, eliminując możliwość uzyskania ujemnej wartości login_req_len. Do czasu wdrożenia patcha zaleca się ograniczenie dostępu sieciowego do portów iSER/iSCSI wyłącznie do zaufanych hostów za pomocą firewall'a.
Jądro Linux z włączonym sterownikiem IB/isert (drivers/infiniband/ulp/isert/ib_isert.c) — wersje wskazane w referencjach producenta (patche dostępne dla wielu gałęzi stabilnych jądra).
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H