CVE-2026-64450 in Linux
Resumen
por VulDB • 2026-07-25
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
tipc: corregir lectura fuera de límites en bloques Gap ACK de difusión (broadcast)
Un mensaje PROTOCOL/STATE_MSG de broadcast puede contener un registro de bloques Gap ACK en su área de datos. tipc_get_gap_ack_blks() solo verifica que el campo len del registro sea autoconsistente con sus conteos ugack_cnt/bgack_cnt (sz == struct_size(p, gacks, ugack_cnt + bgack_cnt)); no comprueba que el registro se ajuste realmente al área de datos del mensaje, msg_data_sz().
El llamador unicast tipc_link_proto_rcv() lo limita ("if (glen > dlen) break;"), pero el llamador de broadcast tipc_bcast_sync_rcv() descarta el tamaño devuelto, por lo que tipc_link_advance_transmq() copia el registro fuera del skb recibido con un conteo controlado por el atacante:
this_ga = kmemdup(ga, struct_size(ga, gacks, ga->bgack_cnt), GFP_ATOMIC);
Un vecino TIPC que negoció TIPC_GAP_ACK_BLOCK lo activa mediante un mensaje STATE_MSG de broadcast ordinario (msg_bc_ack_invalid() limpio), con tamaño tal que su área de datos es corta y transportando un registro Gap ACK con len = 0x400, bgack_cnt = 0xff y ugack_cnt = 0. Entonces len equivale a struct_size(p, gacks, 255), por lo que la comprobación de consistencia pasa y ga no es NULL; kmemdup() lee struct_size(ga, gacks, 255) = 1024 bytes fuera del skb mucho más pequeño:
BUG: KASAN: slab-out-of-bounds in kmemdup_noprof+0x48/0x60 Read of size 1024 at addr ffff0000c7030d38 by task poc864/69 Call trace: kmemdup_noprof+0x48/0x60 tipc_link_advance_transmq+0x86c/0xb80 tipc_link_bc_ack_rcv+0x19c/0x1e0 tipc_bcast_sync_rcv+0x1c4/0x2c4 tipc_rcv+0x85c/0x1340 tipc_l2_rcv_msg+0xac/0x104 The buggy address belongs to the object at ffff0000c7030d00 which belongs to the cache skbuff_small_head of size 704 The buggy address is located 56 bytes inside of allocated 704-byte region [ffff0000c7030d00, ffff0000c7030fc0)
Los bytes copiados se consumen posteriormente como valores gap/ack, pero la lectura ya está fuera de límites en kmemdup() independientemente de cómo se utilicen.
La ruta unicast STATE desecha este mensaje: "if (glen > dlen) break;" omite el resto del manejo de STATE_MSG y se libera el skb. Hacer que la ruta de broadcast también lo deseche. tipc_bcast_sync_rcv() ahora limita el registro contra msg_data_sz() y, cuando no cabe, informa ello a través de tipc_node_bc_sync_rcv() hacia tipc_rcv() para que el skb sea descartado en lugar de procesado. ga no se limpia en esta ruta: ga == NULL ya significa "par antiguo sin Selective ACK", un estado legítimo distinto.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.