
Чекер proof-of-concept под Aarch64 для CVE-2026-46242 «Bad Epoll»: запускает гонку use-after-free close-vs-close в epoll ядра Linux для подтверждения локального повышения привилегий.
Этот репозиторий — валидатор уязвимости Bad Epoll для ядер aarch64, основанный на уже существующем эксплойте для x86.
Локальное повышение привилегий в ядре Linux через состояние гонки Use-After-Free в
epoll
| Поле | Описание |
|---|---|
| CVE | CVE-2026-46242 |
| Псевдоним | Bad Epoll |
| Тип | Use-After-Free (UAF) через состояние гонки |
| CVSS | 7.8 (Высокий) |
| Воздействие | Локальное повышение привилегий → root |
| Затронутые ядра | 5.10 – 6.11 (LTS и COS) |
| Подсистема | fs/eventpoll.c (ep_remove() / путь close()) |
В подсистеме epoll ядра Linux существует состояние гонки при параллельных операциях close() над отслеживаемыми и отслеживающими файловыми дескрипторами. Когда два пути закрытия выполняются одновременно:
eventpoll через ep_remove().hlist_del_rcu() другого пути попадает в уже освобождённую память.Это приводит к Use-After-Free, которая повреждает список refs переиспользованного eventpoll, оставляя висячий указатель epi->ffd.file у выжившего epoll-ожидающего — основу для полной цепочки эксплуатации.
┌─────────────────────────────────────────────────────────┐
│ 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
| Код | Значение |
|---|---|
0 | Гонка выиграна — ядро уязвимо |
1 | Тайм-аут — гонка не обнаружена (возможен ложный отрицательный результат; это не доказывает, что ядро пропатчено) |
⚠️ Отказ от ответственности: Этот репозиторий предоставляется только для образовательных целей и авторизованных исследований в области безопасности. Несанкционированное использование этого эксплойта против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения, является незаконным.