
Forschungs-Repository für CVE-2025-38502, einen Out-of-Bounds-Zugriff auf den lokalen Speicher der Linux-Kernel-BPF-Cgroup über Tail Calls, der lokale Rechteausweitung ermöglicht.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Linux-Kernel-BPF-Cgroup-Local-Storage-Out-of-Bounds-Zugriff über Tail Calls
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — Out-of-bounds Read |
| Hersteller | Linux-Kernel |
| Komponente | kernel/bpf/core.c, include/linux/bpf.h (Cgroup Local Storage + Tail Calls) |
| Auswirkung | Lokale Kernel-Speicherbeschädigung; Privilegieneskalation ist auf ungepatchten Kerneln im Rahmen des Möglichen |
| Angriffsvektor | Lokal (AV:L) |
| Privilegien | Niedrig (PR:L) — ein Prozess, der BPF-Programme vom Typ CGROUP_SKB (oder äquivalente cgroup-attached Programme) laden kann |
| Benutzerinteraktion | Keine |
| CVSS 3.1 (kernel.org CNA) | 7.8 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 3.1 (NVD) | 7.1 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H |
| Veröffentlicht | 16. August 2025 |
| Upstream-Fix | abad3d0 in 6.17-rc1; zurückportiert nach 6.16.1, 6.12.46, 6.6.105, 6.1.151, 5.15.192 |
Nur für Forschung / Bildungszwecke. Führen Sie Material in diesem Repository nicht aus, setzen Sie es nicht ein und verwenden Sie es nicht gegen einen Host, es sei denn, Sie haben die ausdrückliche schriftliche Genehmigung sowohl der Partei, die dieses Repository hostet, als auch des Eigentümers der Zielsysteme. In freier Wildbahn gefunden.
Der Quelldateiname CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c schneidet den Bezeichner ab. Der veröffentlichte Eintrag ist CVE-2025-38502. Es gibt kein Linux-CVE CVE-2025-3850.
Lonial meldete, dass Cgroup-BPF-Local-Storage über einen Tail Call hinweg außerhalb der Grenzen zugegriffen werden kann.
Der eBPF-Verifier prüft jedes Programm isoliert auf Typen. Zur Laufzeit sucht bpf_get_local_storage() nicht die Map des aktuell ausgeführten Programms. Es liest den Cgroup-Storage-Zeiger aus current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. Dieser Slot wird vom ursprünglich angehängten Programm befüllt, nicht von dem Programm, in das per Tail Call gesprungen wurde.
Wenn Programm A (kleine BPF_MAP_TYPE_CGROUP_STORAGE-Wertgröße) per Tail Call in Programm B (große Wertgröße) springt, liefert bpf_get_local_storage() von B weiterhin den kleineren Puffer von A. Zugriffe, die der Verifier gegen B's Map erlaubt hat, laufen dann über das Ende von A's Allokation hinaus.
Der Defekt wurde in Linux 5.9 durch 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup) eingeführt. Behoben wurde er durch Erweiterung von bpf_map_owner um ein storage_cookie[], sodass Tail-Call-Kombinationen nur akzeptiert werden, wenn der Callee dieselben Cgroup-Storage-Maps wie der Caller verwendet oder gar keine.
Dies ist ein lokaler Kernel-Heap-Out-of-Bounds-Zugriff. Die Schweregradbewertung variiert je nach Hersteller, weil sie sich uneinig darüber sind, ob das Primitiv ein „Read-only-DoS“ oder vollständige Speicherbeschädigung ist:
Was das in der Praxis bedeutet:
struct bpf_array) können beschädigt werden.map->ops, Hijacking eines Helpers, commit_creds / Namespace-Wechsel). Deshalb bezeichnet dieser Tree das Problem als LPE. Red Hats niedrigerer Score spiegelt deren produktspezifische Bewertung wider, nicht die Abwesenheit des Bugs.Der Bug erfordert keinen netzwerkseitig erreichbaren Dienst. Er ist lokal. Er erfordert kein TTY, keinen setuid-Helper und keine Benutzerinteraktion.
Zwei Cgroup-BPF-Programme, jedes mit eigenem BPF_MAP_TYPE_CGROUP_STORAGE (Shared-Flavor, BPF_CGROUP_STORAGE_SHARED):
| Programm | Rolle | Storage-Wertgröße |
|---|---|---|
| A | angehängt / Tail-Call-Caller | klein (z. B. passt in eine gegebene kmalloc-Order) |
| B | Tail-Call-Ziel | groß (Verifier erlaubt Zugriffe bis zu dieser Größe) |
Der Verifier prüft A gegen A's Map und B gegen B's Map. Beide bestehen.
Zur Laufzeit macht der Helper Folgendes:
ctx = container_of(current->bpf_ctx, struct bpf_cg_run_ctx, run_ctx);
storage = ctx->prog_item->cgroup_storage[stype];
if (stype == BPF_CGROUP_STORAGE_SHARED)
ptr = &READ_ONCE(storage->buf)->data[0];
else
ptr = this_cpu_ptr(storage->percpu_buf);
prog_item ist der Array-Eintrag für das Programm, das den Cgroup-Run gestartet hat, nicht für das Programm, das nach bpf_tail_call aktuell ausgeführt wird. B arbeitet daher auf A's Storage-Objekt.
bpf_cgroup_storage_alloc() dimensioniert den zugrunde liegenden Puffer anhand der value_size der Map. A's Puffer ist zu klein für B's verifizierte Zugriffe. Das Ergebnis ist eine klassische Typverwechslung der Map-Identität über einen Kontrolltransfer hinweg — dieselbe Bug-Familie wie andere BPF-Probleme, bei denen „der Helper eine andere Map sieht als der Verifier“.
Commit 7d9c342 machte Cgroup-Storages zwischen Programmen, die an dieselbe Cgroup angehängt sind, geteilt. Diese Teilung ist der Grund, warum der Run-Context-Slot ein einzelner Zeiger ist statt eines Lookups pro Programm, und warum Kernel vor 5.9 nicht betroffen sind.
BPF_PROG_TEST_RUN auf einem BPF_PROG_TYPE_CGROUP_SKB-Programm allokiert Cgroup-Storage für die Dauer des Tests. Diese Allokation liegt auf dem Kernel-Heap neben allem anderen, was kürzlich in derselben Größenklasse freigegeben wurde — einschließlich struct bpf_array-Maps, deren value_size so gewählt wurde, dass sie in derselben kmalloc-Order landen. Ein OOB vom Storage-Puffer kann daher bpf_map-Felder (ops, RCU-Liste, value[]) einer benachbarten Array-Map erreichen.
Dieses Heap-Layout-Detail ist der Grund, warum ein „bloßes OOB-Read“-Advisory und ein LPE-Write-up dieselbe CVE beschreiben können.
Eingeführt: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
Nicht betroffen: alle Kernel vor 5.9
Einzeiler:
/* CVE-2025-38502: affected 5.9–5.15.191, 5.16–6.1.150, 6.2–6.6.104, 6.7–6.12.45, 6.13–6.16.0; fixed in 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */
In einigen Stables noch offen: Debian's Kernel-Tracker listete 5.10 Upstream-Stable / bullseye 5.10 als needed. Gehen Sie nicht davon aus, dass jedes 5.10.y gepatcht ist.
Distro-ABI-Nummern täuschen. Ubuntu 5.15.0-163 ist ein gepatchter 5.15, obwohl 5.15.0 älter aussieht als Upstream 5.15.192. Vergleichen Sie das Paket-Changelog / USN / DSA / ALAS / RHSA, nicht uname -r mit der obigen Tabelle.
Jede Distribution, die einen Kernel in den obigen Bereichen ausgeliefert hat, war im Rahmen, bis sie abad3d0 (oder den passenden Stable-Commit) zurückportiert hat. Dies ist generischer BPF-Code, kein distro-spezifischer Patch.
Ubuntu 26.04 / 25.10 sind als nicht betroffen gelistet (sie zweigten nach dem Fix ab). Ubuntu 25.04 erreichte EOL weiterhin needed.
Ein Host kann einer betroffenen Version entsprechen und dennoch nicht erreichbar sein. Nützliche Prüfungen:
unprivileged_bpf_disabled=1 ist kein vollständiger Fix — ein Benutzer mit BPF-Capability kann den Bug weiterhin auslösen — aber es entfernt den unprivilegierten Pfad.
Upstream-Commit abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage, Daniel Borkmann).
struct bpf_map_owner erhält ein storage_cookie[]-Array. Beim Update des Tail-Call-Ziels macht der Kernel nun Folgendes:
bpf_get_local_storage() verwendet — verlange, dass die Cgroup-Storage-Maps des Callee exakt die Maps des Caller sind (gleiche Cookies).Nicht übereinstimmende Wertgrößen können nicht mehr hinter dem Rücken des Verifiers kombiniert werden. Jedes Programm wird weiterhin allein verifiziert; die neue Prüfung liegt auf der Kante zwischen ihnen.
Cherry-picken Sie den Commit nicht auf einen beliebigen Tree ohne die umgebenden BPF-Owner/Cookie-Helper. Verwenden Sie den Stable-Backport für Ihre Serie.
uname -r
# Compare against the table above, then against your distro advisory —
# Ubuntu/Debian ABI numbers are not upstream stable numbers.
grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
/boot/config-$(uname -r) /proc/config.gz 2>/dev/null
sysctl kernel.unprivileged_bpf_disabled
# 0 = unprivileged bpf allowed (widest exposure)
# 1 = disabled after first privileged use, or fully disabled depending on kernel
# 2 = disabled (admin can re-enable)
Bestätigen Sie das Paket, nicht nur den Versionsstring:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# RHEL family
rpm -q --changelog kernel | grep -i 38502
Ein Kernel ≥ 6.17, oder ein Stable aus der Spalte „Erstmals behoben“, oder ein Distro-Paket aus der Advisory-Tabelle, ist der tatsächliche Abschluss.
abad3d0 / das Stable-Äquivalent enthält. Dies ist der einzige vollständige Fix.kernel.unprivileged_bpf_disabled=1 (oder 2), um unprivilegierte Loader auszuschließen.CAP_BPF, CAP_PERFMON und CAP_SYS_ADMIN für nicht vertrauenswürdige Benutzer und Container.seccomp, LSM oder Entfernen dieser Caps in der Runtime).BPF_PROG_TEST_RUN reicht aus, um den Allokationspfad zu durchlaufen; ein lokaler Angreifer liefert die Programme.CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| Datei | Was sie ist |
|---|---|
banner.png | README-Banner (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | In freier Wildbahn wiederhergestellter Forschungsquellcode (Dateiname schneidet die CVE-ID ab) |
ebpf_lpe.h | Gemeinsame BPF-Instruktionskonstruktoren, Map-Helper und Kernel-Offset-Makros, die von diesem Quellcode verwendet werden |
Dieses Verzeichnis dokumentiert die Schwachstelle und enthält den zugehörigen Forschungs-Tree. Es ist kein Drop-in-Exploit-Kit: Kernel-Gadget-Symbole (ARRAY_MAP_OPS_OFF, COMMIT_CREDS, …) sind Compile-Zeit-Eingaben für ein spezifisches vmlinux, und das Ausführen des Programms gegen einen laufenden Kernel liegt außerhalb des Rahmens dieses README.
CVE / NVD
Upstream
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageStable-Backports
Distros
Abraxas Labs — nur Forschung / autorisierte Tests
Dieses Repository dient Forschung und Bildung.
Kompilieren, führen Sie aus, setzen Sie ein oder verwenden Sie den Code hier anderweitig nicht gegen ein System, es sei denn, Sie haben die ausdrückliche schriftliche Genehmigung sowohl der Partei, die dieses Repository hostet, als auch des Eigentümers des Ziels. Unbefugter Zugriff auf Computersysteme ist eine Straftat.
Die Autoren und Abraxas Labs stellen dieses Material wie besehen bereit, ohne Gewährleistung, dass es vollständig, korrekt oder sicher auszuführen ist. Kernel-Exploitation-Forschung kann eine Maschine zum Absturz bringen, Dateisysteme beschädigen und Datenverlust verursachen. Sie übernehmen dieses Risiko.
In freier Wildbahn gefunden.
| Quelle | Score | Integrität | Anmerkungen |
|---|
| kernel.org CNA / cve.org | 7.8 HIGH | Hoch | C:H/I:H/A:H — behandelt den Bug als vollständige lokale Auswirkung |
| NVD | 7.1 HIGH | Keine | C:H/I:N/A:H — Vertraulichkeit + Verfügbarkeit |
| Ubuntu | Mittel (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | Keine | C:N/I:N/A:L — als eingeschränkte Verfügbarkeit bewertet |
| Amazon Linux | 4.0 Mittel | Keine | gleicher Vektor wie Red Hat |
| SUSE | 6.1 Moderate | Keine | einige SLE-15-Streams als WONTFIX markiert |
| Serie | Betroffen | Erstmals behoben |
|---|
| 5.9 – 5.15 | 5.9 bis 5.15.191 | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | 5.16 bis 6.1.150 | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | 6.2 bis 6.6.104 | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | 6.7 bis 6.12.45 | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | 6.13 bis 6.16.0 | 6.16.1 (19341d5c…) |
| mainline | bis der Fix landete | 6.17-rc1 (abad3d0b…) |
| Distro | Releases / Kernel, die im Bereich lagen |
|---|
| Ubuntu | 22.04 LTS (5.15), 24.04 LTS (6.8), 25.04 (EOL weiterhin needed). 20.04 HWE 5.15. |
| Debian | 11 bullseye (5.10), 12 bookworm (6.1), 13 trixie (6.12) |
| RHEL 9 / 10, Rocky, Alma, Fedora | RHEL 9 ≈ 5.14; RHEL 10 ≈ 6.12; Fedora rolling 5.9–6.16 |
| SUSE / openSUSE | SLE Micro 5.3/5.4; einige SLE-15-Streams WONTFIX |
| Amazon Linux 2023 | Standard-Kernel und kernel6.12 |
| Amazon Linux 2 extras | 5.10 extra (kein Fix geplant) und 5.15 extra |
| Arch, Gentoo, Tumbleweed | Rolling-Kernel zwischen 5.9 und dem Fix in 6.16.1 / 6.17-rc1 |
| Distro | Behobenes Paket (indikativ) | Advisory |
|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | dieselbe |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (6.1-Backport) | linux-6.1 6.1.153-1~deb11u1 | DLA-4328-1 |
| Amazon Linux 2023 | kernel / kernel6.12, 2025-09-29 | ALAS2023-2025-1210 / 1208 |
| Amazon Linux 2 5.15 extra | 2025-09-29 | ALAS2KERNEL-5.15-2025-091 |
| Bedingung | Warum sie wichtig ist |
|---|
CONFIG_BPF_SYSCALL=y | bpf(2) muss existieren |
CONFIG_CGROUP_BPF=y | cgroup-attached Programme und Cgroup Local Storage |
kernel.unprivileged_bpf_disabled | 0 erlaubt unprivilegiertes Laden von Programmen; 1/2 erfordern CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN |
| Lockdown / LSM / seccomp | kann BPF_PROG_LOAD oder BPF_PROG_TEST_RUN blockieren |
BPF_PROG_TYPE_CGROUP_SKB (oder andere Cgroup-Programmtypen, die Local Storage tragen) | der Run-Context, der cgroup_storage[] enthält |