CVE-2026-31469
High · 7.8CVSS
7.8
EPSS
0.1%
Published
Apr 22, 2026
CISA due date
—
Cloudanix analysis
A local user with advanced network permissions could crash certain Linux virtual networking systems by triggering a bug in how old network traffic is cleaned up.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Moderate
- Impact
- Privilege Gain
- Component
- OS kernel
- Class
- Use After Free
- Remediation
- Patch
- Effort
- Low
- Patch risk
- Low
What it actually does
This vulnerability is a use-after-free in the Linux kernel virtio_net driver. When virtio_net is running with transmit NAPI disabled and the network device has the IFF_XMIT_DST_RELEASE flag cleared, socket buffers can remain queued in the virtio transmit ring while still referencing routing destination state. If the associated network namespace is destroyed before those queued buffers are freed, the referenced dst_ops structure may already have been released. A later transmit path cleanup calls dst_release() through the stale destination reference, causing a kernel use-after-free and paging fault. The most direct impact is a local kernel crash or denial of service; because this is a kernel memory-safety issue reachable by a locally privileged user, privilege escalation or broader confidentiality/integrity impact may be possible depending on exploitability, kernel configuration, and memory layout protections.
Why it matters to the business
Systems using Linux virtual network interfaces backed by virtio_net may be exposed to local disruption if users or workloads can manipulate network namespaces, traffic control filters, routes, or related network device configuration. Successful exploitation can crash affected hosts or virtual machines, interrupting applications and services running on them. The vulnerability is not listed in CISA KEV, is not associated with ransomware use, has very low EPSS, and has no reported public exploit maturity in the provided data, so broad internet-scale exploitation is unlikely; however, the operational impact can be high in multi-tenant, containerized, CI/CD, lab, or virtualization-heavy environments where local users or containers have elevated network administration capabilities.
How an attack unfolds
An attacker first needs local access with sufficient privileges to alter network namespace and network device configuration, such as capabilities that permit creating network namespaces, moving a virtio-backed interface into a namespace, configuring traffic control route filters, and modifying routes. The attacker configures a qdisc and route filter in a way that clears IFF_XMIT_DST_RELEASE on the virtio_net device. They then generate traffic so socket buffers are queued in the virtio transmit ring while holding destination references. Next, the attacker destroys the network namespace before those queued buffers have been fully transmitted and freed. When later network transmission triggers virtio_net cleanup through free_old_xmit(), the driver releases an skb destination whose dst_ops has already been freed, leading to a kernel use-after-free and typically a kernel oops, panic, or crash. No named threat actor exploitation is reported in the provided intelligence.
How to fix it
Apply a Linux kernel update from the affected distribution or kernel vendor that includes the virtio_net fix adding skb_dst_drop(skb) in start_xmit before the skb is queued. No exact fixed package versions were provided in the input, so remediation should be tracked through the relevant distribution advisories for the deployed kernel branch. Prioritize hosts and virtual machines that use virtio_net and allow local users, containers, or automation to create network namespaces or manage traffic control. If immediate patching is not possible, reduce exposure by limiting CAP_NET_ADMIN, restricting unprivileged user namespaces where feasible, preventing untrusted workloads from moving physical or virtual interfaces into network namespaces, limiting access to tc and ip route operations, and monitoring or disabling risky traffic-control route filter workflows on virtio_net interfaces. Reboot into the patched kernel after installation; merely installing kernel packages is not sufficient if the running kernel remains vulnerable.
How to confirm the fix worked
Confirm the running kernel, not just the installed kernel package, has been updated to a vendor build containing the virtio_net fix. Validate with commands such as uname -r, package-manager kernel inventory, and the distribution security advisory for this CVE. Confirm virtio_net is present or in use with lsmod, modinfo virtio_net, ethtool -i <interface>, or by inspecting /sys/class/net/*/device/driver. Verify that high-risk local capabilities are constrained by checking container runtime profiles, Linux capabilities, sudo rules, and whether untrusted users can run ip netns, tc qdisc, tc filter, or ip route commands. For regression testing in non-production only, reproduce the vulnerable traffic-control and network-namespace sequence against a patched test host and verify that it does not produce a kernel oops, panic, or call trace involving dst_release(), skb_release_head_state(), __free_old_xmit(), or virtio_net start_xmit().
Typical attack path
- Obtain local access to a Linux system using a virtio_net network device.
- Gain or already possess network administration capability, such as CAP_NET_ADMIN, root privileges, or equivalent container/namespace privileges.
- Configure traffic control qdisc and route filter rules that clear IFF_XMIT_DST_RELEASE on the target virtio_net network device.
- Move or configure the virtio-backed network interface inside a network namespace.
- Generate network traffic so socket buffers remain pending in the virtio transmit ring.
- Delete the network namespace while those socket buffers still reference destination routing state.
- Trigger subsequent transmission on the virtio_net device, causing free_old_xmit() to clean up stale queued buffers.
- Cause dst_release() to operate on freed dst_ops memory, resulting in a kernel fault and likely denial of service.
How to detect it
Look for evidence of kernel crashes, oops events, panics, or paging faults involving virtio_net transmit cleanup. Relevant sources include journalctl -k, /var/log/kern.log, /var/log/messages, dmesg output, crash dump metadata, kdump/vmcore analysis, hypervisor reset events, and endpoint telemetry that records local execution of network administration commands. Search for command activity involving tc qdisc, tc filter route rules, ip route realm configuration, ip netns creation/deletion, and movement of virtio-backed interfaces into namespaces immediately before a crash. In containerized environments, review auditd, eBPF, EDR, shell history, sudo logs, and container runtime logs for processes invoking ip, tc, ifconfig, ping, or scripts that repeatedly create and delete network namespaces. Exploitation is most likely to leave denial-of-service artifacts rather than durable files. Kernel traces containing dst_release(), skb_release_head_state(), napi_consume_skb(), __free_old_xmit(), free_old_xmit(), start_xmit(), or drivers/net/virtio_net.c are strong indicators that the crash path matches this vulnerability, though they should be correlated with local namespace and traffic-control activity to distinguish testing from accidental triggering.
- Unable to handle kernel paging request
- virtio_net: Fix UAF on dst_ops
- dst_release+0xe0/0x110
- skb_release_head_state
- sk_skb_reason_drop
- dev_kfree_skb_any_reason
- napi_consume_skb
- __free_old_xmit
- free_old_xmit
- start_xmit
- drivers/net/virtio_net.c
- lib/percpu_counter.c:98
- net/core/dst.c:177
- net/core/skbuff.c:1177
- net/core/skbuff.c:1255
- net/core/dev.c:3469
- net/core/skbuff.c:1527
- tc qdisc add dev
- tc filter add dev
- protocol ip prio 100 route
- ip route add
- realm 100
- ip netns add
- ip netns del
- ip link set
- IFF_XMIT_DST_RELEASE
- napi_tx=N
What your security team should do
- Inventory Linux hosts and virtual machines using virtio_net, especially virtualization, cloud, container, CI/CD, and multi-tenant systems.
- Prioritize kernel updates for systems where untrusted or semi-trusted users can obtain CAP_NET_ADMIN, create network namespaces, configure tc filters, or manage routes.
- Restrict CAP_NET_ADMIN and unprivileged namespace creation for workloads that do not explicitly require them.
- Review container and orchestration policies to prevent untrusted containers from moving host or virtio-backed interfaces into network namespaces.
- Monitor kernel logs for crashes or call traces matching virtio_net transmit cleanup, dst_release(), skb_release_head_state(), and use-after-free symptoms.
- Ensure patched kernel packages are followed by host reboot or live-patch confirmation, as applicable.
- Because EPSS is low, KEV status is false, and no exploit maturity is reported, treat this as targeted/local-risk remediation rather than an emergency internet-facing patch, unless affected systems are multi-tenant or grant network administration capabilities broadly.
The record
In the Linux kernel, the following vulnerability has been resolved: virtio_net: Fix UAF on dst_ops when IFF_XMIT_DST_RELEASE is cleared and napi_tx is false A UAF issue occurs when the virtio_net driver is configured with napi_tx=N and the device's IFF_XMIT_DST_RELEASE flag is cleared (e.g., during the configuration of tc route filter rules). When IFF_XMIT_DST_RELEASE is removed from the net_device, the network stack expects the driver to hold the reference to skb->dst until the packet is fully transmitted and freed. In virtio_net with napi_tx=N, skbs may remain in the virtio transmit ring for an extended period. If the network namespace is destroyed while these skbs are still pending, the corresponding dst_ops structure has freed. When a subsequent packet is transmitted, free_old_xmit() is triggered to clean up old skbs. It then calls dst_release() on the skb associated with the stale dst_entry. Since the dst_ops (referenced by the dst_entry) has already been freed, a UAF kernel paging request occurs. fix it by adds skb_dst_drop(skb) in start_xmit to explicitly release the dst reference before the skb is queued in virtio_net. Call Trace: Unable to handle kernel paging request at virtual address ffff80007e150000 CPU: 2 UID: 0 PID: 6236 Comm: ping Kdump: loaded Not tainted 7.0.0-rc1+ #6 PREEMPT ... percpu_counter_add_batch+0x3c/0x158 lib/percpu_counter.c:98 (P) dst_release+0xe0/0x110 net/core/dst.c:177 skb_release_head_state+0xe8/0x108 net/core/skbuff.c:1177 sk_skb_reason_drop+0x54/0x2d8 net/core/skbuff.c:1255 dev_kfree_skb_any_reason+0x64/0x78 net/core/dev.c:3469 napi_consume_skb+0x1c4/0x3a0 net/core/skbuff.c:1527 __free_old_xmit+0x164/0x230 drivers/net/virtio_net.c:611 [virtio_net] free_old_xmit drivers/net/virtio_net.c:1081 [virtio_net] start_xmit+0x7c/0x530 drivers/net/virtio_net.c:3329 [virtio_net] ... Reproduction Steps: NETDEV="enp3s0" config_qdisc_route_filter() { tc qdisc del dev $NETDEV root tc qdisc add dev $NETDEV root handle 1: prio tc filter add dev $NETDEV parent 1:0 \ protocol ip prio 100 route to 100 flowid 1:1 ip route add 192.168.1.100/32 dev $NETDEV realm 100 } test_ns() { ip netns add testns ip link set $NETDEV netns testns ip netns exec testns ifconfig $NETDEV 10.0.32.46/24 ip netns exec testns ping -c 1 10.0.32.1 ip netns del testns } config_qdisc_route_filter test_ns sleep 2 test_ns
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-119338 Tesseract is an open source OCR engine. CWE-416
- CVE-2026-119332 Ladybird is a truly independent web browser. CWE-416
- CVE-2026-119116 A use-after-free and double-free issue in the SetClient command handler of the… CWE-416
- CVE-2026-119378 SQLite before 3.54.0 contains a use-after-free vulnerability in the R-Tree extension that… CWE-416
- CVE-2026-119372 SQLite before 3.54.0 built with FTS3/FTS4 and SQLITE_ENABLE_FTS3_PARENTHESIS contains a… CWE-416
- CVE-2026-65586 Software installed and run as a non-privileged user may conduct improper GPU system calls… CWE-416
- CVE-2026-15466 Software installed and run as a non-privileged user may conduct improper GPU system calls… CWE-416
- CVE-2026-76031 Use after free in Input in Google Chrome prior to 156.0.8078.79 allowed a remote attacker… CWE-416