CVE-2026-31508
High · 7.8CVSS
7.8
EPSS
0.1%
Published
Apr 22, 2026
CISA due date
—
Cloudanix analysis
A flaw in Linux virtual switching can let someone with local network-management access crash or destabilize a host by deleting virtual network devices at the wrong time.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Privilege Gain
- Component
- OS kernel
- Class
- Race Condition
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Medium
What it actually does
CVE-2026-31508 is a race condition in the Linux kernel Open vSwitch datapath teardown path. During OVS port removal, ovs_netdev_detach_dev() clears the IFF_OVS_DATAPATH flag before device unregistration is fully complete. On preemptible kernels, especially PREEMPT_RT builds, another teardown path can observe the cleared flag, proceed through netdev_destroy(), and free the net_device while unregister logic is still using it. This creates a use-after-free condition in kernel networking code, commonly surfacing as a general protection fault or kernel oops in functions such as dev_set_promiscuity(), ovs_netdev_detach_dev(), dp_device_event(), and unregister_netdevice_many_notify(). The likely practical impact is local denial of service through kernel crash or instability; because the bug is a kernel memory lifetime flaw, confidentiality and integrity impact are theoretically possible if an attacker can reliably shape kernel heap state, but no public exploit maturity is reported.
Why it matters to the business
Systems using Linux kernel Open vSwitch can become unstable or crash when OVS-backed network devices are removed under the vulnerable race condition. This is most operationally relevant for virtualization, container, NFV, SDN, and private-cloud platforms where OVS ports are frequently created and destroyed. A successful exploit could interrupt host networking, disrupt workloads, force node reboots, and reduce availability of services dependent on virtual switching. The vulnerability is not listed in CISA KEV, is not known to be used in ransomware campaigns, and has very low EPSS with a flat 30-day trend, which lowers broad internet exploitation urgency; however, the CVSS score is high because exploitation occurs in kernel context and can have severe host-level consequences once a local attacker has the needed privileges.
How an attack unfolds
An attacker needs local access with the ability to manipulate Open vSwitch or network link state, typically through privileges such as CAP_NET_ADMIN, administrative access to a network namespace, or control over tooling that creates and deletes OVS ports. The attacker repeatedly triggers OVS port teardown, for example by deleting OVS-backed interfaces or datapath ports through iproute2, ovs-vsctl, or netlink operations. On a vulnerable kernel, ovs_netdev_detach_dev() may clear the OVS datapath flag and then be preempted before unregistration finishes. A competing netdevice destroy path can then free the underlying net_device too early. When the original teardown path resumes, it dereferences stale kernel memory, causing a use-after-free. In observed failure modes this results in a kernel oops/general protection fault and may crash the host or destabilize networking; in a more advanced exploitation scenario, an attacker would attempt to win the race repeatedly while grooming kernel memory to influence the freed object.
How to fix it
Upgrade to a Linux kernel version that includes the upstream fix for the Open vSwitch netdevice teardown race. Because no exact fixed package versions were provided, use the security advisories from the operating system or appliance vendor and update to the first kernel build that explicitly references this CVE or the Open vSwitch fix described as avoiding netdev release before teardown completes. Prioritize systems running Open vSwitch, PREEMPT_RT/real-time kernels, virtualization hosts, Kubernetes or container networking nodes using OVS, SDN/NFV infrastructure, and multi-tenant systems where non-root users may gain CAP_NET_ADMIN inside namespaces. If immediate patching is not possible, reduce exposure by restricting local administrative access, limiting CAP_NET_ADMIN delegation, disabling unneeded Open vSwitch functionality, preventing untrusted users from creating network namespaces or OVS ports, and scheduling controlled restarts after kernel updates. Kernel live patching may not be sufficient unless the vendor explicitly states this race is covered.
How to confirm the fix worked
Confirm the running kernel is no longer within the affected vendor range and that the installed package changelog or advisory includes the Open vSwitch teardown fix for this CVE. Validate both the installed kernel package and the actively booted kernel with commands such as uname -a and distribution package queries. Check whether the openvswitch kernel module is loaded with lsmod or modinfo, and inventory hosts using OVS bridges or datapaths with tools such as ovs-vsctl show and ip link. After remediation, perform controlled OVS port create/delete testing in a non-production or maintenance window and verify that kernel logs do not show general protection faults, kernel oops messages, or call traces involving openvswitch teardown functions. For PREEMPT_RT systems, give special attention to testing under realistic OVS churn because the race is more likely to manifest under preemption.
Typical attack path
- Obtain local access to a Linux system that has the Open vSwitch kernel module/datapath in use.
- Gain or already possess permission to create, modify, or delete OVS/network devices, commonly via CAP_NET_ADMIN or equivalent administrative control.
- Create or identify an OVS-backed network interface or port attached to an OVS datapath.
- Repeatedly trigger OVS port or link deletion through netlink, iproute2, or OVS management commands to exercise the vulnerable teardown path.
- Race the clearing of the IFF_OVS_DATAPATH flag against netdevice destruction on a vulnerable/preemptible kernel.
- Cause use-after-free during device unregistration, leading to kernel oops, host crash, or network stack instability.
- Optionally attempt repeated triggering and heap shaping to explore whether the kernel memory corruption can be converted into stronger impact.
How to detect it
Look for evidence of kernel crashes, oopses, or general protection faults during Open vSwitch port deletion or network device teardown. Primary log sources include dmesg, journald/kern.log, /var/log/messages, /var/log/kern.log, crash dumps, kdump/vmcore artifacts, audit logs, shell history, sudo logs, and OVS logs such as ovs-vswitchd.log. Search for call traces containing openvswitch functions, especially ovs_netdev_detach_dev(), dp_device_event(), dev_set_promiscuity(), unregister_netdevice_many_notify(), rtnl_dellink(), and netlink sendmsg activity from tools such as ip or OVS management utilities. Correlate timestamps of kernel oopses with commands that delete links, ports, bridges, or datapaths, including ip link delete, ovs-vsctl del-port, ovs-vsctl del-br, and namespace teardown operations. Because no public exploit is reported and this race can also be triggered by legitimate automation, treat matching logs as suspicious when they coincide with unusual local user activity, unexpected CAP_NET_ADMIN use, repeated port deletion loops, or crashes on systems where OVS churn is not routine.
- Oops: general protection fault
- general protection fault, probably for non-canonical address
- RIP: 0010:dev_set_promiscuity
- dev_set_promiscuity+0x8d/0xa0
- ovs_netdev_detach_dev
- ovs_netdev_detach_dev+0x3a/0x80 [openvswitch]
- dp_device_event
- dp_device_event+0x41/0x80 [openvswitch]
- unregister_netdevice_many_notify
- rtnl_dellink
- rtnetlink_rcv_msg
- netlink_sendmsg
- Comm: ip
- [openvswitch]
- IFF_OVS_DATAPATH
- PREEMPT_RT
- Kdump: loaded
- ip link delete
- ovs-vsctl del-port
- ovs-vsctl del-br
What your security team should do
- Patch or upgrade kernels on systems running Open vSwitch, prioritizing virtualization hosts, container networking nodes, NFV/SDN infrastructure, and PREEMPT_RT kernels.
- Inventory where Open vSwitch is enabled or where the openvswitch kernel module is loaded, rather than treating all Linux systems as equally exposed.
- Restrict CAP_NET_ADMIN, network namespace creation, OVS administration, and local shell access to trusted users only until patched.
- Review kernel logs from vulnerable systems for recent oopses or general protection faults involving openvswitch, dev_set_promiscuity, ovs_netdev_detach_dev, dp_device_event, or unregister_netdevice_many_notify.
- Add SIEM detections for kernel crash traces matching the known failure pattern and correlate with local commands or netlink activity that delete OVS ports or links.
- For platforms with frequent automated OVS port churn, consider temporarily reducing unnecessary interface recreation or moving workloads off vulnerable hosts before maintenance.
- Track vendor advisories for exact fixed kernel package versions because upstream kernel fixes may be backported without changing to a visibly newer upstream version.
- Do not prioritize as an internet-facing mass-exploitation issue based solely on EPSS or KEV status, but treat it as high impact where local administrative boundaries or multi-tenant network administration exist.
The record
In the Linux kernel, the following vulnerability has been resolved: net: openvswitch: Avoid releasing netdev before teardown completes The patch cited in the Fixes tag below changed the teardown code for OVS ports to no longer unconditionally take the RTNL. After this change, the netdev_destroy() callback can proceed immediately to the call_rcu() invocation if the IFF_OVS_DATAPATH flag is already cleared on the netdev. The ovs_netdev_detach_dev() function clears the flag before completing the unregistration, and if it gets preempted after clearing the flag (as can happen on an -rt kernel), netdev_destroy() can complete and the device can be freed before the unregistration completes. This leads to a splat like: [ 998.393867] Oops: general protection fault, probably for non-canonical address 0xff00000001000239: 0000 [#1] SMP PTI [ 998.393877] CPU: 42 UID: 0 PID: 55177 Comm: ip Kdump: loaded Not tainted 6.12.0-211.1.1.el10_2.x86_64+rt #1 PREEMPT_RT [ 998.393886] Hardware name: Dell Inc. PowerEdge R740/0JMK61, BIOS 2.24.0 03/27/2025 [ 998.393889] RIP: 0010:dev_set_promiscuity+0x8d/0xa0 [ 998.393901] Code: 00 00 75 d8 48 8b 53 08 48 83 ba b0 02 00 00 00 75 ca 48 83 c4 08 5b c3 cc cc cc cc 48 83 bf 48 09 00 00 00 75 91 48 8b 47 08 <48> 83 b8 b0 02 00 00 00 74 97 eb 81 0f 1f 80 00 00 00 00 90 90 90 [ 998.393906] RSP: 0018:ffffce5864a5f6a0 EFLAGS: 00010246 [ 998.393912] RAX: ff00000000ffff89 RBX: ffff894d0adf5a05 RCX: 0000000000000000 [ 998.393917] RDX: 0000000000000000 RSI: 00000000ffffffff RDI: ffff894d0adf5a05 [ 998.393921] RBP: ffff894d19252000 R08: ffff894d19252000 R09: 0000000000000000 [ 998.393924] R10: ffff894d19252000 R11: ffff894d192521b8 R12: 0000000000000006 [ 998.393927] R13: ffffce5864a5f738 R14: 00000000ffffffe2 R15: 0000000000000000 [ 998.393931] FS: 00007fad61971800(0000) GS:ffff894cc0140000(0000) knlGS:0000000000000000 [ 998.393936] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 998.393940] CR2: 000055df0a2a6e40 CR3: 000000011c7fe003 CR4: 00000000007726f0 [ 998.393944] PKRU: 55555554 [ 998.393946] Call Trace: [ 998.393949] <TASK> [ 998.393952] ? show_trace_log_lvl+0x1b0/0x2f0 [ 998.393961] ? show_trace_log_lvl+0x1b0/0x2f0 [ 998.393975] ? dp_device_event+0x41/0x80 [openvswitch] [ 998.394009] ? __die_body.cold+0x8/0x12 [ 998.394016] ? die_addr+0x3c/0x60 [ 998.394027] ? exc_general_protection+0x16d/0x390 [ 998.394042] ? asm_exc_general_protection+0x26/0x30 [ 998.394058] ? dev_set_promiscuity+0x8d/0xa0 [ 998.394066] ? ovs_netdev_detach_dev+0x3a/0x80 [openvswitch] [ 998.394092] dp_device_event+0x41/0x80 [openvswitch] [ 998.394102] notifier_call_chain+0x5a/0xd0 [ 998.394106] unregister_netdevice_many_notify+0x51b/0xa60 [ 998.394110] rtnl_dellink+0x169/0x3e0 [ 998.394121] ? rt_mutex_slowlock.constprop.0+0x95/0xd0 [ 998.394125] rtnetlink_rcv_msg+0x142/0x3f0 [ 998.394128] ? avc_has_perm_noaudit+0x69/0xf0 [ 998.394130] ? __pfx_rtnetlink_rcv_msg+0x10/0x10 [ 998.394132] netlink_rcv_skb+0x50/0x100 [ 998.394138] netlink_unicast+0x292/0x3f0 [ 998.394141] netlink_sendmsg+0x21b/0x470 [ 998.394145] ____sys_sendmsg+0x39d/0x3d0 [ 998.394149] ___sys_sendmsg+0x9a/0xe0 [ 998.394156] __sys_sendmsg+0x7a/0xd0 [ 998.394160] do_syscall_64+0x7f/0x170 [ 998.394162] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 998.394165] RIP: 0033:0x7fad61bf4724 [ 998.394188] Code: 89 02 b8 ff ff ff ff eb bb 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 f3 0f 1e fa 80 3d c5 e9 0c 00 00 74 13 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 c3 0f 1f 00 48 83 ec 28 89 54 24 1c 48 89 [ 998.394189] RSP: 002b:00007ffd7e2f7cb8 EFLAGS: 00000202 ORIG_RAX: 000000000000002e [ 998.394191] RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007fad61bf4724 [ 998.394193] RDX: 0000000000000000 RSI: 00007ffd7e2f7d20 RDI: 0000000000000003 [ 998.394194] RBP: 00007ffd7e2f7d90 R08: 0000000000000010 R09: 000000000000003f [ 998.394195] R10: 000055df11558010 R11: 0000000000000202 R12: 00007ffd7e2 ---truncated---
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|