
Verificador de prova de conceito (PoC) para Aarch64 da CVE-2026-46242 'Bad Epoll', que aciona a condição de corrida use-after-free close-vs-close do epoll no kernel Linux para validar o escalonamento local de privilégios.
Este repositório é um validador do "Bad Epoll" para kernels aarch64 baseado em exploit que já existe para x86.
Escalação Local de Privilégios no Kernel Linux via Condição de Corrida de Use-After-Free em
epoll
| Campo | Detalhe |
|---|---|
| CVE | CVE-2026-46242 |
| Apelido | Bad Epoll |
| Tipo | Use-After-Free (UAF) via condição de corrida |
| CVSS | 7.8 (Alto) |
| Impacto | Escalação Local de Privilégios → root |
| Kernels afetados | 5.10 – 6.11 (LTS & COS) |
| Subsistema | fs/eventpoll.c (ep_remove() / caminho de close) |
Existe uma condição de corrida no subsistema epoll do kernel Linux durante operações concorrentes de close() em descritores de arquivo monitorados e monitores. Quando dois caminhos de close executam simultaneamente:
eventpoll via ep_remove().hlist_del_rcu() do outro caminho atinge a memória já liberada.Isso produz um Use-After-Free que corrompe a lista refs do eventpoll recuperado, deixando um ponteiro suspenso (dangling) epi->ffd.file no waiter epoll sobrevivente — a base para a cadeia completa de exploração.
┌─────────────────────────────────────────────────────────┐
│ 1. KASLR Leak (prefetch side-channel via libxdk) │
├─────────────────────────────────────────────────────────┤
│ 2. Race Trigger (close-vs-close UAF on eventpoll) │
│ ├─ Adaptive timer: stat/exec phases calibrate ahead │
│ ├─ False-sharing: dup()+close() widens race window │
│ └─ Oracle: EPOLL_CTL_ADD depth-3 → ELOOP? │
├─────────────────────────────────────────────────────────┤
│ 3. Reclaim (freed eventpoll → ep_uaf_target) │
│ └─ Dangling epi->ffd.file in ep_uaf_waiter │
├─────────────────────────────────────────────────────────┤
│ 4. Cross-Cache (filp slab → buddy → pipe_buffer) │
│ ├─ Drain per-CPU partial list │
│ ├─ Free enclosing objects → slab page freed │
│ └─ Reclaim as pipe pages (256 × 4 KiB) │
├─────────────────────────────────────────────────────────┤
│ 5. Constrained AAR (fdinfo ino:/sdev: as read oracle) │
│ ├─ Fake file spray tiles forged struct file in pipe │
│ ├─ 8B read: ino: ← i_ino at controlled offset │
│ ├─ 4B read: sdev: ← sigaltstack(sas_ss_sp) cursor │
│ └─ Walk: init_task → find exploit task → resolve │
│ files → fdt → fd[] → pipe_buffer → struct page │
├─────────────────────────────────────────────────────────┤
│ 6. RIP Control (f_op→poll hijack → JOP → ROP) │
│ ├─ Forge f_op = virt, f_count = virt - 1 │
│ ├─ JOP pivot chain lands rsp on controlled page │
│ └─ libxdk ROP: commit_creds(init_cred) + ns switch │
├─────────────────────────────────────────────────────────┤
│ 7. Ret2Usr execve("/bin/bash") as root │
└─────────────────────────────────────────────────────────┘
# aarch64 (cross-compile or native)
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 # 2-minute timeout
| Código | Significado |
|---|---|
0 | Corrida vencida — o kernel é vulnerável |
1 | Tempo esgotado — corrida não detectada (possível falso negativo, não prova que o kernel está corrigido) |
⚠️ Aviso Legal: Este repositório é fornecido apenas para fins educacionais e de pesquisa de segurança autorizada. O uso não autorizado deste exploit contra sistemas que você não possui ou sem permissão explícita para testar é ilegal.