KernelScan.io

HIGH Introduced in 5.15

af_unix SOCKMAP SCM UAF

CVE-2026-53005

CVSS 7.8 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

KernelScan AI7.8HIGH

01

In the Linux kernel, the following vulnerability has been resolved: af_unix: Drop all SCM attributes for SOCKMAP. SOCKMAP can hide inflight fd from AF_UNIX GC. When a socket in SOCKMAP receives skb with inflight fd, sk_psock_verdict_data_ready() looks up the mapped socket and enqueue skb to its psock->ingress_skb. Since neither the old nor the new GC can inspect the psock queue, the hidden skb leaks the inflight sockets. Note that this cannot be detected via kmemleak because inflight sockets are linked to a global list. In addition, SOCKMAP redirect breaks the Tarjan-based GC's assumption that unix_edge.successor is always alive, which is no longer true once skb is redirected, resulting in use-after-free below. [0] Moreover, SOCKMAP does not call scm_stat_del() properly, so unix_show_fdinfo() could report an incorrect fd count. sk_msg_recvmsg() does not support any SCM attributes in the first place. Let's drop all SCM attributes before passing skb to the SOCKMAP layer. [0]: BUG: KASAN: slab-use-after-free in unix_del_edges (net/unix/garbage.c:118 net/unix/garbage.c:181 net/unix/garbage.c:251) Read of size 8 at addr ffff888125362670 by task kworker/56:1/496 CPU: 56 UID: 0 PID: 496 Comm: kworker/56:1 Not tainted 7.0.0-rc7-00263-gb9d8b856689d #3 PREEMPT(lazy) Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-debian-1.17.0-1 04/01/2014 Workqueue: events sk_psock_backlog Call Trace: <TASK> dump_stack_lvl (lib/dump_stack.c:122) print_report (mm/kasan/report.c:379) kasan_report (mm/kasan/report.c:597) unix_del_edges (net/unix/garbage.c:118 net/unix/garbage.c:181 net/unix/garbage.c:251) unix_destroy_fpl (net/unix/garbage.c:317) unix_destruct_scm (./include/net/scm.h:80 ./include/net/scm.h:86 net/unix/af_unix.c:1976) sk_psock_backlog (./include/linux/skbuff.h:?) process_scheduled_works (kernel/workqueue.c:?) worker_thread (kernel/workqueue.c:?) kthread (kernel/kthread.c:438) ret_from_fork (arch/x86/kernel/process.c:164) ret_from_fork_asm (arch/x86/entry/entry_64.S:258) </TASK> Allocated by task 955: kasan_save_track (mm/kasan/common.c:58 mm/kasan/common.c:78) __kasan_slab_alloc (mm/kasan/common.c:369) kmem_cache_alloc_noprof (mm/slub.c:4539) sk_prot_alloc (net/core/sock.c:2240) sk_alloc (net/core/sock.c:2301) unix_create1 (net/unix/af_unix.c:1099) unix_create (net/unix/af_unix.c:1169) __sock_create (net/socket.c:1606) __sys_socketpair (net/socket.c:1811) __x64_sys_socketpair (net/socket.c:1863 net/socket.c:1860 net/socket.c:1860) do_syscall_64 (arch/x86/entry/syscall_64.c:?) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) Freed by task 496: kasan_save_track (mm/kasan/common.c:58 mm/kasan/common.c:78) kasan_save_free_info (mm/kasan/generic.c:587) __kasan_slab_free (mm/kasan/common.c:287) kmem_cache_free (mm/slub.c:6165) __sk_destruct (net/core/sock.c:2282 net/core/sock.c:2384) sk_psock_destroy (./include/net/sock.h:?) process_scheduled_works (kernel/workqueue.c:?) worker_thread (kernel/workqueue.c:?) kthread (kernel/kthread.c:438) ret_from_fork (arch/x86/kernel/process.c:164) ret_from_fork_asm (arch/x86/entry/entry_64.S:258)

02

Engine v0.3.0

Risk summary

A local unprivileged user who can create AF_UNIX sockets and load BPF SOCKMAP programs can trigger a use-after-free in the kernel's Unix garbage collector. The bug allows a freed socket object to be accessed via a stale unix_edge.successor pointer, enabling kernel memory corruption and potentially privilege escalation. Additionally, inflight file descriptors can be hidden from the GC, causing socket leaks.

Affectednet/unix/af_unix.c (AF_UNIX SOCKMAP integration)

Vulnerability analysis

The vulnerability arises from the interaction between AF_UNIX SCM (Socket Control Message) attributes carrying inflight file descriptors and the SOCKMAP/psock layer. When an AF_UNIX socket enrolled in a SOCKMAP receives an skb containing inflight fds (via SCM_RIGHTS), sk_psock_verdict_data_ready() redirects the skb into psock->ingress_skb. Neither the old mark-and-sweep nor the new Tarjan-based GC can inspect the psock ingress queue, so the inflight sockets referenced by those fds are hidden and leaked. More critically, because the GC cannot see the hidden skb, the unix_edge.successor pointer in the GC's edge graph may point to a socket that has since been freed (the redirect target can be destroyed independently), causing a slab-use-after-free when unix_del_edges() dereferences it during GC cleanup. The root cause is that unix_read_skb() and unix_stream_read_skb() passed skbs with live SCM attributes (including attached fds) directly to the SOCKMAP recv_actor without first orphaning those attributes. The fix introduces unix_orphan_scm(), which calls scm_stat_del() to update fd accounting, then unix_destruct_scm() to release the fds and destroy the SCM cookie, and finally resets skb->destructor to sock_wfree — effectively stripping SCM attributes before the skb enters the SOCKMAP layer. This prevents the GC from encountering stale successor pointers and prevents fd leaks. The attack requires a local user with the ability to create AF_UNIX sockets and load BPF SOCKMAP programs (CAP_BPF, reachable via user namespaces on most distros), making PR:Low appropriate. The bug can be triggered through a deterministic sequence of syscalls (socket creation, SOCKMAP enrollment, SCM_RIGHTS transmission, and target socket teardown), so AC:Low is correct.

03

BranchIntroducedFixed inPatch commit
6.125.156.12.9748c41cd2e04a
7.05.157.0.10b34a1d83c74a
mainline5.157.1965dc93481d1
6.185.156.18.40e0a71cbf0c19