
Checker proof-of-concept per Aarch64 per la CVE-2026-46242 'Bad Epoll', che innesca la race condition use-after-free close-vs-close di epoll nel kernel Linux per validare l'escalation locale dei privilegi.
Questo repository è un validatore poordi epoll per kernel aarch64 basato su un exploit già esistente per x86.
Escalation dei privilegi locale del kernel Linux tramite race condition Use-After-Free in
epoll
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2026-46242 |
| Soprannome | Bad Epoll |
| Tipo | Use-After-Free (UAF) tramite race condition |
| CVSS | 7.8 (Alto) |
| Impatto | Escalation dei privilegi locale → root |
| Kernel interessati | 5.10 – 6.11 (LTS e COS) |
| Sottosistema | fs/eventpoll.c (percorso ep_remove() / close) |
Esiste una race condition nel sottosistema epoll del kernel Linux durante operazioni close() concorrenti sui descrittori di file monitorati e monitoranti. Quando due percorsi di close vengono eseguiti simultaneamente:
eventpoll tramite ep_remove().hlist_del_rcu() dell'altro percorso finisce sulla memoria già liberata.Questo produce un Use-After-Free che corrompe la lista refs dell'eventpoll riutilizzato, lasciando un puntatore dangling epi->ffd.file nel waiter epoll sopravvissuto — le fondamenta dell'intera catena di exploit.
┌─────────────────────────────────────────────────────────┐
│ 1. KASLR Leak (canale laterale prefetch via libxdk) │
├─────────────────────────────────────────────────────────┤
│ 2. Race Trigger (UAF close-vs-close su eventpoll) │
│ ├─ Timer adattivo: le fasi stat/exec calibrano in anticipo │
│ ├─ False-sharing: dup()+close() allarga la finestra di race │
│ └─ Oracle: EPOLL_CTL_ADD depth-3 → ELOOP? │
├─────────────────────────────────────────────────────────┤
│ 3. Reclaim (eventpoll liberato → ep_uaf_target)│
│ └─ epi->ffd.file dangling in ep_uaf_waiter │
├─────────────────────────────────────────────────────────┤
│ 4. Cross-Cache (slab filp → buddy → pipe_buffer) │
│ ├─ Svuota la lista parziale per-CPU │
│ ├─ Libera gli oggetti circostanti → pagina slab liberata │
│ └─ Riutilizza come pagine pipe (256 × 4 KiB) │
├─────────────────────────────────────────────────────────┤
│ 5. AAR Vincolato (fdinfo ino:/sdev: come oracle di lettura) │
│ ├─ Le tile di fake file spray forgiano struct file nella pipe │
│ ├─ Lettura 8B: ino: ← i_ino all'offset controllato │
│ ├─ Lettura 4B: sdev: ← cursore sigaltstack(sas_ss_sp) │
│ └─ Walk: init_task → trova il task dell'exploit → risolvi │
│ files → fdt → fd[] → pipe_buffer → struct page │
├─────────────────────────────────────────────────────────┤
│ 6. Rip Control (hijack f_op→poll → JOP → ROP) │
│ ├─ Forgia f_op = virt, f_count = virt - 1 │
│ ├─ La catena pivot JOP porta rsp su una pagina controllata │
│ └─ ROP libxdk: commit_creds(init_cred) + switch ns │
├─────────────────────────────────────────────────────────┤
│ 7. Ret2Usr execve("/bin/bash") come root │
└─────────────────────────────────────────────────────────┘
# aarch64 (cross-compile o nativo)
aarch64-linux-gnu-gcc -O2 -Wall -pthread -march=armv8-a \
race_check_aarch64.c -o race_check
./race_check [timeout_seconds] # default: 300s (5 min)
./race_check 120 # timeout di 2 minuti
| Codice | Significato |
|---|---|
0 | Race vinta — il kernel è vulnerabile |
1 | Timeout — race non rilevata (possibile falso negativo, non prova che il kernel sia patchato) |
⚠️ Disclaimer: Questo repository è fornito solo per scopi educativi e di ricerca sulla sicurezza autorizzata. L'uso non autorizzato di questo exploit contro sistemi che non possiedi o per i quali non hai esplicito permesso di test è illegale.