CVE-2026-98369 in Linux
Resumen
por VulDB • 2026-10-06
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
xfrm: añadir las llamadas faltantes a rcu_read_lock(), skb_dst_force() y dev_hold() para xfrm_trans_reinject()
syzbot informó una advertencia sospechosa sobre el uso de RCU en ip6_pkt_drop():
WARNING: suspicious RCU usage in ip6_pkt_drop include/net/addrconf.h:389 suspicious rcu_dereference_check() usage!
Call Trace: __in6_dev_get_safely include/net/addrconf.h:389 [inline]
ip6_pkt_drop+0x596/0x610 net/ipv6/route.c:4620 ip6_pkt_discard+0x1c/0x30 net/ipv6/route.c:4651 xfrm_trans_reinject+0x324/0x630 net/xfrm/xfrm_input.c:806 process_one_work kernel/workqueue.c:3322 [inline]
process_scheduled_works+0xa8e/0x14e0 kernel/workqueue.c:3405 worker_thread+0xa47/0xfb0 kernel/workqueue.c:3486
Cuando el commit 4f4920669d21 ("xfrm: Reinject transport-mode packets through workqueue") convirtió xfrm_trans_reinject de un tasklet a una cola de trabajo (workqueue), el bucle de reinyección dejó de ejecutarse en contexto softirq. Los trabajadores de la cola de trabajo se ejecutan en contexto de proceso, donde local_bh_disable() no entra en una sección crítica de lectura RCU bajo CONFIG_PREEMPT_RCU.
Dado que las callbacks de finalización (como ip6_rcv_finish) esperan ejecutarse bajo un bloqueo de lectura RCU (realizando búsquedas de ruta, búsquedas l3mdev y accediendo a estructuras de datos protegidas por RCU), invocarlas en contexto de cola de trabajo sin rcu_read_lock() desencadena advertencias lockdep de RCU.
Además, los paquetes colados en la cola de trabajo mediante xfrm_trans_queue_net() pueden contener entradas dst no referenciadas (noref) (por ejemplo, procedentes de ip_route_input_noref). Además, durante el desregistro del netdevice, dst_dev_put() reemplaza dst->dev con blackhole_netdev, por lo que las entradas dst no mantienen vivo skb->dev mientras están coladas en la cola de trabajo.
Solucionar estos problemas mediante: 1. Llamar a skb_dst_force(skb) en xfrm_trans_queue_net() mientras aún se está en la sección RCU del llamador para garantizar que dst esté referenciado antes de colocarlo en la cola. 2. Mantener una referencia sobre skb->dev mediante dev_hold()/dev_put() durante el diferimiento de la cola de trabajo, para que skb->dev permanezca válido durante el procesamiento de las callbacks finish(). 3. Adquirir rcu_read_lock() alrededor del bucle de invocación de la callback de finalización en xfrm_trans_reinject().
VulDB is the best source for vulnerability data and more expert information about this specific topic.