Look up another CVE · open CVE-2026-97595 in the interactive tracker
CVE-2026-97595
mac802154: fix use-after-free of sdata via queued RX frames
Published 2026-09-25 (24 days ago) by the Linux kernel CNA. Subsystem include/net. Debian urgency: unimportant.
What to do, per Debian release
Debian's own status for CVE-2026-97595 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-6528-1 · 2026-09-29 · text | 6.12.111-1 | Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 7.2.7-1 | Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.7-1 | Update the kernel and reboot. Fixed in 7.2.7-1. A running kernel keeps the old code until the machine restarts. |
| Debian 12bookworm · linux-6.12 | fixedDLA-4817-1 · 2026-10-04 · text | 6.12.111-1~deb12u1 | Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
The RX softirq producer ieee802154_subif_frame() queues received beacon and MAC-command frames onto local->rx_beacon_list / rx_mac_cmd_list and schedules a process-context worker, storing a raw mac_pkt->sdata (and skb->dev == sdata->dev) with neither a reference nor any locking: - the lists have no lock: the softirq producer list_add_tail()s while the mac_wq worker list_del()s, so sibling interfaces on the same phy corrupt the list; - the workers dereference the interface after it may have been freed. mac802154_rx_mac_cmd_worker() touches mac_pkt->sdata directly, and mac802154_rx_beacon_worker() -> mac802154_process_beacon() dereferences skb->dev (== sdata->dev). Removing an interface frees its sdata (netdev_priv) while a queued frame still points at it, so a later worker run is a use-after-free. Reproduced under KASAN by flooding a victim interface with MAC command frames and removing it (the beacon path is the same class via skb->dev): BUG: KASAN: slab-use-after-free in mac802154_rx_mac_cmd_worker+0x463/0x630 [mac802154] Read of size 4 at addr ffff888002f9ea18 by task kworker/u8:1/31 Workqueue: phy0-mac-cmds mac802154_rx_mac_cmd_worker [mac802154] Call Trace: mac802154_rx_mac_cmd_worker+0x463/0x630 [mac802154] process_one_work+0x611/0xe80 worker_thread+0x52e/0xdc0 kthread+0x30c/0x630 ret_from_fork+0x2fd/0x3e0 Fix both lists together: - add local->rx_lock and take it around every list access: the softirq producer (plain spin_lock, softirq context) and the workers and flush (spin_lock_bh, process context); - pin the interface for the lifetime of a queued frame with netdev_hold()/netdev_put(), so the worker can safely dereference sdata / skb->dev even while the interface is being removed; - dequeue under the lock at the head and loop-drain the whole list in the workers (they previously processed one frame per run and relied on a later enqueue to drain the rest); - drop not-yet-started frames of an interface before it is unregistered, from ieee802154_if_remove() (after the RCU grace period) and from the ieee802154_remove_interfaces() loop -- the latter is the whole-phy teardown path, which does not go through ieee802154_if_remove(). An in-flight worker that already dequeued a frame keeps its own netdev reference; unregister_netdevice() then waits it out in netdev_run_todo(), which runs at rtnl_unlock() (rtnl released) and after the interface has been closed, so it does not pin rtnl. A worker blocked in an association TX only delays that one interface's unregister (the usual "waiting for %s to become free"), it does not hold rtnl. netdev_hold() is used for this reason instead of a cancel_work_sync() under rtnl, which would block on the worker's unbounded MLME TX wait via ieee802154_sync_queue(). The mac-command worker additionally skips processing for a stopped interface (ieee802154_sdata_running()), avoiding a needless association response during teardown.
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.
include/net/cfg802154.h
net/mac802154/ieee802154_i.h
net/mac802154/iface.c
net/mac802154/main.c
net/mac802154/rx.c
net/mac802154/scan.c
- What this is
- IEEE 802.15.4 SUBSYSTEMMAINTAINERS section matched on include/net/cfg802154.h · linux-wpan@vger.kernel.org · Maintained
- Kernel module
- mac802154
Check it on the machine
grep -w CONFIG_MAC802154 /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.
lsmod | grep -w mac802154Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.
Show whether Debian builds this, per release
Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.
- bookworm, trixie, forky, sid, bookworm · linux-6.12Mnot built on amd64/cloud-amd64, arm64/cloud-arm64
- M
- a module where it is built at all; some flavours do not build it
- Build switch
- CONFIG_MAC802154
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-09-25 (24 days ago)source
- CVSS
- 7.5 high
CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- adjacent network (AV:A)source
- EPSS
- 0.28%, higher than 19.6% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- unimportantsource
- Subsystem
- include/net
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.3 | 6.6.158 | 4826fd8373f6 |
| 6.3 | 6.12.111 | 4740ef0518c5 |
| 6.3 | 6.18.53 | 07f0214018d7 |
| 6.3 | 7.2.7 | 3d1fde35f95d |
| 6.3 | 7.3 | 2f37fba846c9 |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DLA-4817-1 | 2026-10-04 | bookworm 6.12.111-1~deb12u1 | tracker |
| DSA-6528-1 | 2026-09-29 | trixie 6.12.111-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:AAttack vector, adjacent network
- ieee802154_subif_frame() queues every received IEEE 802.15.4 MAC command frame (and beacons during a scan) onto local->rx_mac_cmd_list/rx_beacon_list from the RX tasklet with no lock, so a sender in radio range supplies the frames that race the mac_wq worker; 802.15.4 is a radio link, so this is adjacent rather than network.
- AC:HAttack complexity, high
- A remote attacker only reaches the bug by making the tasklet's unlocked list_add_tail() collide with the worker's list_del() on another CPU. They control the flood but not the worker's timing, and the window is a few pointer writes. The use-after-free of sdata also needs an interface removal that the remote attacker cannot cause.
- PR:NPrivileges required, none
- __ieee802154_rx_handle_packet() hands every parsed frame to each running non-monitor interface, and ieee802154_subif_frame() queues MAC command frames with no association or scan state required; unsecured frames pass mac802154_llsec_decrypt(), so no credentials are needed.
- UI:NUser interaction, none
- The victim only needs a running 802.15.4 interface, which is its normal operating state; the attacker sends the frames and the kernel queues and processes them without any user action.
- S:UScope, unchanged
- The corruption stays within the host kernel (mac802154 RX lists, cfg802154_mac_pkt, netdev_priv sdata) and crosses no VM or IOMMU boundary.
- C:HConfidentiality impact, high
- A corrupted rx_mac_cmd_list or rx_beacon_list lets the worker dereference freed cfg802154_mac_pkt entries, their skb and sdata. Reclaimed slab contents are then read as kernel pointers, a use-after-free read that can disclose kernel memory.
- I:HIntegrity impact, high
- The worker does list_del(), kfree() and kfree_skb() on stale mac_pkt entries, and mac802154_process_association_req/resp() write through the freed sdata, giving write and double-free primitives on reclaimable slab memory.
- A:HAvailability impact, high
- List corruption or the sdata use-after-free in mac802154_rx_mac_cmd_worker() or mac802154_rx_beacon_worker() causes a kernel oops; the commit's KASAN report shows such a slab-use-after-free.