
Repository di ricerca per CVE-2025-38502, un accesso out-of-bounds alla memoria locale del cgroup BPF del kernel Linux tramite tail call che consente l'escalation locale dei privilegi.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Accesso out-of-bounds alla cgroup local storage di BPF del kernel Linux tramite tail call
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — Out-of-bounds Read |
| Vendor | Linux kernel |
| Componente | kernel/bpf/core.c, include/linux/bpf.h (cgroup local storage + tail call) |
| Impatto | Corruzione locale della memoria del kernel; l'escalation di privilegi rientra nello scope su kernel non patchati |
| Vettore di attacco | Locale (AV:L) |
| Privilegi | Bassi (PR:L) — un processo in grado di caricare programmi BPF di tipo CGROUP_SKB (o programmi equivalenti collegati a cgroup) |
| Interazione utente | Nessuna |
| 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 |
| Pubblico | 16 agosto 2025 |
| Fix upstream | abad3d0 in 6.17-rc1; backportato a 6.16.1, 6.12.46, 6.6.105, 6.1.151, 5.15.192 |
Solo per ricerca / uso educativo. Non eseguire, distribuire o utilizzare il materiale presente in questo repository contro qualsiasi host, a meno che tu non abbia esplicita autorizzazione scritta sia dal soggetto che ospita questo repository sia dal proprietario dei sistemi target. Trovato in the wild.
Il nome del file sorgente CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c tronca l'identificatore. Il record pubblicato è CVE-2025-38502. Non esiste alcun CVE Linux CVE-2025-3850.
Lonial ha segnalato che la cgroup BPF local storage può essere acceduta out of bounds attraverso una tail call.
Il verifier eBPF esegue il type-check di ciascun programma in isolamento. A runtime, bpf_get_local_storage() non cerca la map del programma attualmente in esecuzione. Legge il puntatore alla cgroup-storage da current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. Quello slot viene riempito dal programma originariamente collegato, non dal programma in cui è stata effettuata la tail call.
Se il programma A (con BPF_MAP_TYPE_CGROUP_STORAGE di dimensione value piccola) effettua una tail call verso il programma B (dimensione value grande), la bpf_get_local_storage() di B restituisce comunque il buffer più piccolo di A. Gli accessi che il verifier aveva consentito sulla map di B finiscono quindi oltre la fine dell'allocazione di A.
Il difetto è stato introdotto in Linux 5.9 da 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup). È stato corretto estendendo bpf_map_owner con un storage_cookie[], in modo che le combinazioni di tail call siano accettate solo quando il callee usa le stesse cgroup-storage map del caller, oppure non ne usa alcuna.
Si tratta di un accesso out-of-bounds locale all'heap del kernel. Il punteggio di severità varia tra i vendor perché non concordano se la primitiva sia un "DoS in sola lettura" o una vera e propria corruzione di memoria:
Cosa significa in pratica:
struct bpf_array spruzzata nello stesso slab/order) possono essere corrotti.map->ops, hijack di un helper, commit_creds / cambio di namespace). È per questo che questo repository etichetta il problema come LPE. Il punteggio più basso di Red Hat riflette la loro valutazione specifica per prodotto, non l'assenza del bug.Il bug non richiede un servizio esposto in rete. È locale. Non richiede una TTY, un helper setuid o l'interazione dell'utente.
Due programmi BPF cgroup, ciascuno con la propria BPF_MAP_TYPE_CGROUP_STORAGE (variante shared, BPF_CGROUP_STORAGE_SHARED):
| Programma | Ruolo | Dimensione value della storage |
|---|---|---|
| A | collegato / caller della tail call | piccola (ad es. compatibile con un dato kmalloc order) |
| B | target della tail call | grande (il verifier consente accessi fino a questa dimensione) |
Il verifier controlla A rispetto alla map di A e B rispetto alla map di B. Entrambi passano.
A runtime l'helper esegue:
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 è la voce dell'array relativa al programma che ha avviato la cgroup run, non al programma attualmente in esecuzione dopo bpf_tail_call. B opera quindi sull'oggetto storage di A.
bpf_cgroup_storage_alloc() dimensiona il buffer di supporto in base alla value_size della map. Il buffer di A è troppo piccolo per gli accessi verificati di B. Il risultato è una classica type-confusion dell'identità della map attraverso un trasferimento di controllo — la stessa famiglia di bug di altre problematiche BPF in cui "l'helper vede una map diversa da quella vista dal verifier".
Il commit 7d9c342 ha reso le cgroup storage condivise tra programmi collegati allo stesso cgroup. È questa condivisione che rende lo slot del run-context un singolo puntatore anziché una ricerca per-programma, ed è il motivo per cui i kernel precedenti alla 5.9 non sono interessati.
BPF_PROG_TEST_RUN su un programma BPF_PROG_TYPE_CGROUP_SKB alloca la cgroup storage per la durata del test. Quell'allocazione si trova sull'heap del kernel accanto a qualunque altra cosa sia stata recentemente liberata nella stessa classe di dimensione — incluse map struct bpf_array la cui value_size è stata scelta per ricadere nello stesso kmalloc order. Un OOB dal buffer della storage può quindi raggiungere i campi di bpf_map (ops, lista RCU, value[]) di una array map adiacente.
Questo dettaglio del layout dell'heap è il motivo per cui un advisory di "semplice OOB read" e una trattazione LPE possono descrivere lo stesso CVE.
Introdotto in: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
Non interessati: tutti i kernel precedenti alla 5.9
One-liner:
/* 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 */
Ancora aperto in alcuni stable: il kernel tracker di Debian elencava 5.10 upstream-stable / bullseye 5.10 come needed. Non dare per scontato che ogni 5.10.y sia patchato.
I numeri ABI delle distro ingannano. Ubuntu 5.15.0-163 è una 5.15 patchata anche se 5.15.0 sembra più vecchia della upstream 5.15.192. Confronta il changelog del pacchetto / USN / DSA / ALAS / RHSA, non uname -r con la tabella sopra.
Qualsiasi distribuzione che abbia distribuito un kernel nei range sopra riportati era nello scope finché non ha backportato abad3d0 (o il commit stable corrispondente). Si tratta di codice BPF generico, non di una patch specifica di una distro.
Ubuntu 26.04 / 25.10 sono elencate come non interessate (si sono diramate dopo il fix). Ubuntu 25.04 ha raggiunto l'EOL ancora needed.
Un host può corrispondere a una versione interessata e non essere comunque raggiungibile. Verifiche utili:
unprivileged_bpf_disabled=1 non è un fix completo — un utente con capability BPF può comunque colpire il bug — ma rimuove il percorso non privilegiato.
Commit upstream abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage, Daniel Borkmann).
struct bpf_map_owner acquisisce un array storage_cookie[]. All'aggiornamento del target di una tail call, il kernel ora:
bpf_get_local_storage() — richiede che le cgroup-storage map del callee siano esattamente quelle del caller (stessi cookie).Le dimensioni value non corrispondenti non possono più essere composte alle spalle del verifier. Ogni programma è ancora verificato singolarmente; il nuovo controllo è sul confine tra essi.
Non fare cherry-pick del commit su un albero arbitrario senza gli helper owner/cookie BPF circostanti. Usa il backport stable per la tua 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)
Conferma il pacchetto, non solo la stringa di versione:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# RHEL family
rpm -q --changelog kernel | grep -i 38502
Un kernel ≥ 6.17, o uno stable elencato nella colonna "prima versione corretta", o un pacchetto della distro dalla tabella degli advisory, è la vera chiusura del caso.
abad3d0 / l'equivalente stable. Questo è l'unico fix completo.kernel.unprivileged_bpf_disabled=1 (o 2) per eliminare i loader non privilegiati.CAP_BPF, CAP_PERFMON e CAP_SYS_ADMIN per utenti e container non fidati.seccomp, LSM, o rimuovendo quelle capability nel runtime).BPF_PROG_TEST_RUN è sufficiente per esercitare il percorso di allocazione; è un attaccante locale a fornire i programmi.CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| File | Cos'è |
|---|---|
banner.png | Banner del README (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | Sorgente di ricerca recuperato in the wild (il nome del file tronca l'id del CVE) |
ebpf_lpe.h | Costruttori condivisi di istruzioni BPF, helper per le map e macro di offset del kernel usati da quel sorgente |
Questa directory documenta la vulnerabilità e contiene il corrispondente albero di ricerca. Non è un exploit kit pronto all'uso: i simboli dei gadget del kernel (ARRAY_MAP_OPS_OFF, COMMIT_CREDS, …) sono input a compile-time per uno specifico vmlinux, e l'esecuzione del programma contro un kernel live è fuori dallo scope di questo README.
CVE / NVD
Upstream
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageBackport stable
Distro
Abraxas Labs — solo ricerca / test autorizzati
Questo repository è destinato a ricerca e formazione.
Non compilare, eseguire, distribuire o altrimenti utilizzare il codice qui presente contro qualsiasi sistema, a meno che tu non abbia esplicita autorizzazione scritta sia dal soggetto che ospita questo repository sia dal proprietario del target. L'accesso non autorizzato a sistemi informatici è un reato.
Gli autori e Abraxas Labs forniscono questo materiale così com'è, senza alcuna garanzia che sia completo, corretto o sicuro da eseguire. La ricerca sullo sfruttamento del kernel può mandare in panic una macchina, corrompere filesystem e causare perdita di dati. Ti assumi questo rischio.
Trovato in the wild.
| Fonte | Punteggio | Integrità | Note |
|---|
| kernel.org CNA / cve.org | 7.8 HIGH | Alta | C:H/I:H/A:H — tratta il bug come impatto locale completo |
| NVD | 7.1 HIGH | Nessuna | C:H/I:N/A:H — riservatezza + disponibilità |
| Ubuntu | Medium (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | Nessuna | C:N/I:N/A:L — valutato come disponibilità limitata |
| Amazon Linux | 4.0 Medium | Nessuna | stesso vettore di Red Hat |
| SUSE | 6.1 Moderate | Nessuna | alcuni stream SLE 15 marcati WONTFIX |
| Serie | Interessate | Prima versione corretta |
|---|
| 5.9 – 5.15 | dalla 5.9 fino alla 5.15.191 | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | dalla 5.16 fino alla 6.1.150 | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | dalla 6.2 fino alla 6.6.104 | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | dalla 6.7 fino alla 6.12.45 | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | dalla 6.13 fino alla 6.16.0 | 6.16.1 (19341d5c…) |
| mainline | fino all'arrivo del fix | 6.17-rc1 (abad3d0b…) |
| Distro | Release / kernel che erano nel range |
|---|
| Ubuntu | 22.04 LTS (5.15), 24.04 LTS (6.8), 25.04 (EOL ancora 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; alcuni stream SLE 15 WONTFIX |
| Amazon Linux 2023 | kernel predefinito e kernel6.12 |
| Amazon Linux 2 extras | 5.10 extra (nessun fix pianificato) e 5.15 extra |
| Arch, Gentoo, Tumbleweed | kernel rolling tra la 5.9 e il fix 6.16.1 / 6.17-rc1 |
| Distro | Pacchetto corretto (indicativo) | Advisory |
|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | stesso |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (backport 6.1) | 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 |
| Condizione | Perché è importante |
|---|
CONFIG_BPF_SYSCALL=y | bpf(2) deve esistere |
CONFIG_CGROUP_BPF=y | programmi collegati a cgroup e cgroup local storage |
kernel.unprivileged_bpf_disabled | 0 consente il caricamento di programmi non privilegiati; 1/2 richiedono CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN |
| Lockdown / LSM / seccomp | possono bloccare BPF_PROG_LOAD o BPF_PROG_TEST_RUN |
BPF_PROG_TYPE_CGROUP_SKB (o altri tipi di programma cgroup che portano local storage) | il run context che contiene cgroup_storage[] |