
CVE-2026-46242 "Bad Epoll" 用の Aarch64 PoC チェッカー。Linux カーネルの epoll close-vs-close use-after-free 競合状態を引き起こし、ローカル権限昇格を検証します。
このリポジトリは、x86向けに既に存在するエクスプロイトをベースにした、aarch64カーネル向けのBad Epollバリデータです。
epollのUse-After-Free競合状態を介したLinuxカーネルのローカル特権昇格
| フィールド | 詳細 |
|---|---|
| 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パス) |
Linuxカーネルのepollサブシステムには、監視対象および監視側のファイルディスクリプタに対する並行close()操作中に競合状態が存在します。2つのcloseパスが同時に実行されると:
ep_remove()経由でeventpollオブジェクトを解放します。hlist_del_rcu()書き込みが、すでに解放されたメモリに対して行われます。これによりUse-After-Freeが発生し、再利用されたeventpollのrefsリストが破壊され、生存しているepoll待機側に**ダングリングなepi->ffd.file**ポインタが残ります。これが完全なエクスプロイトチェーンの基盤となります。
┌─────────────────────────────────────────────────────────┐
│ 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 | タイムアウト — レースを検出できませんでした (偽陰性の可能性があり、カーネルがパッチ適用済みであることを証明するものではありません) |
⚠️ 免責事項: このリポジトリは教育および正規のセキュリティ研究目的のみで提供されています。所有していない、または明示的なテスト許可を得ていないシステムに対するこのエクスプロイトの不正使用は違法です。