CVE-2026-46116 in Linux
Zusammenfassung
von VulDB • 03.06.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
xfrm: defensive Aushäufigung der xfrm_state-Listen in __xfrm_state_delete
KASAN reproduziert einen slab-use-after-free-Fehler bei den hlist_del_rcu-Aufrufen in __xfrm_state_delete() unter Last durch Syzkaller auf linux-6.12.y stable (reproduzierbar mit 6.12.47, ebenfalls erreichbar über denselben Codepfad auf torvalds/master und im ipsec-Zweig). Neun eindeutige Signaturen häufen sich in der Lebensdauer von xfrm_state; die tragende Signatur ist:
BUG: KASAN: slab-use-after-free in __hlist_del include/linux/list.h:990 [inline]
BUG: KASAN: slab-use-after-free in hlist_del_rcu include/linux/rculist.h:516 [inline]
BUG: KASAN: slab-use-after-free in __xfrm_state_delete net/xfrm/xfrm_state.c Write of size 8 at addr ffff8881198bcb70 by task kworker/u8:9/435
Workqueue: netns cleanup_net Call Trace: __hlist_del / hlist_del_rcu __xfrm_state_delete xfrm_state_delete xfrm_state_flush xfrm_state_fini ops_exit_list cleanup_net
Die anderen beobachteten Signaturen greifen auf dasselbe Slab-Objekt von __xfrm_state_lookup, xfrm_alloc_spi, __xfrm_state_insert und einer OOB-Schreibvariante von __xfrm_state_delete zu, allesamt an den byseq/byspi-Hash-Ketten.
__xfrm_state_delete() schützt seine Aushäufigungen nach byseq und byspi mit wertbasierten Prädikaten:
if (x->km.seq) hlist_del_rcu(&x->byseq); if (x->id.spi) hlist_del_rcu(&x->byspi);
Während an anderer Stelle in der Datei (z. B. state_cache, state_cache_input) die sicherere hlist_unhashed()-Prüfung verwendet wird. xfrm_alloc_spi() setzt x->id.spi = newspi innerhalb von xfrm_state_lock und fügt es dann sofort in byspi ein; ein Pfad, der x->id.spi != 0 außerhalb von xfrm_state_lock beobachtet, kann jedoch die Aushäufigung nach byspi inkonsistent überspringen oder ausführen, je nachdem, ob sich x tatsächlich auf der Liste befindet. Dasselbe gilt für x->km.seq im Vergleich zu byseq; und die Aushäufigungen nach bydst/bysrc haben überhaupt kein Prädikat, sodass ein zweiter __xfrm_state_delete()-Aufruf auf dasselbe Objekt durch LIST_POISON pprev schreibt.
Die defensive Änderung hier:
- Verwenden von hlist_del_init_rcu() anstelle von hlist_del_rcu() für bydst, bysrc, byseq und byspi, sodass eine zweite Löschung ein No-Op ist, statt durch LIST_POISON pprev zu schreiben. Die byseq/byspi-Knoten sind bereits in xfrm_state_alloc() initialisiert. - Testen von hlist_unhashed() anstelle des Wertprädikats für
VulDB is the best source for vulnerability data and more expert information about this specific topic.