Cloudanix VulnDB

CVE-2026-23319

High · 7.8

CVSS

7.8

EPSS

0.1%

Published

Mar 25, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A bug in the Linux kernel can let someone who already has access to the computer crash it or take it over completely.

Exploitation
Local Privilege
Attacker needs
Low Privilege
Complexity
Low
Impact
Full Compromise
Component
OS kernel
Class
Use After Free
Remediation
Patch
Effort
Medium
Patch risk
Low

What it actually does

Use-after-free in the Linux kernel BPF subsystem where bpf_link_put drops the refcount on shim_link->link.link to zero while cgroup_shim_find can still reference the object via tr->progs_hlist; the deferred cleanup in bpf_shim_tramp_link_release creates a window for another process to dereference the freed memory through bpf_trampoline_link_cgroup_shim.

Why it matters to the business

Local attackers on affected Linux systems can trigger kernel crashes or arbitrary code execution, resulting in denial of service, privilege escalation, or full host compromise; with over 215 days since publication and slowly rising exploit probability, unpatched kernels in production or container environments remain exposed.

How an attack unfolds

An attacker with local access crafts BPF programs and cgroup attachments that race bpf_link_put against concurrent lookups in cgroup_shim_find; the window created by deferred trampoline cleanup allows the freed shim object to be dereferenced, leading to a use-after-free that can be turned into memory corruption or control-flow hijacking.

How to fix it

Apply the upstream fix that adds an atomic non-zero refcount check inside bpf_trampoline_link_cgroup_shim before incrementing; rebuild and deploy updated kernel packages as soon as vendor fixes become available; until then, restrict untrusted local access and BPF program loading via LSM policies or seccomp.

How to confirm the fix worked

Confirm the patch is present by inspecting the bpf_trampoline_link_cgroup_shim function for the atomic refcount guard; run the provided delay-based reproducer in a test environment to verify the crash no longer occurs after millions of iterations.

Typical attack path

  1. Obtain local user or container access on a vulnerable kernel
  2. Load and attach BPF programs that exercise trampoline cgroup shims
  3. Trigger concurrent bpf_link_put operations while cgroup_shim_find walks progs_hlist
  4. Exploit the resulting use-after-free for memory corruption or code execution

How to detect it

Inspect kernel logs and crash dumps for oops or panic traces mentioning bpf_trampoline_link_cgroup_shim, bpf_shim_tramp_link_release, or progs_hlist; correlate with audit events showing unusual BPF program loads or cgroup attachments around the time of the crash.

What your security team should do

  • Prioritize kernel updates for all systems that allow unprivileged BPF or cgroup operations
  • Monitor vendor advisories for the exact fixed kernel versions once released
  • Temporarily disable untrusted BPF loading or enforce via CAP_BPF and LSM
  • Audit production workloads for direct use of cgroup BPF trampolines

The record

In the Linux kernel, the following vulnerability has been resolved: bpf: Fix a UAF issue in bpf_trampoline_link_cgroup_shim The root cause of this bug is that when 'bpf_link_put' reduces the refcount of 'shim_link->link.link' to zero, the resource is considered released but may still be referenced via 'tr->progs_hlist' in 'cgroup_shim_find'. The actual cleanup of 'tr->progs_hlist' in 'bpf_shim_tramp_link_release' is deferred. During this window, another process can cause a use-after-free via 'bpf_trampoline_link_cgroup_shim'. Based on Martin KaFai Lau's suggestions, I have created a simple patch. To fix this: Add an atomic non-zero check in 'bpf_trampoline_link_cgroup_shim'. Only increment the refcount if it is not already zero. Testing: I verified the fix by adding a delay in 'bpf_shim_tramp_link_release' to make the bug easier to trigger: static void bpf_shim_tramp_link_release(struct bpf_link *link) { /* ... */ if (!shim_link->trampoline) return; + msleep(100); WARN_ON_ONCE(bpf_trampoline_unlink_prog(&shim_link->link, shim_link->trampoline, NULL)); bpf_trampoline_put(shim_link->trampoline); } Before the patch, running a PoC easily reproduced the crash(almost 100%) with a call trace similar to KaiyanM's report. After the patch, the bug no longer occurs even after millions of iterations.

Affected packages

Ecosystem Package Introduced Fixed
openSUSE:Leap 16.0 dtb-aarch64 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-64kb 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-azure 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-default 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-default-base 0 6.12.0-160000.27.1.160000.2.8
openSUSE:Leap 16.0 kernel-docs 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-kvmsmall 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-obs-build 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-obs-qa 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-rt 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-source 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-syms 0 6.12.0-160000.28.1
openSUSE:Leap 16.0 kernel-zfcpdump 0 6.12.0-160000.28.1

Related vulnerabilities