Look up another CVE · open CVE-2026-93250 in the interactive tracker
CVE-2026-93250
vxlan: mdb: Fix use-after-free in vxlan_mdb_flush()
Published 2026-09-24 (24 days ago) by the Linux kernel CNA. Subsystem drivers/net. Debian urgency: unimportant.
What to do, per Debian release
Debian's own status for CVE-2026-93250 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.6-1 | Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 7.2.6-1 | Update the kernel and reboot. Fixed in 7.2.6-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
vxlan_mdb_flush() iterates over the MDB entries using hlist_for_each_entry_safe(), which only tolerates the removal of the current entry. Contrary to the comment above the loop, the removal of an entry can trigger the removal of another entry. Flushing the remotes of a (*, G) entry also removes the (S, G) entries that were created for its source list, once they are left without remotes: vxlan_mdb_remotes_flush() -> vxlan_mdb_remote_del() -> vxlan_mdb_remote_srcs_del() -> vxlan_mdb_remote_src_del() -> vxlan_mdb_remote_src_fwd_del() -> __vxlan_mdb_del() -> vxlan_mdb_entry_put() Such an entry can be located after the (*, G) entry in the list, as vxlan_mdb_entry_get() returns an existing entry without moving it to the head of the list. This order is obtained by adding the (S, G) entry before the (*, G) entry, the latter with NLM_F_REPLACE, as the addition of the source otherwise fails with -EEXIST. The (S, G) entry is then the entry saved by hlist_for_each_entry_safe() and it is freed while the (*, G) entry is processed. The next iteration calls hlist_del() on it again, writing LIST_POISON1 to LIST_POISON2 [1]. Besides device deletion, the flush is also reachable from RTM_DELMDB with NLM_F_BULK. Fix by re-reading the next entry after the remotes were flushed. The current entry cannot be removed by this flush, as source lists can only be configured on (*, G) entries and the removed entries are (S, G) entries. It is therefore still linked and its next pointer reflects the removals. [1] BUG: KASAN: wild-memory-access in vxlan_mdb_entry_put.part.0+0x328/0x588 Write of size 8 at addr dead000000000122 by task ip/327 CPU: 3 UID: 1000 PID: 327 Comm: ip Not tainted 7.2.0-rc7 #2 PREEMPT Call trace: vxlan_mdb_entry_put.part.0+0x328/0x588 vxlan_mdb_flush+0x1d8/0x25c vxlan_mdb_fini+0x8c/0x100 vxlan_uninit+0x1c/0x7c unregister_netdevice_many_notify+0x954/0xd4c rtnl_dellink+0x210/0x530 rtnetlink_rcv_msg+0x434/0x4d0 netlink_rcv_skb+0xc4/0x204 rtnetlink_rcv+0x18/0x24 netlink_unicast+0x4b8/0x548 netlink_sendmsg+0x29c/0x560 ____sys_sendmsg+0x390/0x3ec ___sys_sendmsg+0x114/0x188 __sys_sendmsg+0xf0/0x178 __arm64_sys_sendmsg+0x48/0x60 invoke_syscall.constprop.0+0x58/0x180 el0_svc_common.constprop.0+0x74/0x140 do_el0_svc+0x30/0x40 el0_svc+0x38/0x98 el0t_64_sync_handler+0xa0/0xe4 el0t_64_sync+0x198/0x19c
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.
drivers/net/vxlan/vxlan_mdb.c
- What this is
- NETWORKING DRIVERSMAINTAINERS section matched on drivers/net/ · netdev@vger.kernel.org · Maintained
- Kernel module
- vxlan
Check it on the machine
grep -w CONFIG_VXLAN /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 vxlanPrints 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 as a loadable module. Every release with an answer below compiles it as a module on every flavour, so whether the code is in the running kernel depends on whether that module is loaded. The build rule could not be established for 1 release, so nothing is claimed about those.
- bookworm?
- trixie, forky, sid, bookworm · linux-6.12m
- ?
- not established - no Makefile entry for the affected file
- m
- a loadable module on every flavour - check lsmod, can be blacklisted
Where a release above reads "not established", no build rule for the affected file was found in that release's kernel tree. That is a gap in this lookup, not a finding that the code is absent.
- Build switch
- CONFIG_VXLAN
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-24 (24 days ago)source
- CVSS
- 7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it - Attack vector
- local (AV:L)source
- EPSS
- 0.16%, higher than 4.6% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- unimportantsource
- Subsystem
- drivers/net
Upstream fixes
The versions the CNA records as introducing and fixing this, and the commit for each. source
| Introduced | Fixed in | Commit |
|---|---|---|
| 6.4 | 6.6.157 | f8a9b988e7a7 |
| 6.4 | 6.12.110 | c7dc26d06f90 |
| 6.4 | 6.18.52 | 3e6b705bc162 |
| 6.4 | 7.2.6 | f26400b325bd |
| 6.4 | 7.3 | bc2dc66a6693 |
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:LAttack vector, local
- The UAF is in vxlan_mdb_flush(), reached from local NETLINK_ROUTE sendmsg via rtnl_dellink→vxlan_uninit→vxlan_mdb_fini, or rtnl_mdb_del(RTM_DELMDB|NLM_F_BULK)→vxlan_mdb_del_bulk. Received VXLAN UDP uses vxlan_mdb_entry_skb_get/vxlan_mdb_xmit and never calls flush, so the trigger is the netlink control message, not a peer packet.
- AC:LAttack complexity, low
- The attacker builds the bad mdb_list order themselves: RTM_NEWMDB adds an (S,G) entry, then RTM_NEWMDB with NLM_F_REPLACE adds a (*,G) whose source list reuses that (S,G) via vxlan_mdb_entry_get() without moving it to the list head, then RTM_DELLINK or RTM_DELMDB|NLM_F_BULK runs vxlan_mdb_flush(). No race or victim-side state is required.
- PR:LPrivileges required, low
- rtnetlink_rcv_msg requires netlink_net_capable(CAP_NET_ADMIN) for RTM_NEWLINK/RTM_NEWMDB/RTM_DELMDB/RTM_DELLINK, i.e. CAP_NET_ADMIN in the socket netns user_ns, obtained via unshare -Urn. vxlan_link_ops has no extra capability gate, and the KASAN trace ran as UID 1000 (ip).
- UI:NUser interaction, none
- The attacker issues their own rtnetlink messages to create the vxlan, add the (S,G) then (*,G) MDB entries, and trigger vxlan_mdb_flush() via RTM_DELLINK or RTM_DELMDB NLM_F_BULK; no victim mount, click, or other action is required.
- S:UScope, unchanged
- The freed object is a kmalloc'd vxlan_mdb_entry processed under RTNL in the same kernel that handled the netlink command; impact is host-kernel memory corruption, not a VM escape, IOMMU bypass, or other changed-scope boundary.
- C:HConfidentiality impact, high
- vxlan_mdb_entry_put() kfree_rcu's the (S,G) vxlan_mdb_entry while hlist_for_each_entry_safe() still holds it in tmp; the next vxlan_mdb_flush() iteration then reads that slab object (key.vni and remotes). After RCU reclaim the same kmalloc slot can be sprayed for an arbitrary kernel read.
- I:HIntegrity impact, high
- The stale tmp then re-enters vxlan_mdb_entry_put(), which hlist_del()s the already-unlinked mdb_node (WRITE_ONCE through LIST_POISON2 or a sprayed pprev) and would kfree_rcu the same vxlan_mdb_entry twice, giving a slab double-free write primitive.
- A:HAvailability impact, high
- KASAN reports a wild-memory-access 8-byte write to LIST_POISON2 (dead000000000122) in vxlan_mdb_entry_put() from vxlan_mdb_flush() during rtnl_dellink of the vxlan, which oopses the kernel.