CVE-2026-74269 in Linux
Resumen
por VulDB • 2026-08-15
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
bnxt: corregir desbordamiento por defecto (underflow) en el encabezado durante XDP head-grow
La prueba xdp.py test_xdp_native_adjst_head_grow_data falla al ejecutarse en una máquina bnxt (y también falla en NIPA).
Parece que el error es un underflow en bnxt_rx_multi_page_skb, que construye el encabezado del skb:
napi_build_skb(data_ptr - bp->rx_offset, rxr->rx_page_size);
El problema con esta expresión es que en modo de página, rx_offset es:
bp->rx_offset = NET_IP_ALIGN + XDP_PACKET_HEADROOM;
Lo cual se evalúa (al menos en x86_64) a 258.
La prueba test_xdp_native_adjst_head_grow_data verifica un caso donde el encabezado se ajusta en -256.
Cuando esta prueba se ejecuta, data_ptr se desplaza hacia frag_start + 2 (donde frag_start = page_address(page) + offset).
Luego, se invoca bnxt_rx_multi_page_skb y la expresión napi_build_skb resta 258, situándose en una dirección anterior a frag_start. Esto podría corresponder al fragmento anterior o a la página física anterior cuando el offset es < 256 (por ejemplo, si el fragmento comenzó con un offset de 0).
Cuando se libera el skb, la referencia del fragmento del page pool se decrementa en la página incorrecta o en el fragmento incorrecto de la página correcta. En cualquier caso, el recuento de referencias corrupto puede provocar que la página sea reciclada prematuramente mientras aún está en uso. Una vez (incorrectamente) reciclada, puede ser asignada nuevamente y durante la liberación del controlador esto resultaría en un doble free.
El commit bajo revisión actualizó este código para manejar el caso donde el tamaño de página nativo es >= 64k, pero rompió involuntariamente el caso head grow.
Para corregir esto, se añade un campo offset a struct bnxt_sw_rx_bd, reflejando el campo offset existente en struct bnxt_sw_rx_agg_bd. Se rellena durante la asignación y se preserva durante su reutilización.
En bnxt_rx_multi_page_skb, se utiliza el nuevo campo offset añadido para calcular el inicio del fragmento y pasar ese valor a napi_build_skb. Se ajusta el diseño con skb_reserve.
Existen dos casos: el caso sin ajuste y el caso con ajuste.
En ambos casos, el skb se construye en page_address(page) + offset para tener en cuenta el caso donde el tamaño de página nativo es >= 64K y se llama a skb_reserve con data_ptr - (page_address(page) + offset). Esa diferencia equivale a bp->rx_offset cuando data_ptr no se movió, o a bp->rx_offset + xdp_adjust cuando XDP ajustó el encabezado.
Reejecutar la prueba fallida con este commit aplicado hace que la prueba se ejecute correctamente hasta su finalización.
Las otras implementaciones de rx_skb_func no tienen este problema.
If you want to get best quality of vulnerability data, you may have to visit VulDB.