Look up another CVE · open CVE-2026-98230 in the interactive tracker
CVE-2026-98230
xfrm: use hlist_del_init_rcu for state_cache and state_cache_input
Published 2026-10-06 (13 days ago) by the Linux kernel CNA. Subsystem net/xfrm. Debian urgency: unimportant.
What to do, per Debian release
Debian's own status for CVE-2026-98230 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source
| Release | Status | Version | What this means |
|---|---|---|---|
| Debian 12bookworm | not affected | 6.1.190-1 | Nothing to do. bookworm never shipped the vulnerable code. |
| Debian 13trixie | fixedDSA-6568-1 · 2026-10-16 · text | 6.12.113-1 | Update the kernel and reboot. DSA-6568-1 shipped the fix on 2026-10-16, in 6.12.113-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.2.8-1 | Update the kernel and reboot. Fixed in 7.2.8-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.8-1 | Update the kernel and reboot. Fixed in 7.2.8-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
Commit 14acf9652e56 ("xfrm: defensively unhash xfrm_state lists in __xfrm_state_delete") converted bydst/bysrc/byseq/byspi from hlist_del_rcu() to hlist_del_init_rcu() so that a second __xfrm_state_delete() on the same object becomes a no-op rather than a write through LIST_POISON pprev. It missed state_cache and state_cache_input, which kept hlist_del_rcu(): - hlist_del_rcu() leaves pprev = LIST_POISON2 (non-NULL), so hlist_unhashed() returns false. - hlist_del_init_rcu() leaves pprev = NULL, so hlist_unhashed() returns true. A second __xfrm_state_delete() therefore enters __hlist_del() on the already-deleted state_cache/state_cache_input nodes and does WRITE_ONCE(*pprev, next) through LIST_POISON2 — a write use-after-free once the slab is reused. The corruption can in turn cause a subsequent hlist_for_each_entry_rcu traversal to follow a dangling next pointer, producing the read use-after-free reported in xfrm_input_state_lookup(). Switch state_cache and state_cache_input to hlist_del_init_rcu() to match the other four lists, closing the write use-after-free and, with it, the read use-after-free it spawns.
Where it lives
The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.
net/xfrm/xfrm_state.c
- What this is
- NETWORKING [IPSEC]MAINTAINERS section matched on net/xfrm/ · netdev@vger.kernel.org · Maintained
Check it on the machine
grep -w CONFIG_XFRM /boot/config-$(uname -r)Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.
Show whether Debian builds this, per release
Debian builds this code. Every release below compiles the affected file into the kernels it ships.
- bookworm, trixie, forky, sidy
- y
- built into the kernel image on every flavour - only a patch removes it
- Build switch
- CONFIG_XFRM
From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages
Signals
- Published
- 2026-10-06 (13 days ago)source
- CVSS
- 7.0 high
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.12%, higher than 1.6% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- unimportantsource
- Subsystem
- net/xfrm
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.12.13 | 6.12.112 | fb38fb7420d5 |
| 6.13 | 6.18.54 | 4748c27e2e6a |
| 6.13 | 7.2.8 | 9b74a47a4cbd |
| 6.13 | 7.3 | 2afb8dc1f439 |
| 6.12.13 | 0 | 0 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DSA-6568-1 | 2026-10-16 | trixie 6.12.113-1 | tracker |
Why the CNA scored it this way
Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source
- AV:LAttack vector, local
- The bad unlink is in __xfrm_state_delete(), reached when SAs are removed via XFRM_MSG_DELSA/FLUSHSA/EXPIRE over NETLINK_XFRM or the af_key socket, or via xfrm_timer_handler expiry. ESP packets only walk state_cache_input in xfrm_input_state_lookup() and carry no malformed data that causes the double unlink, so the vector is local.
- AC:HAttack complexity, high
- A second unlink needs __xfrm_state_delete() to see a non-DEAD state that was already removed, but every caller holds x->lock and checks km.state. The only path found that skips the VALID check is mlx5e_ipsec_handle_event(), which calls xfrm_state_check_expire() on a hardware hard-limit event and needs mlx5 packet offload, so the attacker cannot reliably arrange it.
- PR:LPrivileges required, low
- Adding, expiring and flushing SAs over NETLINK_XFRM needs CAP_NET_ADMIN only in the user namespace that owns the netns. An unprivileged user gets it with unshare -Urn, and each netns has its own state_cache_input percpu lists and xfrm_state_lock.
- UI:NUser interaction, none
- The attacker drives the SA lifecycle (add, expire, delete, flush) and the traffic that fills the state caches themselves. No other user has to do anything.
- S:UScope, unchanged
- The corrupted hlist nodes are inside struct xfrm_state in kernel slab memory, so the impact stays within the kernel's own security authority.
- C:HConfidentiality impact, high
- After the stale-pprev unlink, the state_cache_input chain can keep a freed xfrm_state, which hlist_for_each_entry_rcu in xfrm_input_state_lookup() then dereferences (the read UAF the commit reports). With slab reuse, an attacker can control the contents of that object.
- I:HIntegrity impact, high
- __hlist_del() on an already-unlinked state_cache/state_cache_input node does WRITE_ONCE(*pprev, next) through a stale pointer, a write use-after-free into reused slab memory that corrupts RCU hash-chain linkage.
- A:HAvailability impact, high
- Writing through LIST_POISON2, or walking the corrupted per-CPU state_cache_input or policy state_cache_list chain, causes a general protection fault or KASAN oops in softirq or netns cleanup context, which takes down the kernel.