CVE-2026-98276
High · 7.8CVSS
7.8
EPSS
0.1%
Published
Oct 6, 2026
CISA due date
—
Cloudanix analysis
A timing flaw in the Linux kernel's network socket handling can let a program running on the same machine corrupt memory and crash the system or gain extra privileges.
- Exploitation
- Local Privilege
- Attacker needs
- Local User
- Complexity
- Low
- Impact
- Full Compromise
- Component
- OS kernel
- Class
- Race Condition
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Race condition in sock_gettstamp() allows concurrent modification of sk->sk_flags without the socket lock, causing a lost update that clears the SOCK_RCU_FREE bit after udp_lib_get_port() sets it; this leads to immediate socket destruction via sk_destruct() while the UDP receive path holds a stale reference, resulting in use-after-free.
Why it matters to the business
Local attackers on affected Linux systems can trigger kernel crashes or escalate privileges, leading to denial of service, potential container or host compromise, and unplanned downtime; with 17 days since publication and stable low EPSS, the immediate operational risk remains contained to systems running vulnerable kernels without the socket locking fix.
How an attack unfolds
A local attacker crafts two threads that race a UDP bind() operation against an SIOCGSTAMPNS_NEW ioctl; one thread sets SOCK_RCU_FREE while the other overwrites the same word to set SOCK_TIMESTAMP, clearing the RCU bit; the socket is then inserted into the lookup table without RCU protection, so a subsequent receive path dereferences the freed object and triggers the slab use-after-free.
How to fix it
Apply the upstream kernel commit that acquires the socket lock in sock_gettstamp() before calling sock_enable_timestamp(); rebuild and boot the fixed kernel; until then restrict untrusted local code execution and monitor for kernel oops involving udp_queue_rcv_one_skb or ipv4_pktinfo_prepare.
How to confirm the fix worked
Boot the patched kernel and confirm via code review or ftrace that sock_lock is held on the SOCK_TIMESTAMP path in sock_gettstamp(); run the original reproducer under KASAN and verify absence of use-after-free reports; check kernel version strings against the fixed commit.
Typical attack path
- Obtain local unprivileged access on a vulnerable Linux host
- Create a UDP socket and start a bind() in one thread
- Simultaneously issue SIOCGSTAMPNS_NEW ioctl from a second thread
- Trigger the lost-update window that clears SOCK_RCU_FREE
- Force a UDP receive path lookup that dereferences the freed socket
- Execute payload via the resulting use-after-free primitive
How to detect it
Search kernel logs and dmesg for KASAN reports citing slab-use-after-free in ipv4_pktinfo_prepare, udp_queue_rcv_one_skb, or udp_unicast_rcv_skb immediately following bind or timestamp ioctl activity; correlate with process names performing rapid UDP socket operations.
What your security team should do
- Prioritize kernel updates on all multi-tenant or container hosts within the next maintenance window
- Harden local access controls and limit untrusted workloads until patches are deployed
- Add kernel oops and KASAN alert rules to the SIEM for early detection of attempted exploitation
The record
In the Linux kernel, the following vulnerability has been resolved: net: lock the socket in sock_gettstamp() sk->sk_flags must only be changed while holding the socket lock, because sock_set_flag() and sock_reset_flag() use non atomic operations (__set_bit() and __clear_bit()). sock_gettstamp() is one of the last places where a bit of sk->sk_flags is changed from a syscall without owning the socket lock, through sock_enable_timestamp(sk, SOCK_TIMESTAMP). sk_set_memalloc() and sk_clear_memalloc() also change sk->sk_flags without the socket lock, but their callers (nbd, iscsi_tcp, nvme-tcp, sunrpc, wireguard) need a careful audit, this will be addressed in a separate patch. Jungwoo Lee and Wongi Lee reported an UDP socket use-after-free caused by this bug: a SIOCGSTAMPNS_NEW ioctl racing with bind() can cancel the SOCK_RCU_FREE bit that udp_lib_get_port() just set, because both threads perform a read-modify-write on the same word. CPU 0 (bind) CPU 1 (SIOCGSTAMPNS_NEW) -------------------------------- ---------------------------- read sk_flags = F read sk_flags = F compute F | BIT(SOCK_RCU_FREE) compute F | BIT(SOCK_TIMESTAMP) store F | BIT(SOCK_RCU_FREE) sk_add_node_rcu(sk, ...) store F | BIT(SOCK_TIMESTAMP) After the lost update, SOCK_RCU_FREE is clear while the socket is visible to lockless UDP receive lookups. sk_destruct() then frees the socket immediately instead of waiting for a RCU grace period, while the receive path still holds a reference-less pointer to it: BUG: KASAN: slab-use-after-free in ipv4_pktinfo_prepare+0x30/0x410 Read of size 8 at addr ffff888008806610 by task exploit/207 CPU: 0 UID: 1000 PID: 207 Comm: exploit Not tainted 6.12.95+ #1 ipv4_pktinfo_prepare+0x30/0x410 udp_queue_rcv_one_skb+0x51c/0x1180 udp_unicast_rcv_skb+0x109/0x350 ip_protocol_deliver_rcu+0x14b/0x310 ip_local_deliver_finish+0x29d/0x390 ip_local_deliver+0x24d/0x2a0 Only grab the socket lock when SOCK_TIMESTAMP has to be set, to keep the common case lockless.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|