Linux Kernel
CVE-2024-36972
HIGH
Severity by source
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
AV:L and PR:L confirmed by local-only code path; AC:H reflects race-condition timing requirement not captured by official AC:L.
Primary rating from Vendor (416baaa9-dc9f-4396-8d5f-8c081fb06d67).
CVSS VectorVendor: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
Lifecycle Timeline
6DescriptionCVE.org
In the Linux kernel, the following vulnerability has been resolved:
af_unix: Update unix_sk(sk)->oob_skb under sk_receive_queue lock.
Billy Jheng Bing-Jhong reported a race between __unix_gc() and queue_oob().
__unix_gc() tries to garbage-collect close()d inflight sockets, and then if the socket has MSG_OOB in unix_sk(sk)->oob_skb, GC will drop the reference and set NULL to it locklessly.
However, the peer socket still can send MSG_OOB message and queue_oob() can update unix_sk(sk)->oob_skb concurrently, leading NULL pointer dereference. [0]
To fix the issue, let's update unix_sk(sk)->oob_skb under the sk_receive_queue's lock and take it everywhere we touch oob_skb.
Note that we defer kfree_skb() in manage_oob() to silence lockdep false-positive (See [1]).
[0]: BUG: kernel NULL pointer dereference, address: 0000000000000008 PF: supervisor write access in kernel mode PF: error_code(0x0002) - not-present page PGD 8000000009f5e067 P4D 8000000009f5e067 PUD 9f5d067 PMD 0 Oops: 0002 [#1] PREEMPT SMP PTI CPU: 3 PID: 50 Comm: kworker/3:1 Not tainted 6.9.0-rc5-00191-gd091e579b864 #110 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014 Workqueue: events delayed_fput RIP: 0010:skb_dequeue (./include/linux/skbuff.h:2386 ./include/linux/skbuff.h:2402 net/core/skbuff.c:3847) Code: 39 e3 74 3e 8b 43 10 48 89 ef 83 e8 01 89 43 10 49 8b 44 24 08 49 c7 44 24 08 00 00 00 00 49 8b 14 24 49 c7 04 24 00 00 00 00 <48> 89 42 08 48 89 10 e8 e7 c5 42 00 4c 89 e0 5b 5d 41 5c c3 cc cc RSP: 0018:ffffc900001bfd48 EFLAGS: 00000002 RAX: 0000000000000000 RBX: ffff8880088f5ae8 RCX: 00000000361289f9 RDX: 0000000000000000 RSI: 0000000000000206 RDI: ffff8880088f5b00 RBP: ffff8880088f5b00 R08: 0000000000080000 R09: 0000000000000001 R10: 0000000000000003 R11: 0000000000000001 R12: ffff8880056b6a00 R13: ffff8880088f5280 R14: 0000000000000001 R15: ffff8880088f5a80 FS: 0000000000000000(0000) GS:ffff88807dd80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000008 CR3: 0000000006314000 CR4: 00000000007506f0 PKRU: 55555554 Call Trace: <TASK> unix_release_sock (net/unix/af_unix.c:654) unix_release (net/unix/af_unix.c:1050) __sock_release (net/socket.c:660) sock_close (net/socket.c:1423) __fput (fs/file_table.c:423) delayed_fput (fs/file_table.c:444 (discriminator 3)) process_one_work (kernel/workqueue.c:3259) worker_thread (kernel/workqueue.c:3329 kernel/workqueue.c:3416) kthread (kernel/kthread.c:388) ret_from_fork (arch/x86/kernel/process.c:153) ret_from_fork_asm (arch/x86/entry/entry_64.S:257) </TASK> Modules linked in: CR2: 0000000000000008
AnalysisAI
NULL pointer dereference in the Linux kernel's af_unix subsystem crashes the kernel when a local low-privilege attacker triggers a race between Unix domain socket garbage collection and out-of-band message queuing. The __unix_gc() function locklessly nulls unix_sk(sk)->oob_skb while queue_oob() can concurrently update the same pointer, producing a write-access fault at address 0x8 as confirmed by the supplied kernel oops trace. No public exploit identified at time of analysis, and EPSS at 0.67% (48th percentile) places real-world exploitation probability well below the severity implied by the CVSS 7.8 score.
Technical ContextAI
The vulnerability lives in the af_unix kernel subsystem (net/unix/af_unix.c), which implements POSIX Unix-domain sockets. The af_unix garbage collector (__unix_gc()) is responsible for reclaiming inflight, close()d sockets that hold references in circular chains. When such a socket carries an MSG_OOB (out-of-band) message, GC reads and NULLs unix_sk(sk)->oob_skb without holding sk_receive_queue.lock. Simultaneously, a still-active peer may call queue_oob(), which writes a new skb pointer to the same field. The resulting unsynchronised concurrent access produces a NULL-pointer dereference at skb_dequeue(), crashing the kernel. CWE-476 (NULL Pointer Dereference) precisely describes the root cause: a pointer is dereferenced after being set to NULL by a competing thread without a lock guard. The fix serialises all reads and writes to oob_skb under sk_receive_queue.lock and defers kfree_skb() in manage_oob() to avoid a lockdep false-positive. CPE: cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*.
RemediationAI
Apply the upstream kernel stable patches: https://git.kernel.org/stable/c/4708f49add84a57ce0ccc7bf9a6269845c631cc3, https://git.kernel.org/stable/c/9841991a446c87f90f66f4b9fee6fe934c1336a2, and the three associated companion commits covering additional stable branches. Linux distribution vendors (Red Hat, Canonical, SUSE, Debian) should be releasing updated kernel packages incorporating these fixes; update via the standard package manager (dnf update kernel, apt upgrade linux-image-*, etc.) once backports are published. If patching is temporarily unavailable, restricting local interactive user access to affected systems (removing shell access for untrusted accounts, enforcing strong namespace isolation in container runtimes) reduces the attack surface, since AV:L mandates local code execution. Disabling Unix domain sockets entirely is not a viable workaround as systemd, D-Bus, and other critical system services depend on them. No additional compensating control exists that surgically blocks the af_unix OOB path without broader service disruption.
Same weakness CWE-476 – NULL Pointer Dereference
View allSame technique Denial Of Service
View allShare
External POC / Exploit Code
Leaving vuln.today