
Aarch64-Proof-of-Concept-Checker für CVE-2026-46242 'Bad Epoll', der den Use-after-Free-Race close-vs-close im Linux-Kernel-epoll auslöst, um lokale Privilegieneskalation zu validieren.
Dieses Repository ist ein Bad-Epoll-Validator für aarch64-Kernel, basierend auf einem Exploit, der für x86 bereits existiert.
Linux Kernel Local Privilege Escalation durch
epollUse-After-Free Race Condition
| Feld | Detail |
|---|---|
| CVE | CVE-2026-46242 |
| Spitzname | Bad Epoll |
| Typ | Use-After-Free (UAF) durch Race Condition |
| CVSS | 7.8 (Hoch) |
| Auswirkung | Lokale Privilege Escalation → root |
| Betroffene Kernel | 5.10 – 6.11 (LTS & COS) |
| Subsystem | fs/eventpoll.c (ep_remove() / close-Pfad) |
Im epoll-Subsystem des Linux-Kernels besteht eine Race Condition während gleichzeitiger close()-Operationen auf überwachte und überwachende Dateideskriptoren. Wenn zwei close-Pfade gleichzeitig ausgeführt werden:
eventpoll-Objekt über ep_remove() frei.hlist_del_rcu()-Schreibvorgang des anderen Pfads landet auf dem bereits freigegebenen Speicher.Dies erzeugt einen Use-After-Free, der die refs-Liste des zurückgewonnenen eventpoll beschädigt und einen hängen gebliebenen epi->ffd.file-Zeiger im überlebenden epoll-Waiter hinterlässt — die Grundlage für die vollständige Exploit-Kette.
┌─────────────────────────────────────────────────────────┐
│ 1. KASLR-Leak (prefetch-Seitenkanal via libxdk) │
├─────────────────────────────────────────────────────────┤
│ 2. Race-Trigger (close-vs-close UAF auf eventpoll) │
│ ├─ Adaptiver Timer: stat/exec-Phasen kalibrieren vor │
│ ├─ False-Sharing: dup()+close() verbreitert Fenster │
│ └─ Orakel: EPOLL_CTL_ADD Tiefe-3 → ELOOP? │
├─────────────────────────────────────────────────────────┤
│ 3. Rückgewinnung (freigegebenes eventpoll → ep_uaf_target) │
│ └─ Hängender epi->ffd.file in ep_uaf_waiter │
├─────────────────────────────────────────────────────────┤
│ 4. Cross-Cache (filp-Slab → buddy → pipe_buffer) │
│ ├─ Per-CPU-partielle Liste leeren │
│ ├─ Umgebende Objekte freigeben → Slab-Seite frei │
│ └─ Als Pipe-Seiten zurückgewinnen (256 × 4 KiB) │
├─────────────────────────────────────────────────────────┤
│ 5. Eingeschränktes AAR (fdinfo ino:/sdev: als Lese-Orakel) │
│ ├─ Fake-File-Spray kachelt gefälschte struct file in Pipe │
│ ├─ 8B-Lesen: ino: ← i_ino an kontrolliertem Offset │
│ ├─ 4B-Lesen: sdev: ← sigaltstack(sas_ss_sp)-Cursor │
│ └─ Lauf: init_task → finde Exploit-Task → löse auf │
│ files → fdt → fd[] → pipe_buffer → struct page │
├─────────────────────────────────────────────────────────┤
│ 6. RIP-Kontrolle (f_op→poll-Hijack → JOP → ROP) │
│ ├─ Fälsche f_op = virt, f_count = virt - 1 │
│ ├─ JOP-Pivot-Kette landet rsp auf kontrollierter Seite│
│ └─ libxdk-ROP: commit_creds(init_cred) + ns-Wechsel │
├─────────────────────────────────────────────────────────┤
│ 7. Ret2Usr execve("/bin/bash") als root │
└─────────────────────────────────────────────────────────┘
# aarch64 (Cross-Compile oder nativ)
aarch64-linux-gnu-gcc -O2 -Wall -pthread -march=armv8-a \
race_check_aarch64.c -o race_check
./race_check [timeout_seconds] # Standard: 300s (5 Min.)
./race_check 120 # 2-Minuten-Timeout
| Code | Bedeutung |
|---|---|
0 | Race gewonnen — Kernel ist verwundbar |
1 | Timeout — Race nicht erkannt (mögliches False Negative, beweist nicht, dass der Kernel gepatcht ist) |
⚠️ Haftungsausschluss: Dieses Repository wird ausschließlich für Bildungszwecke und autorisierte Sicherheitsforschung bereitgestellt. Die unbefugte Nutzung dieses Exploits gegen Systeme, die du nicht besitzt oder für die du keine ausdrückliche Erlaubnis zum Testen hast, ist illegal.