将二进制空间安全设为"星标⭐️"
第一时间收到文章更新
漏洞背景
2026年7月初,安全圈又迎来一枚Bad 系列内核漏洞:Bad Epoll。
它允许没有任何特权的本地用户,通过Linux内核 epoll 子系统里一个极窄的竞态窗口,把权限一路提升到root。受影响的不只是传统 Linux 服务器,还包括Android手机,而这一点,恰恰是多数Linux本地提权漏洞做不到的。而Anthropic的前沿AI模型Mythos曾在同一段epoll代码里挖出了另一个竞态漏洞(CVE-2026-43074),却漏掉了 Bad Epoll。
epoll是什么?为什么关不掉?
在Linux里,epoll 是一种高效 I/O多路复用机制:一个进程可以同时监听成百上千个文件描述符,包括:网络连接、管道、定时器等,哪个就绪就处理哪个。基础工作原理模型如下:
┌─────────────┐ epoll_wait() ┌──────────────────┐│ Nginx/Chrome│ ◄──────────────────► │ 内核 epoll 子系统 ││ Node.js/Go │ epoll_ctl() │ (fs/eventpoll.c) │└─────────────┘ epoll_create() └──────────────────┘
如Nginx、Chrome、Node.js、Android系统服务,几乎所有高并发程序都依赖 epoll。最麻烦的地方是它并不是一个可卸载的内核模块,因此没有一键关闭的解决方案。唯一的解决方案是等待补丁发布。
epoll竞态漏洞原理
Bad Epoll的本质, 是一个经典的Use-After-Free竞态问题:两条内核清理路径同时操作同一个对象,一条把内存释放了,另一条还在往这块内存里写。漏洞原理如下图:
漏洞形成过程遵循如下步骤:
ep_remove() 在 file->f_lock 保护下清空了 file->f_ep,但随后仍在临界区内继续使用 is_file_epoll()、hlist_del_rcu() 等操作)。
与此同时,并发的__fput() 走 eventpoll_release() 快速路径,看到 transient NULL 后跳过了eventpoll_release_file(),直接执行 f_op->release / file_free()。
当epoll监听epoll(epoll-watches-epoll)时,f_op->release 会触发 ep_eventpoll_release() → ep_clear_and_put() → ep_free(),提前 kfree 了被监听的 struct eventpoll。
被释放对象的 ->refs hlist 头,恰好是 epi->fllink.pprev 指向的位置。随后 ep_remove() 里的 hlist_del_rcu() 执行 "*pprev = next",往已释放的 kmalloc-192内存里写入8字节, 这就是攻击者可控的 UAF 写。
由于 struct file 标记为 SLAB_TYPESAFE_BY_RCU,同一块内存还可能被 alloc_empty_file() 回收复用,导致攻击者可控的跨cache释放,进一步放大危害。
两条清理路径真正"撞车"的地方,大约只有6条机器指令宽,随机触发几乎不可能成功, 这也是AI和人类都极难发现它的原因之一。
该漏洞的研究者通过精密的exploit设计,将极窄的窗口变成了99%成功率的稳定攻击。以下是完整的权限提升利用链:
权限提升攻击链过程如下:
(1).布局:创建4个epoll对象,分成2对,一对触发竞态,一对成为受害者。
(2).触发UAF:同时关闭关联epoll,驱动竞态,获得8字节可控写。
(3).升级UAF:跨cache攻击,污染file对象,完全控制 file 结构体内容。
(4).任意读:通过/proc/self/fdinfo读取任意内核内存。
(5).提权:利用ROP链劫持控制流,获取root shell。
完整的exploit代码和POC已公开:
Exploit Wirteup:
https://github.com/J-jaeyoung/security-research/blob/submit-cve-2026-46242/pocs/linux/kernelctf/CVE-2026-46242_lts_cos/docs/exploit.md
POC源码:
https://github.com/J-jaeyoung/security-research/blob/submit-cve-2026-46242/pocs/linux/kernelctf/CVE-2026-46242_lts_cos/exploit/lts-6.12.67/exploit.cpp
以下是漏洞时间线参考:
(全文完)