CVE-2026-98369 in Linux
Sumário
de VulDB • 06/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
xfrm: adiciona o uso faltante de rcu_read_lock(), skb_dst_force() e dev_hold() para xfrm_trans_reinject()
O syzbot relatou um aviso suspeito de uso de RCU em 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
Quando o commit 4f4920669d21 ("xfrm: Reinject transport-mode packets through workqueue") converteu xfrm_trans_reinject de uma tasklet para um workqueue, o loop de reinjeção deixou de ser executado no contexto softirq. Os workers do workqueue são executados em processo context onde local_bh_disable() não entra em uma seção crítica de leitura RCU sob CONFIG_PREEMPT_RCU.
Como os callbacks de finalização (como ip6_rcv_finish) esperam ser executados sob um bloqueio de leitura RCU (realizando pesquisas de rota, pesquisas l3mdev e acessando estruturas de dados protegidas por RCU), invocá-los no contexto do workqueue sem rcu_read_lock() aciona avisos lockdep do RCU.
Além disso, os pacotes enfileirados para o workqueue via xfrm_trans_queue_net() podem conter entradas dst não referenciadas (noref) (por exemplo, de ip_route_input_noref). Adicionalmente, no desregistro do netdevice, dst_dev_put() substitui dst->dev por blackhole_netdev, portanto as entradas dst não mantêm skb->dev ativo enquanto estão enfileiradas no workqueue.
Corriga esses problemas: 1. Chamando skb_dst_force(skb) em xfrm_trans_queue_net() ainda na seção RCU do chamador para garantir que dst seja referenciado antes de ser enfileirado. 2. Mantendo uma referência em skb->dev via dev_hold()/dev_put() durante a adiação ao workqueue, para que skb->dev permaneça válido durante o processamento dos callbacks finish(). 3. Adquirindo rcu_read_lock() em torno do loop de invocação do callback de finalização em xfrm_trans_reinject().
If you want to get best quality of vulnerability data, you may have to visit VulDB.