Look up another CVE · open CVE-2025-39851 in the interactive tracker
CVE-2025-39851
vxlan: Fix NPD when refreshing an FDB entry with a nexthop object
Published 2025-09-19 (13 months ago) by the Linux kernel CNA. Subsystem drivers/net. Debian urgency: not yet assigned.
What to do, per Debian release
Debian's own status for CVE-2025-39851 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 | vulnerable | 6.1.190-1 | No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication. |
| Debian 13trixie | fixedDSA-6008-1 · 2025-09-22 · text | 6.12.48-1 | Update the kernel and reboot. DSA-6008-1 shipped the fix on 2025-09-22, in 6.12.48-1. A running kernel keeps the old code until the machine restarts. |
| Debian 14forky | fixed | 6.16.6-1 | Update the kernel and reboot. Fixed in 6.16.6-1. A running kernel keeps the old code until the machine restarts. |
| Debian unstablesid | fixed | 6.16.6-1 | Update the kernel and reboot. Fixed in 6.16.6-1. A running kernel keeps the old code until the machine restarts. |
The vulnerability
What the bug is
VXLAN FDB entries can point to either a remote destination or an FDB nexthop group. The latter is usually used in EVPN deployments where learning is disabled. However, when learning is enabled, an incoming packet might try to refresh an FDB entry that points to an FDB nexthop group and therefore does not have a remote. Such packets should be dropped, but they are only dropped after dereferencing the non-existent remote, resulting in a NPD [1] which can be reproduced using [2]. Fix by dropping such packets earlier. Remove the misleading comment from first_remote_rcu(). [1] BUG: kernel NULL pointer dereference, address: 0000000000000000 [...] CPU: 13 UID: 0 PID: 361 Comm: mausezahn Not tainted 6.17.0-rc1-virtme-g9f6b606b6b37 #1 PREEMPT(voluntary) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-4.fc41 04/01/2014 RIP: 0010:vxlan_snoop+0x98/0x1e0 [...] Call Trace: <TASK> vxlan_encap_bypass+0x209/0x240 encap_bypass_if_local+0xb1/0x100 vxlan_xmit_one+0x1375/0x17e0 vxlan_xmit+0x6b4/0x15f0 dev_hard_start_xmit+0x5d/0x1c0 __dev_queue_xmit+0x246/0xfd0 packet_sendmsg+0x113a/0x1850 __sock_sendmsg+0x38/0x70 __sys_sendto+0x126/0x180 __x64_sys_sendto+0x24/0x30 do_syscall_64+0xa4/0x260 entry_SYSCALL_64_after_hwframe+0x4b/0x53 [2] #!/bin/bash ip address add 192.0.2.1/32 dev lo ip address add 192.0.2.2/32 dev lo ip nexthop add id 1 via 192.0.2.3 fdb ip nexthop add id 10 group 1 fdb ip link add name vx0 up type vxlan id 10010 local 192.0.2.1 dstport 12345 localbypass ip link add name vx1 up type vxlan id 10020 local 192.0.2.2 dstport 54321 learning bridge fdb add 00:11:22:33:44:55 dev vx0 self static dst 192.0.2.2 port 54321 vni 10020 bridge fdb add 00:aa:bb:cc:dd:ee dev vx1 self static nhid 10 mausezahn vx0 -a 00:aa:bb:cc:dd:ee -b 00:11:22:33:44:55 -c 1 -q
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_core.c
drivers/net/vxlan/vxlan_private.h
- 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 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.
- bookworm, trixie, forky, sidm
- m
- a loadable module on every flavour - check lsmod, can be blacklisted
- 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
- 2025-09-19 (13 months ago)source
- CVSS
- 7.5 high
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:Hsource recompute it - Attack vector
- network (AV:N)source
- EPSS
- 0.30%, higher than 21.0% of all CVEssource
- CISA KEV
- not listedthe KEV catalogue
- Debian urgency
- not yet assignedsource
- 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 |
|---|---|---|
| 5.8 | 6.12.46 | 4ff4f3104da6 |
| 5.8 | 6.16.6 | 0e8630f24c14 |
| 5.8 | 6.17 | 6ead38147ebb |
Debian advisories
| Advisory | Date | Shipped to | Debian |
|---|---|---|---|
| DSA-6008-1 | 2025-09-22 | trixie 6.12.48-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:NAttack vector, network
- `vxlan_rcv` is the UDP tunnel `encap_rcv` handler, so a single crafted VXLAN datagram sent to the VTEP's UDP port from anywhere routable reaches `vxlan_set_mac` → `vxlan_snoop` with a fully attacker-chosen inner source MAC. VXLAN underlays are L3-routed, so the attacker is not confined to the local segment.
- AC:LAttack complexity, low
- One unsolicited packet whose inner source MAC matches an nh-backed FDB entry triggers the NULL dereference deterministically — no race, no memory-layout grooming, no timing window. Learning is the kernel default for new VXLAN devices and nexthop-backed FDB entries are standard EVPN programming, so the required state is ordinary deployment configuration rather than a condition outside the attacker's control.
- PR:NPrivileges required, none
- VXLAN carries no authentication and `vxlan_rcv` performs no source-address or peer validation before handing the inner frame to `vxlan_snoop`. An entirely unauthenticated off-box attacker needs no credentials or account on the target.
- UI:NUser interaction, none
- The crash happens during packet receive processing with no involvement from any local user or administrator. No victim action of any kind is required.
- S:UScope, unchanged
- The fault occurs in the kernel and its impact is confined to that same kernel's security authority. No VM, IOMMU, or sandbox boundary is crossed.
- C:NConfidentiality impact, none
- The dereference is a read of `remote_ip` at offset 0 (and `remote_ifindex` nearby) from a NULL pointer, well inside the unmapped guard page, so no data is read or returned to the attacker. Nothing is disclosed before the fault aborts execution.
- I:NIntegrity impact, none
- Execution faults at the read in `vxlan_addr_equal()`, before the `rdst->remote_ip = *src_ip` assignment, so no write or state modification ever occurs. This is a pure NULL-pointer read with no corruption or control-flow primitive.
- A:HAvailability impact, high
- The NULL dereference oopses in softirq/NAPI context, which takes the `in_interrupt()` path in `die()` and panics the machine ("Fatal exception in interrupt") rather than merely killing a task. A remote attacker can repeat the single triggering packet at will for a persistent whole-system denial of service.