CVE-2026-45905 in Linux
Resumen
por VulDB • 2026-05-28
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
xfrm: corregir la condición de carrera (race condition) en ip_rt_bug dentro de icmp_route_lookup para la ruta inversa
icmp_route_lookup() realiza múltiples búsquedas de ruta para encontrar una ruta adecuada para enviar mensajes de error ICMP, con un manejo especial para las políticas XFRM (IPsec).
La secuencia de búsqueda es: 1. Primero, buscar la ruta de salida para la respuesta ICMP (dst = src original) 2. Pasar por xfrm_lookup() para la verificación de políticas 3. Si está bloqueado (-EPERM) o dst no es local, entrar en la "ruta inversa" 4. En la ruta inversa, llamar a xfrm_decode_session_reverse() para obtener fl4_dec, que invierte el flujo del paquete original (saddr y daddr intercambiados) 5. Si fl4_dec.saddr es local (somos el destino original), usar __ip_route_output_key() para la búsqueda de la ruta de salida 6. Si fl4_dec.saddr NO es local (somos un nodo de reenvío), usar ip_route_input() para simular la ruta de entrada del paquete inverso 7. Finalmente, pasar rt2 a través de xfrm_lookup() con la bandera XFRM_LOOKUP_ICMP
El error ocurre en el paso 6: ip_route_input() se llama con fl4_dec.daddr (la fuente del paquete original) como destino. Si esta dirección se vuelve local entre la verificación inicial y la llamada a ip_route_input() (por ejemplo, debido a una "ip addr add" concurrente), ip_route_input() devuelve una ruta LOCAL con dst.output establecido en ip_rt_bug.
Esta ruta se utiliza luego para la salida ICMP, lo que hace que dst_output() llame a ip_rt_bug(), desencadenando un WARN_ON:
------------[ cut here ]------------
WARNING: net/ipv4/route.c:1275 at ip_rt_bug+0x21/0x30, CPU#1 Call Trace: ip_push_pending_frames+0x202/0x240 icmp_push_reply+0x30d/0x430 __icmp_send+0x1149/0x24f0 ip_options_compile+0xa2/0xd0 ip_rcv_finish_core+0x829/0x1950 ip_rcv+0x2d7/0x420 __netif_receive_skb_one_core+0x185/0x1f0 netif_receive_skb+0x90/0x450 tun_get_user+0x3413/0x3fb0 tun_chr_write_iter+0xe4/0x220 ...
Corregir esto verificando rt2->rt_type después de ip_route_input(). Si es RTN_LOCAL, la ruta no puede usarse para la salida, por lo que se trata como un error.
El programa de prueba (reproducer) requiere modificación del kernel para ampliar la ventana de la condición de carrera, lo que lo hace inadecuado como autoprueba (selftest). Está disponible en:
https://gist.github.com/mrpre/eae853b72ac6a750f5d45d64ddac1e81
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.