Saltar al contenido
CVE-2026-90413 Fuente: CVE.org Publicada · sin explotación confirmada

Vulnerabilidad de lectura fuera de límites en el kernel de Linux (IB/isert)

Linux · Linux · Publicada en CVE.org el 17-09-2026 · Última actualización: 09-11-2026

Descripción

En el kernel de Linux se resolvió la siguiente vulnerabilidad: IB/isert: rechazar PDU de inicio de sesión que declaran más datos de los recibidos isert_login_recv_done() registra cuántos bytes colocó realmente el HCA en el búfer de inicio de sesión, pero nada compara ese valor con la longitud que declara el BHS de la 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 vuelve a leer la longitud declarada desde ese búfer: para la primera PDU en iscsi_target_locate_portal(), payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL); y para las siguientes en iscsi_decode_text_input(), a la que se llega 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 de lo que envía lee más allá de su final, 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 en cambio la segunda PDU de inicio de sesión alcanza el 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 determina cuánto llega y no cuánto se copia desde un búfer ya lleno. isert no llama en absoluto a iscsi_target_check_login_request(). Se rechaza una PDU de inicio de sesión cuyo DataSegmentLength declarado excede lo recibido, en ambas rutas que llegan a isert_rx_login_req(): isert_get_login_rx() para la primera PDU de inicio de sesión e isert_login_recv_done() para las siguientes. Se permite dlength <= login_req_len porque la cantidad recibida puede incluir hasta tres bytes de relleno iSCSI. Con la verificación implementada, la copia de salida ya no puede exceder la copia de entrada: 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 verificación existente de PDU cortas agregada por 29e7b925ae6d, el rechazo en isert_login_recv_done() retorna sin completar login_req_comp, de modo que una PDU posterior malformada deja que el temporizador de inicio de sesión cierre la sesión en lugar de fallar de inmediato. La ruta de la primera PDU devuelve un error y falla de inmediato. Se reprodujo en 7.2.0-rc4 con soft-RoCE (rdma_rxe) bajo KASAN, usando un iniciador que envía la carga útil key=value real mientras declara 8193 en el BHS, en la primera PDU de inicio de sesión y en la segunda en ejecuciones separadas. El tamaño de lectura informado coincide exactamente con el valor declarado; 16384 y 61440 se comportan igual. Sin el parche, 3 de 3 ejecuciones informan el problema en cada una de las dos rutas; con el parche, 0 de 3 en ambas, ejecutadas de forma alternada en una sola sesión, y un inicio de sesión normal sigue completándose en la compilación con el parche.

Qué hacer

Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.

Versiones afectadas

  • Linux Afectadas: b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a b1f3313e7b3e396e4985fea5c709477387e0a065 · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 228aaa620fe6a7bc8b5b21dd348b4836b1760c61 · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 0d9c0586af703890afe1bd0cfe641e3a3af1c32d · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 44fe800ec13386c88bd5b32bcd1deaa1e17535d5 · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 71ec8bbfa4a183f1e623662f9cfbcd702e433bdb · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a c345d9d0b3eefc990bb90cf565325785aab06aab · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 48812c8103071d550d9ab4a3431be5bdc52255bc · b8d26b3be8b33682cf163274ed07479a70554633 y anteriores a 2488b5b4827e5415768afc8daf097e8eb83c98df
  • Linux Afectadas: 3.10 No afectadas: 5.10.270 · 5.15.221 · 6.1.188 · 6.6.157 · 6.12.110 · 6.18.52

Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.

Referencias

Ver el texto original en inglés (CVE.org)

IB/isert: reject login PDUs declaring more data than was received

In the Linux kernel, the following vulnerability has been resolved: IB/isert: reject login PDUs declaring more data than was received isert_login_recv_done() records how many bytes the HCA actually placed in the login buffer, but nothing compares that against the length the login PDU's BHS declares. isert_rx_login_req() copies min(login_req_len, MAX_KEY_VALUE_PAIRS) bytes into login->req_buf, and the login code then reads the declared length back out of that buffer - for the first PDU in iscsi_target_locate_portal(), payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL); and for the ones after it in iscsi_decode_text_input(), reached from iscsi_target_do_login(). login->req_buf is a fixed MAX_KEY_VALUE_PAIRS (8192) byte allocation, so an initiator that declares more than it sends reads off the end of it, before authentication and with the length under its 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 Falsifying the second login PDU instead reaches the other reader, on the same buffer: 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 over TCP is not exposed: iscsit_get_login_rx() validates the declared length with iscsi_target_check_login_request() and then reads exactly that many bytes off the socket, so the declared length governs how much arrives rather than how much is copied out of an already-filled buffer. isert does not call iscsi_target_check_login_request() at all. Reject a login PDU whose declared DataSegmentLength exceeds what was received, in both paths that reach isert_rx_login_req(): isert_get_login_rx() for the first login PDU and isert_login_recv_done() for the ones after it. dlength <= login_req_len is allowed because the received count can include up to three bytes of iSCSI padding. Once the check is in place the copy out can no longer exceed the copy in: the posted login SGE is ISER_RX_PAYLOAD_SIZE, so login_req_len cannot exceed MAX_KEY_VALUE_PAIRS and the min() in isert_rx_login_req() is login_req_len. Like the existing short-PDU check added by 29e7b925ae6d, the reject in isert_login_recv_done() returns without completing login_req_comp, so a malformed subsequent PDU leaves the login to be torn down by the login timer rather than failing immediately. The first-PDU path returns an error and fails straight away. Reproduced on 7.2.0-rc4 with soft-RoCE (rdma_rxe) under KASAN, using an initiator that sends the real key=value payload while declaring 8193 in the BHS, on the first login PDU and on the second in separate runs. The reported read size tracks the declared value exactly; 16384 and 61440 behave the same. Unpatched 3 of 3 runs report on each of the two paths, patched 0 of 3 on both, run alternately in a single session, and a normal login still completes on the patched build.

Recibe el boletín cuando CISA agregue vulnerabilidades nuevas

Te escribimos solo cuando CISA agrega vulnerabilidades nuevas, ya traducidas: cada día que haya, o en un resumen los lunes. Confirmas por correo y te das de baja con un clic.

Frecuencia