该仓库是一个基于已存在的 x86 漏洞利用的 aarch64 内核 Bad Epoll 验证器。
通过
epoll释放后使用(Use-After-Free)竞态条件实现的 Linux 内核本地权限提升
| 字段 | 详情 |
|---|---|
| CVE | CVE-2026-46242 |
| 别名 | Bad Epoll |
| 类型 | 通过竞态条件导致的释放后使用(UAF) |
| CVSS | 7.8(高危) |
| 影响 | 本地权限提升 → root |
| 受影响内核 | 5.10 – 6.11(LTS 与 COS) |
| 子系统 | fs/eventpoll.c(ep_remove() / 关闭路径) |
在 Linux 内核的 epoll 子系统中,当被监视的文件描述符和监视用的文件描述符并发执行 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 (交叉编译或本机编译)
aarch64-linux-gnu-gcc -O2 -Wall -pthread -march=armv8-a \
race_check_aarch64.c -o race_check
./race_check [timeout_seconds] # 默认:300 秒(5 分钟)
./race_check 120 # 2 分钟超时
| 代码 | 含义 |
|---|---|
0 | 竞态获胜——内核存在漏洞 |
1 | 超时——未检测到竞态(可能存在漏报,不能证明内核已修补) |
⚠️ 免责声明: 本仓库仅供教育和授权安全研究目的使用。未经授权将此漏洞利用用于你不拥有或未经明确许可测试的系统是违法的。