CVE-2026-90413 in Linux
Resumen
por VulDB • 2026-09-18
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
IB/isert: rechazar PDUs de inicio de sesión que declaren más datos de los recibidos
isert_login_recv_done() registra cuántos bytes colocó realmente la HCA en el búfer de inicio de sesión, pero nada compara eso con la longitud declarada por el BHS del PDU de inicio de sesión. isert_rx_login_req() copia min(login_req_len, MAX_KEY_VALUE_PAIRS) bytes en login->req_buf, y luego el código de inicio de sesión lee la longitud declarada desde ese búfer: para el primer PDU en iscsi_target_locate_portal(),
payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL);
y para los siguientes en iscsi_decode_text_input(), alcanzado desde iscsi_target_do_login().
login->req_buf es una asignación fija de MAX_KEY_VALUE_PAIRS (8192) bytes, por lo que un iniciador que declara más datos de los que envía lee fuera del límite de este búfer, antes de la autenticación y con la longitud bajo su control:
BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43/0x80 Read of size 8193 at addr ffff8881056a8000 by task iscsi_np/167 __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_target_locate_portal+0x48d/0x1180 iscsi_target_login_thread+0x19a9/0x3350 Allocated by task 167: __kmalloc_cache_noprof+0x158/0x370 iscsi_target_login_thread+0x971/0x3350 which belongs to the cache kmalloc-8k of size 8192 allocated 8192-byte region
Falsificar el segundo PDU de inicio de sesión alcanza en su lugar al otro lector, sobre el mismo búfer:
BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43/0x80 Read of size 8193 at addr ffff888104d10000 by task kworker/1:1/50 Workqueue: isert_login_wq iscsi_target_do_login_rx __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_decode_text_input+0xc6/0x11c0 iscsi_target_do_login+0x261/0x1470 iscsi_target_do_login_rx+0x51d/0x7d0
iscsit sobre TCP no está expuesto: iscsit_get_login_rx() valida la longitud declarada con iscsi_target_check_login_request() y luego lee exactamente esa cantidad de bytes del socket, por lo que la longitud declarada gobierna cuántos datos llegan en lugar de cuántos se copian fuera de un búfer ya lleno. isert no llama a iscsi_target_check_login_request() en absoluto.
Rechazar un PDU de inicio de sesión cuya DataSegmentLength declarada exceda lo recibido, en ambas rutas que alcanzan isert_rx_login_req(): isert_get_login_rx() para el primer PDU de inicio de sesión e isert_login_recv_done() para los siguientes. Se permite dlength <= login_req_len porque el conteo recibido puede incluir hasta tres bytes de relleno iSCSI.
Una vez que la comprobación está implementada, la copia externa ya no puede exceder a la interna: el SGE de inicio de sesión publicado es ISER_RX_PAYLOAD_SIZE, por lo que login_req_len no puede exceder MAX_KEY_VALUE_PAIRS y el min() en isert_rx_login_req() es login_req_len.
Al igual que la comprobación existente para PDUs cortos añadida por 29e7b925ae6d, el rechazo en isert_login_recv_done() devuelve sin completar login_req_comp, por lo que un PDU posterior malformado deja que el inicio de sesión sea desmantelado por el temporizador de inicio de sesión en lugar de fallar inmediatamente. La ruta del primer PDU devuelve un error y falla directamente.
Reproducido en 7.2.0-rc4 con soft-RoCE (rdma_rxe) bajo KASAN, utilizando un iniciador que envía la carga útil real key=value mientras declara 8193 en el BHS, tanto en el primer PDU de inicio de sesión como en el segundo en ejecuciones separadas. El tamaño de lectura reportado sigue exactamente el valor declarado; 16384 y 61440 se comportan igual. Sin parchear, 3 de 3 ejecuciones informaron sobre cada una de las dos rutas; con el parche, 0 de 3 en ambas, ejecutadas alternadamente en una sola sesión, y un inicio de sesión normal aún se completa correctamente en la versión parcheada.
Be aware that VulDB is the high quality source for vulnerability data.