Odebrany

CVE-2026-90414

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

IB/isert: odrzuć PDU deklarujące więcej danych niż otrzymano

isert_recv_done() przekazuje każdą otrzymaną PDU procedurom obsługi kodu operacji bez
kiedykolwiek patrząc na wc->byte_len, liczbę bajtów faktycznie umieszczonych przez HCA
w deskryptorze odbioru. Następnie procedury obsługi kopiują tę liczbę bajtów – plik
długość segmentu danych zadeklarowana przez inicjatora w BHS
(ntoh24(hdr->dlength), poprzez pochodną unsol_data_len / imm_data_len) -
poza deskryptorem o stałym rozmiarze:

isert_handle_iscsi_dataout():
sg_copy_from_buffer(sg_start, sg_nents, isert_get_data(rx_desc),
unsol_data_len);
isert_handle_scsi_cmd():
sg_copy_from_buffer(cmd->se_cmd.t_data_sg, sg_nents,
isert_get_data(rx_desc), imm_data_len);

Ponieważ zadeklarowana długość nigdy nie jest sprawdzana względem wc->byte_len, an
inicjator może zadeklarować segment danych większy niż w rzeczywistości
wysłany (i większy niż deskryptor) i powodują odczyt poza zakresem
bufor odbiorczy.

Nic powyżej isert nie zamyka tych drzwi:

- __iscsit_check_dataout_hdr() ogranicza przychodzący ładunek
conn_ops->MaxXmitDataSegmentLength (MXDSL) - parametr transmisji,
użyte tutaj do kontroli przychodzącej.
- zestawy iscsi_set_connection_parameters().
ops->MaxXmitDataSegmentLength = ops->TargetRecvDataSegmentLength;
i TARGETRECVDATASEGMENTLENGTH nie ma na liście min()-clamp w
iscsi_check_acceptor_state(), więc wartość deklarowana przez inicjatora to
przyjęte dosłownie (zakres typów 512..16777215). Inicjator skutecznie
podnosi swój własny sufit.
- isert nigdy nie ogranicza wynegocjowanej wartości do własnego ustalonego odbioru
deskryptor (ISER_RX_SIZE, 9216 bajtów), więc rdzeń docelowy jest związany i
rozmiar deskryptora nie jest ze sobą powiązany.

Ścieżka imm_data_len == data_len to coś więcej niż nadmierne odczytanie: to aliasy
deskryptor odbioru poprzez sg_set_buf() i przekazuje go do backendu jako
źródło danych dla SCSI WRITE, więc zadeklarowana długość powoduje powstanie sterty
zawartość poza deskryptorem, która ma zostać zapisana przez backend do pliku
sklep z zapleczem. Backend jest ofiarą zbyt dużej listy scatterlist
isert to podaje, a nie przyczynę; nie było odczytu zapisanych bajtów
zademonstrowano.

Wyzwalacz: po zakończeniu logowania (faza pełnej funkcjonalności) inicjator, który ma
zadeklarował dużą wartość TargetRecvDataSegmentLength i FirstBurstLength
zezwala na niechciane/natychmiastowe dane, wysyła PDU, którego zadeklarowany segment danych
długość przekracza to, co otrzymano. Z KASANEM:

BŁĄD: KASAN: płyta poza granicami w sg_copy_buffer+0x150/0x1c0
Odczyt rozmiaru 4096 pod adresem ffff888109720800 przez zadanie kworker/1:0H/25
Kolejka robocza: ib-comp-wq ib_cq_poll_work
Zadzwoń do śledzenia:
sg_copy_buffer+0x150/0x1c0
isert_recv_done+0xba6/0x2390
__ib_process_cq+0xe1/0x390
ib_cq_poll_work+0x46/0x150

isert_recv_done+0xba6 przekształca się w isert_handle_iscsi_dataout()
(ib_isert.c:1160), wstawiony przez isert_rx_opcode().

Sprawdź wc->byte_len względem ramki w isert_recv_done() przed
PDU dociera do dowolnego modułu obsługi i przywraca połączenie, jeśli jest krótkie.
Ponieważ test porównuje bez odejmowania długości nagłówka, również
odrzuca jednostki PDU krótsze niż nagłówki iSER i iSCSI, co w przeciwnym razie byłoby możliwe
zostać przeanalizowany z nieaktualnej zawartości deskryptorów. Program obsługi logowania odrzuca jednostki PDU
krótszy niż ISER_HEADERS_LEN (zatwierdź 29e7b925ae6d („IB/isert: Odrzuć logowanie
PDU krótsze niż ISER_HEADERS_LEN"), ale nie ograniczają zadeklarowanych
długość; zostanie to naprawione w następnej łatce. Podmioty przetwarzające dane nie miały
sprawdzanie długości w ogóle.

isert odczytuje segment danych ze stałego przesunięcia: isert_get_data()
zwraca nagłówek iSER plus ISER_HEADERS_LEN i nie wprowadza żadnych zmian
AHS. Bajty, których dotykają procedury obsługi, są zatem dokładne
[ISER_HEADERS_LEN, ISER_HEADERS_LEN + dlength) i porównanie tej sumy
przeciwko wc->byte_len dokładnie ogranicza odczytywany region. AHS
termin jedynie zaostrzyłby test, nie ograniczając niczego dalej
---obcięty---

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org