data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-93111 in the interactive tracker

CVE-2026-93111

bpf: Mark tracing_multi trampolines as ftrace managed

7.8 EPSS 0.2% AV:L

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem kernel/bpf. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-93111 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
Debian 14forkynot affected7.2.11-1Nothing to do. forky never shipped the vulnerable code.
Debian unstablesidnot affected7.2.11-1Nothing to do. sid never shipped the vulnerable code.

The vulnerability

What the bug is

Since tracing_multi link does not set ftrace_managed, it would fail to release the tracing_multi link when attaching tracing_multi link and then attaching fentry link. [ 3.714215] WARNING: kernel/bpf/trampoline.c:1727 at bpf_trampoline_multi_detach+0x20b/0x240, CPU#1: test_progs/97 ... [ 3.733170] bpf_tracing_multi_link_release+0x14/0x30 [ 3.733890] bpf_link_free+0x58/0x130 [ 3.734414] bpf_link_release+0x23/0x30 Fix it by setting 'ftrace_managed = true' in register_fentry_multi().

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

kernel/bpf/trampoline.c

What this is
BPF [CORE]MAINTAINERS section matched on kernel/bpf/trampoline.c · bpf@vger.kernel.org · Maintained

Check it on the machine

grep -wE 'CONFIG_BPF|CONFIG_BPF_JIT' /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

Show whether Debian builds this, per release

Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.

  • bookwormy
  • trixie, forky, sidYnot built on s390x/s390x
y
built into the kernel image on every flavour - only a patch removes it
Y
built in where it is built at all; some flavours do not build it
Build switches
CONFIG_BPF, CONFIG_BPF_JIT
Reads as
all on means the file is compiled; any one off means it is not.

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-17 (31 days ago)source
CVSS
7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.17%, higher than 5.3% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
kernel/bpf

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
7.27.2.6280145253fd3
7.27.330bdd6d1384d

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:LAttack vector, local
Reached only via local bpf(2): BPF_PROG_LOAD of BPF_TRACE_FENTRY_MULTI then BPF_LINK_CREATE → link_create() → bpf_tracing_multi_attach() → register_fentry_multi(), then a regular BPF_TRACE_FENTRY BPF_LINK_CREATE through bpf_tracing_prog_attach(). The trigger is that attach order, not a remote protocol message.
AC:LAttack complexity, low
The attacker chooses the order: tracing_multi first so register_fentry_multi() never sets tr->func.ftrace_managed, then fentry so modify_fentry() takes bpf_arch_text_poke() instead of direct_ops_mod(), then close() of the tracing_multi fd into bpf_trampoline_multi_detach(). No race or uninfluenced victim state is required.
PR:LPrivileges required, low
bpf_prog_load() for BPF_PROG_TYPE_TRACING (fentry.multi and fentry) requires bpf_token_capable(CAP_BPF) and, via is_perfmon_prog_type(), bpf_token_capable(CAP_PERFMON). Those caps are delegable with a BPF token into a non-init user namespace, so this is Low rather than init-namespace root.
UI:NUser interaction, none
The attacker loads both programs, creates the tracing_multi and fentry links, and closes the tracing_multi fd themselves (bpf_link_release → bpf_tracing_multi_link_release). No other user must mount, open, or otherwise act on attacker-supplied objects.
S:UScope, unchanged
The use-after-free is of a kernel bpf_tramp_image that remains an ftrace direct-call target. That is in-kernel privilege escalation, not a KVM/Xen guest-to-host or IOMMU boundary cross, so scope stays Unchanged.
C:HConfidentiality impact, high
modify_fentry() text-pokes the fentry site to Image B and bpf_tramp_image_put()s Image A; bpf_trampoline_multi_detach() still bpf_tramp_image_put()s Image B in bpf_trampoline_multi_attach_free() after update_ftrace_direct_del/mod fails, so a later call of the hooked function executes freed trampoline memory.
I:HIntegrity impact, high
The hooked function’s live CALL/JMP still targets the trampoline image bpf_trampoline_multi_attach_free() freed after the failed ftrace update, so reclaiming that JIT page hijacks control flow at the ftrace site (arbitrary kernel write/execute).
A:HAvailability impact, high
bpf_trampoline_multi_detach() hits WARN_ON_ONCE(update_ftrace_direct_del()) at trampoline.c:1727 when ftrace’s recorded direct target no longer matches the poked site, and the subsequent jump into the freed bpf_tramp_image oopses or panics.