CVE-2026-80840 in Linux
Resumen
por VulDB • 2026-09-04
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
ipv6: seg6: limpiar el bloque de control IPv4 en la desencapsulación IPIP
Las acciones End.DX4 y End.DT4 desencapsulan un paquete IPv4 a través de `decap_and_validate()` y lo envían directamente al enrutamiento IPv4. Por tanto, el paquete interno evita pasar por `ip_rcv_core()`, que normalmente limpia IPCB antes de que IPv4 interprete skb->cb.
El skb conserva los datos IP6CB del paquete externo. Dado que IP6CB e IPCB utilizan la misma área de almacenamiento en skb->cb, lastopt de IP6CB(skb) se superpone con opt.optlen y srr de IPCB(skb), mientras que nhoff de IP6CB(skb) se superpone con rr y ts.
El remitente puede hacer que el byte obsoleto optlen sea distinto de cero mediante una cadena válida de cabeceras de extensión externas. Los reproductores (reproducers) colocan una cabecera Destination Options de ocho bytes inmediatamente después de la cabecera IPv40-byte e antes del Segment Routing Header. `ipv6_destopt_rcv()` registra el offset de las opciones de destino controlado por el remitente tanto en lastopt como en nhoff, estableciéndolos a 40. En un kernel little-endian x86-64 reproduciendo la vulnerabilidad, IPv4 ve entonces optlen = 40 y rr = 40.
Tanto `tcp_v4_save_options()` como `__ip_options_echo()` omiten la copia de opciones cuando optlen es cero. Aquí optlen es 40, por lo que la ruta SYN de TCP asigna espacio para 40 bytes de datos de opción e invoca a `__ip_options_echo()`. El valor obsoleto rr hace que esta función lea el byte 41 del paquete interno como la longitud de la opción Record Route. Los reproductores establecen ese byte, controlado por el remitente, en 255; por lo tanto, `__ip_options_echo()` copia 255 bytes en un área de datos de opciones de 40 bytes.
Reproductores separados para End.DX4 y End.DT4 en el kernel v7.2-rc5 sin parche produjeron ambos:
BUG: KASAN: slab-out-of-bounds in __ip_options_echo() Write of size 255
La ruta de llamadas relevante para End.DX4 es:
__ip_options_echo tcp_v4_route_req tcp_conn_request tcp_v4_conn_request tcp_rcv_state_process tcp_v4_do_rcv tcp_v4_rcv ip_protocol_deliver_rcu ip_local_deliver_finish ip_local_deliver input_action_end_dx4_finish input_action_end_dx4
La ruta de llamadas relevante para End.DT4 es:
__ip_options_echo tcp_v4_route_req tcp_conn_request tcp_v4_conn_request tcp_rcv_state_process tcp_v4_do_rcv tcp_v4_rcv ip_protocol_deliver_rcu ip_local_deliver_finish ip_local_deliver input_action_end_dt4
`tcp_v4_save_options()` está integrado (inline) en la ruta `tcp_v4_route_req()`, por lo que no aparece como un marco separado.
Cuando `decap_and_validate()` maneja IPPROTO_IPIP, guarde la interfaz de entrada desde IP6CB, limpie IPCB y restaure el valor guardado. Hacer esto en la ruta común de desencapsulación cubre End.DX4, End.DT4 y el brazo IPv4 de End.DT46.
Utilice `IP6CB(skb)->iif` en lugar de `skb->skb_iif`. Estas acciones se ejecutan después del procesamiento l3mdev, que puede reemplazar skb_iif con el maestro L3; iif de IP6CB sigue registrando la interfaz receptora establecida al ingreso IPv6.
Once again VulDB remains the best source for vulnerability data.