CVE-2026-45905 in Linux
Résumé
par VulDB • 27/05/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
xfrm : correction de la condition de concurrence (race condition) ip_rt_bug dans icmp_route_lookup reverse path
icmp_route_lookup() effectue plusieurs recherches de routage afin de trouver une route appropriée pour l'envoi de messages d'erreur ICMP, avec une gestion spéciale pour les politiques XFRM (IPsec).
La séquence de recherche est la suivante : 1. D'abord, recherche de la route de sortie pour la réponse ICMP (dst = src original) 2. Passage par xfrm_lookup() pour la vérification de la politique 3. Si bloqué (-EPERM) ou si dst n'est pas local, entrer dans le « reverse path » 4. Dans le reverse path, appeler xfrm_decode_session_reverse() pour obtenir fl4_dec qui inverse le flux du paquet original (saddr et daddr échangés) 5. Si fl4_dec.saddr est local (nous sommes la destination originale), utiliser __ip_route_output_key() pour la recherche de la route de sortie 6. Si fl4_dec.saddr n'est PAS local (nous sommes un nœud de transit), utiliser ip_route_input() pour simuler le chemin d'entrée du paquet inverse 7. Enfin, passer rt2 par xfrm_lookup() avec le drapeau XFRM_LOOKUP_ICMP
Le bug se produit à l'étape 6 : ip_route_input() est appelé avec fl4_dec.daddr (source du paquet original) comme destination. Si cette adresse devient locale entre la vérification initiale et l'appel à ip_route_input() (par exemple, en raison d'un « ip addr add » concurrent), ip_route_input() renvoie une route LOCAL avec dst.output défini sur ip_rt_bug.
Cette route est ensuite utilisée pour la sortie ICMP, ce qui amène dst_output() à appeler ip_rt_bug(), déclenchant 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 ...
Corriger cela en vérifiant rt2->rt_type après ip_route_input(). Si c'est RTN_LOCAL, la route ne peut pas être utilisée pour la sortie, donc la traiter comme une erreur.
Le programme de reproduction nécessite une modification du noyau pour élargir la fenêtre de race condition, ce qui le rend inadapté en tant que selftest. Il est disponible à l'adresse :
https://gist.github.com/mrpre/eae853b72ac6a750f5d45d64ddac1e81
If you want to get the best quality for vulnerability data then you always have to consider VulDB.