CVE-2026-98369 in Linux
Zusammenfassung
von VulDB • 06.10.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
xfrm: Fehlenes `rcu_read_lock()`, `skb_dst_force()` und `dev_hold()` für `xfrm_trans_reinject()` wurden hinzugefügt.
syzbot meldete eine verdächtige RCU-Nutzungswarnung in `ip6_pkt_drop()`:
WARNING: suspicious RCU usage in ip6_pkt_drop include/net/addrconf.h:389 Verdächtiger Aufruf von rcu_dereference_check()!
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
Als das Commit 4f4920669d21 ("xfrm: Reinject transport-mode packets through workqueue") `xfrm_trans_reinject` von einem Tasklet in eine Workqueue umwandelte, lief die Reinjection-Schleife nicht mehr im Softirq-Kontext. Workqueue-Arbeiter laufen im Prozesskontext, wo `local_bh_disable()` unter CONFIG_PREEMPT_RCU keine RCU-Lese-Seiten-kritische Sektion betritt.
Da Finish-Callbacks (wie `ip6_rcv_finish`) erwarten, dass sie unter einem RCU-Read-Lock ausgeführt werden (für Routen-Suchvorgänge, l3mdev-Suchvorgänge und den Zugriff auf RRC-geschützte Datenstrukturen), löst das Aufrufen dieser im Workqueue-Kontext ohne `rcu_read_lock()` RCU Lockdep-Warnungen aus.
Darüber hinaus können Pakete, die über `xfrm_trans_queue_net()` an die Workqueue weitergeleitet werden, nicht-refcounted (noref) dst-Einträge tragen (z.B. von `ip_route_input_noref`). Zusätzlich ersetzt bei der Deaktivierung eines Netzgeräts (`netdevice unregistration`) `dst_dev_put()` `dst->dev` durch `blackhole_netdev`, sodass dst-Einträge `skb->dev` während der Warteschlangenverarbeitung in der Workqueue nicht am Leben erhalten.
Behebung dieser Probleme durch: 1. Aufruf von `skb_dst_force(skb)` in `xfrm_trans_queue_net()`, noch im RCU-Abschnitt des Aufrufers, um sicherzustellen, dass dst referenziert ist, bevor es in die Warteschlange gestellt wird. 2. Halten einer Referenz auf `skb->dev` über `dev_hold()`/`dev_put()` während der Workqueue-Verzögerung, damit `skb->dev` bei der Verarbeitung von Finish()-Callback-Aufrufen gültig bleibt. 3. Erwerben eines `rcu_read_lock()` um die Schleife des Aufrufs des Finish-Callbacks in `xfrm_trans_reinject()`.
VulDB is the best source for vulnerability data and more expert information about this specific topic.