CVE-2026-52910: Linux Kernel UDP Reuseport BPF Use-After-Free Race Condition
A race condition exists in the Linux kernel's UDP socket handling code when multiple threads interact with Berkeley Packet Filter (BPF) programs attached to UDP socket groups. Specifically, when one thread replaces an attached BPF program while another thread is processing incoming UDP packets, the kernel may free the old BPF program prematurely without waiting for all packet-processing operations to complete. This can cause the packet processor to read from freed memory, leading to kernel crashes or potential code execution. The issue requires local access and unprivileged user-level code to trigger.
Source data · NVD / CISA · public domain
- CVSS
- 3.1 · 7.8 HIGH · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
- Weaknesses (CWE)
- CWE-125, CWE-364
- Affected products
- 3 configuration(s)
- Published / Modified
- 2026-06-19 / 2026-07-15
NVD description (verbatim)
In the Linux kernel, the following vulnerability has been resolved: bpf: Free reuseport cBPF prog after RCU grace period. Eulgyu Kim reported the splat below with a repro. [0] The repro sets up a UDP reuseport group with a cBPF prog and replaces it with a new one while another thread is sending a UDP packet to the group. The reuseport prog is freed by sk_reuseport_prog_free(). bpf_prog_put() is called for "e"BPF prog to destruct through multiple stages while cBPF prog is freed immediately by bpf_release_orig_filter() and bpf_prog_free(). If a reuseport prog is detached from the setsockopt() path (reuseport_attach_prog() or reuseport_detach_prog()), sk_reuseport_prog_free() is called without waiting for RCU readers to complete, resulting in various bugs. Let's defer freeing the reuseport cBPF prog after one RCU grace period. Note "e"BPF prog is safe as is unless the fast path starts to touch fields destroyed in bpf_prog_put_deferred() and __bpf_prog_put_noref(). [0]: BUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock+0xedc/0x1220 net/core/sock_reuseport.c:596 Read of size 4 at addr ffffc9000051e004 by task slowme/10208 CPU: 6 UID: 1000 PID: 10208 Comm: slowme Not tainted 7.0.0-geb7ac95ff75e #32 PREEMPT(full) Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 Call Trace: <IRQ> dump_stack_lvl+0xe8/0x150 lib/dump_stack.c:120 print_address_description mm/kasan/report.c:378 [inline] print_report+0xca/0x240 mm/kasan/report.c:482 kasan_report+0x118/0x150 mm/kasan/report.c:595 reuseport_select_sock+0xedc/0x1220 net/core/sock_reuseport.c:596 udp4_lib_lookup2+0x3bc/0x950 net/ipv4/udp.c:495 __udp4_lib_lookup+0x768/0xe20 net/ipv4/udp.c:723 __udp4_lib_lookup_skb+0x297/0x390 net/ipv4/udp.c:752 __udp4_lib_rcv+0x1312/0x2620 net/ipv4/udp.c:2752 ip_protocol_deliver_rcu+0x282/0x440 net/ipv4/ip_input.c:207 ip_local_deliver_finish+0x3bb/0x6f0 net/ipv4/ip_input.c:241 NF_HOOK+0x30c/0x3a0 include/linux/netfilter.h:318 NF_HOOK+0x30c/0x3a0 include/linux/netfilter.h:318 __netif_receive_skb_one_core net/core/dev.c:6181 [inline] __netif_receive_skb net/core/dev.c:6294 [inline] process_backlog+0xaa4/0x1960 net/core/dev.c:6645 __napi_poll+0xae/0x340 net/core/dev.c:7709 napi_poll net/core/dev.c:7772 [inline] net_rx_action+0x5d7/0xf50 net/core/dev.c:7929 handle_softirqs+0x22b/0x870 kernel/softirq.c:622 do_softirq+0x76/0xd0 kernel/softirq.c:523 </IRQ> <TASK> __local_bh_enable_ip+0xf8/0x130 kernel/softirq.c:450 local_bh_enable include/linux/bottom_half.h:33 [inline] rcu_read_unlock_bh include/linux/rcupdate.h:924 [inline] __dev_queue_xmit+0x1dd7/0x3710 net/core/dev.c:4890 neigh_output include/net/neighbour.h:556 [inline] ip_finish_output2+0xca9/0x1070 net/ipv4/ip_output.c:237 NF_HOOK_COND include/linux/netfilter.h:307 [inline] ip_output+0x29f/0x450 net/ipv4/ip_output.c:438 ip_send_skb+0x45/0xc0 net/ipv4/ip_output.c:1508 udp_send_skb+0xb04/0x1510 net/ipv4/udp.c:1195 udp_sendmsg+0x1a71/0x2350 net/ipv4/udp.c:1485 sock_sendmsg_nosec net/socket.c:727 [inline] __sock_sendmsg net/socket.c:742 [inline] __sys_sendto+0x554/0x680 net/socket.c:2206 __do_sys_sendto net/socket.c:2213 [inline] __se_sys_sendto net/socket.c:2209 [inline] __x64_sys_sendto+0xde/0x100 net/socket.c:2209 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0x160/0xf80 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x415a2d Code: b3 66 2e 0f 1f 84 00 00 00 00 00 66 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f6bc31e41e8 EFLAGS: 00000212 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 00007f6bc31e4cdc RCX: 0000000000415a2d RDX: 0000000000000001 RSI: 00007f6bc31e421f RDI: 0000000000000003 RBP: 00007f6bc31e4240 R08: 00007f6bc31e4220 R09: 0000000000000010 R10: 0000000000000000 R11: ---truncated---
11 reference(s) · View on NVD →
SEC.co analysis · AI-assisted, reviewed against source
Technical summary
CVE-2026-52910 addresses a use-after-free vulnerability in the Linux kernel's reuseport socket mechanism. The vulnerability occurs in the socket reuse port group's BPF program management, specifically in the function sk_reuseport_prog_free(). When a cBPF (classic BPF) program is detached via setsockopt() (through reuseport_attach_prog or reuseport_detach_prog), the old program is freed immediately without synchronizing with RCU (Read-Copy-Update) grace periods. Concurrently, the UDP packet processing path (udp4_lib_lookup2 → reuseport_select_sock) may still be reading the freed program's fields, resulting in out-of-bounds memory access. The fix defers cBPF program freeing until after one RCU grace period completes, ensuring all in-flight packet lookups finish before memory is reclaimed. Extended BPF (eBPF) programs use a separate multi-stage destruction path (bpf_prog_put_deferred) that already respects RCU semantics and are not affected by this particular race.
Business impact
Systems running vulnerable Linux kernels face availability risk from kernel panics triggered by legitimate UDP traffic interacting with reuseport BPF programs. In containerized and multi-tenant environments where reuseport load balancing is common, an unprivileged user could crash the shared kernel by timing program attachment changes with incoming packets. While the CVSS score reflects high severity due to the integrity and availability impact, real-world exploitation requires precise thread timing and local system access; however, the low barrier to trigger the condition in production workloads makes this a meaningful stability concern for systems using reuseport BPF features.
Affected systems
All Linux kernel versions implementing reuseport BPF program attachment are affected. The vulnerability requires a kernel with BPF and reuseport support enabled (CONFIG_BPF and SO_REUSEPORT). Notably, this does not require the attacker to have root privileges; any local unprivileged user can trigger the race by attaching BPF programs to UDP sockets they own. Container hosts, load balancers, and any system where multiple processes bind to the same UDP port via SO_REUSEPORT are at heightened risk.
Exploitability
The vulnerability is exploitable without special privileges and requires only local system access. An attacker must: (1) create a UDP socket with SO_REUSEPORT enabled; (2) attach a BPF program to the socket group; (3) replace or detach the program via setsockopt while (4) another process simultaneously receives UDP packets on the group. The race window is narrow but reliably reproducible as demonstrated in the reported test case. No network access, authentication, or elevated privileges are needed. However, triggering the exact race condition in production traffic patterns may require trial or specific timing; exploitation is not automatic but feasible for determined actors with local access.
Remediation
Apply the upstream Linux kernel patch that wraps the cBPF program freeing operation (bpf_release_orig_filter and bpf_prog_free) in an RCU-deferred callback, ensuring the memory is not reclaimed until after rcu_read_unlock() completes on all CPUs. This aligns cBPF program lifetime management with eBPF semantics. Verify the patch is included in the stable kernel version shipped by your distribution, as kernel maintainers typically backport critical RCU-related fixes across supported branches. No workaround at the application level can reliably mitigate the race; a kernel update is required.
Patch guidance
Identify which kernel series your systems run (check via `uname -r`). Contact your Linux distribution vendor to obtain the patched kernel version for your branch (e.g., RHEL, Ubuntu LTS, Debian stable). The patch is expected to be available in: (1) upstream kernel versions released after the fix was merged; (2) stable kernel branches (6.1.x, 6.6.x, 6.9.x, etc.) in their next maintenance release; (3) distribution point releases. Do not rely on upstream kernel.org alone; wait for your vendor's official release to ensure compatibility and testing. Test the patched kernel in a non-production environment first, especially if you rely on SO_REUSEPORT for load balancing.
Detection guidance
Monitor kernel logs (dmesg, journalctl -k) for "KASAN: vmalloc-out-of-bounds" or "BUG: unable to handle page fault" messages correlated with reuseport_select_sock or UDP packet processing activity. Systemtap or eBPF tracing can instrument sock_reuseport_prog_free() calls and cross-reference them with active reuseport lookups to identify unpatched systems under simultaneous load. In production, memory sanitizer output (if KASAN is enabled) will clearly log the out-of-bounds read. However, detection of *attempted* exploitation (rather than crash forensics) is difficult without kernel-level instrumentation; focus on timely patching rather than detection strategies.
Why prioritize this
Despite not appearing on the KEV list, this vulnerability merits high priority for systems actively using UDP reuseport load balancing (common in CDNs, DNS servers, game servers, and container orchestration). The combination of (1) local exploitability without privilege escalation, (2) guaranteed availability impact (kernel panic), and (3) relative ease of triggering the race in multi-threaded or containerized environments makes this a material risk. Organizations with multi-tenant Kubernetes clusters or shared hosting should prioritize patching. Lower priority for systems that do not bind multiple UDP sockets to the same port, or those running kernels predating reuseport BPF support.
Risk score, explained
The CVSS 3.1 score of 7.8 (HIGH) reflects: Attack Vector (Local—requires system access), Attack Complexity (Low—race is reliably triggerable), Privileges Required (Low—no elevation needed), User Interaction (None), Scope (Unchanged), and impact on Confidentiality (High due to potential information leak from freed memory), Integrity (High—overwriting freed memory), and Availability (High—kernel crash). The score appropriately captures the severity despite the KEV status being false (KEV likely focuses on active exploitation in the wild rather than theoretical feasibility). Real-world impact can be severe in dense containerized environments where many processes manage ephemeral UDP sockets.
Frequently asked questions
Does this affect all UDP socket operations or only those with BPF programs?
Only UDP sockets that have a BPF program attached via SO_REUSEPORT and reuseport_attach_prog are affected. Standard UDP sockets without BPF programs, or those using other load balancing mechanisms, are unaffected. If your application does not use SO_REUSEPORT with BPF, you are not at risk from this specific vulnerability.
Can this be triggered remotely, or only locally?
Local access is required. An attacker must have the ability to run code or execute system calls on the target machine. However, a local unprivileged user can trigger it; privilege escalation is not a prerequisite. Network-based remote exploitation is not possible.
What is the difference between cBPF and eBPF mentioned in the description?
cBPF (classic BPF) and eBPF (extended BPF) are two generations of in-kernel packet filtering frameworks. This vulnerability affects only cBPF programs because they were freed immediately upon detachment. eBPF programs already use RCU-safe deferred destruction, so they do not have this race condition. The fix aligns cBPF handling with eBPF practices.
If I cannot patch immediately, what operational changes reduce risk?
Avoid dynamically attaching or detaching BPF programs on reuseport sockets during active traffic. If you must change reuseport programs, do so during planned maintenance windows with reduced or halted UDP traffic. However, this is not a true mitigation—only patching the kernel eliminates the vulnerability.
This analysis is derived from the official CVE record and upstream kernel commit messages. Specific patch version numbers, affected kernel releases, and vendor advisory URLs should be verified against your distribution's security bulletins before deployment. Exploitation feasibility and impact may vary significantly based on kernel configuration (KASAN enabled/disabled), presence of reuseport usage in workloads, and timing constraints. This document does not constitute legal advice or a guarantee of security; use it to inform your risk assessment and patch deployment planning. Always test patches in non-production environments first. Source: NVD (public-domain), retrieved 2026-07-27. Analysis generated by SEC.co (claude-haiku-4-5).
Related vulnerabilities
- CVE-2026-10889HIGHCritical ANGLE Sandbox Escape in Google Chrome – Patch to 149.0.7827.53
- CVE-2026-10927HIGHChrome Sandbox Escape via Dawn Out-of-Bounds Read
- CVE-2026-10941HIGHSkia Out-of-Bounds Memory Vulnerability in Chrome – Urgent Patch Required
- CVE-2026-11015HIGHCritical Chrome WebGPU Out-of-Bounds Read Vulnerability
- CVE-2026-11077HIGHChrome Dawn Graphics Vulnerability – Sandbox Escape Risk
- CVE-2026-11091HIGHCritical Chrome Memory Corruption Vulnerability in Dawn Graphics Engine
- CVE-2026-11111HIGHChrome Out-of-Bounds Read in ANGLE Graphics Engine — Patch Guidance
- CVE-2026-11191HIGHOut-of-Bounds Memory Access in Chrome ANGLE Library