导语

2026 年 6 月 25 日,腾讯云等安全厂商发布风险通告,警告 Linux 内核中存在一个名为 Bad Epoll(CVE-2026-46242)的高危漏洞。这个由韩国 CompSec Lab 的 Jaeyoung Chung 发现的竞态条件漏洞,允许本地攻击者通过精心构造的 epoll 操作序列获取 root 权限,利用成功率高达 99%

更值得关注的是,该漏洞位于 Linux 内核的核心子系统 epoll 中——这是一个被几乎所有 Linux 服务器和 Android 设备依赖的功能,无法通过禁用模块来缓解。而且,Anthropic 的 AI 安全模型 Mythos 曾检查过同一段代码,发现了另一个竞态条件(CVE-2026-43074),却遗漏了 Bad Epoll——这从侧面反映了该漏洞的隐蔽性和发现难度。


一、epoll 子系统:Linux 高效事件通知的基石

1.1 什么是 epoll

epoll 是 Linux 内核提供的 I/O 多路复用机制,允许进程同时监视多个文件描述符上的事件(可读、可写、错误等)。与早期的 select/poll 相比,epoll 具有更高的性能和可扩展性,被广泛应用于:

  • 高性能网络服务器(NGINX、Redis、Node.js 等)
  • 容器运行时(Docker、containerd、Kubernetes)
  • 浏览器事件循环
  • Android 系统框架

1.2 竞态条件的温床

epoll 涉及多个并发路径:创建 epoll 实例、添加/修改/删除监视的文件描述符、等待事件发生。当多个线程或进程并发操作同一个 epoll 实例时,就需要精细的锁机制来维护数据一致性。Bad Epoll 正是在这种并发场景中产生的。


二、漏洞原理:6 条指令宽的竞态窗口

2.1 根因:Use-After-Free

Bad Epoll 的本质是一个 Use-After-Free(UAF) 竞态条件(CWE-416),由 ep_remove()__fput() 两个并发路径之间的竞争触发:

路径 A:ep_remove()

// ep_remove() 持有 file->f_lock
file->f_ep = NULL;          // 清空 f_ep 指针
// 但仍在临界区内继续使用 @file 指针
is_file_epoll(file);        // 读取 file 结构
hlist_del_rcu(file);        // 写入已释放的内存

路径 B:__fput()(并发执行)

// 观察到 f_ep == NULL
// 跳过 eventpoll_release_file()
// 直接执行 f_op->release → ep_eventpoll_release() → ep_clear_and_put() → ep_free()
// 释放了被监视的 struct eventpoll

关键竞态:路径 A 在清空 f_ep 后仍继续使用 @file 指针,但路径 B 看到 f_ep == NULL 后直接释放了 struct eventpoll。此时路径 A 的 hlist_del_rcu() 写入操作落在了已被 kfree() 释放的内存上,造成 UAF 写入

2.2 触发条件

攻击者创建两个相互监视的 epoll 文件描述符(epoll A 监视 epoll B),然后并发关闭两者即可触发竞态。

2.3 从 UAF 到 Root

发现者公开的利用路径:

  1. 触发 8 字节 UAF 写入:通过竞态条件写入已被释放的 kmalloc-192 内存
  2. 转化为 file 对象的 UAF:控制释放后的内存内容
  3. 跨缓存攻击:完全控制 file 内容
  4. 任意内核内存读取:通过 /proc/self/fdinfo 读取内核内存
  5. 劫持控制流:执行 ROP 链
  6. 获取 root shell

2.4 极高的成功率

竞态窗口仅有约 6 条指令的宽度——这在内核竞态条件中属于非常窄的窗口。但利用代码通过扩展窗口和无崩溃重试循环实现了极高的可靠性:

目标环境 成功率
lts-6.12.67 99%
cos-121 98%

三、影响范围:无法简单缓解

3.1 受影响内核版本

内核系列 受影响范围
5.x 5.15.209 - 5.15.x
6.1.x 6.1.175 - 6.1.x
6.4 - 6.18 6.4 - 6.18.32
6.19 - 7.x 6.19 - 7.0.9

3.2 受影响操作系统

  • Red Hat Enterprise Linux 9 / 10
  • Ubuntu 24.04 LTS、25.10、26.04 LTS
  • Debian 12 / 13
  • CentOS Stream / AlmaLinux / Rocky Linux
  • 以及所有使用上述内核版本的 Linux 发行版
  • 国产化操作系统:银河麒麟(Kylin)、统信UOS、openEuler 等基于 Linux 内核的国产发行版(若内核版本落入受影响范围,同样存在风险)

3.3 Android 影响

  • Pixel 10(kernel v6.6+)已确认可触发 UAF
  • Pixel 8(kernel v6.1)不受影响(缺陷在 v6.4 才引入)
  • 其他基于 kernel v6.4+ 的 Android 设备理论上受影响

3.4 为何难以防御

无简单缓解措施(No kill-switch):epoll 是内核核心功能,无法像某些模块那样通过卸载来禁用。操作系统、网络服务和浏览器都依赖 epoll。唯一修复方式是打补丁

漏洞发现难:竞态窗口极窄(约 6 条指令),且修复 CVE-2026-43074 后 Bad Epoll 通常不会触发 KASAN 报错,缺乏运行时证据。


四、发现与修复:两个月的拉锯战

4.1 时间线

日期 事件
2023-04-08 缺陷被引入 epoll 子系统
2026-02-17 发现者 Jaeyoung Chung 向 security@kernel.org 报告
2026-02-17 维护者提出补丁原型,但未完全修复问题
2026-04-02 相关漏洞 CVE-2026-43074 的修复合入主线
2026-04-22 发现者重新报告仍存在的剩余问题
2026-04-24 Bad Epoll 正确修复合入主线
2026-05-30 CVE-2026-46242 在 NVD 正式发布
2026-06-25 腾讯云等安全厂商发布风险通告

4.2 AI 也未能发现

Anthropic 的 AI 安全模型 Mythos 检查了同一段 epoll 代码,发现了另一个竞态条件(CVE-2026-43074),但遗漏了 Bad Epoll。这有两个启示:

  1. 竞态条件的发现难度极高:即使是专门训练的 AI 安全模型,也会遗漏精心隐藏的竞态窗口
  2. AI 辅助安全研究有边界:AI 可以发现模式性的漏洞(如缓冲区溢出、整数溢出),但在面对极窄的时间窗口和复杂的并发交互时,仍然需要人类安全研究员的直觉和创造力

4.3 修复方案

升级到修复版本的内核(commit a6dc643c6931 之后的内核版本)。

内核版本检查命令

uname -r

对于无法立即升级的系统,可采取以下临时缓解措施:

临时缓解A:内核指针与日志限制

通过 sysctl 限制内核信息泄露,增加攻击者利用难度:

sysctl -w kernel.kptr_restrict=2
sysctl -w kernel.dmesg_restrict=1
  • kernel.kptr_restrict=2:禁止普通用户通过 /proc/kallsyms 等接口获取内核符号地址,阻断利用链中的信息收集环节。
  • kernel.dmesg_restrict=1:限制非特权用户访问内核 dmesg 日志,防止攻击者通过日志推断内核内存布局。

临时缓解B:加固补丁与运行时监控

  • grsecurity/PaX 加固:若业务场景允许,可评估部署 grsecurity/PaX 内核加固补丁,其额外的内存保护机制(如 UDEREF、PIE 强化)可显著提升 UAF 利用难度。
  • eBPF 安全监控:部署基于 eBPF 的内核行为监控工具(如 Falco、Tetragon),实时检测异常的 epoll 创建/销毁模式、可疑的 setuid 提权行为以及异常的内存访问模式。eBPF 探针可在不修改内核源码的情况下实现亚秒级威胁检测。
  • 限制非特权用户对 epoll 子系统的访问:实际操作中几乎不可能,因为 epoll 是基础 API,但可通过 seccomp-bpf 策略限制容器内进程对特定 epoll 系统调用标志位的使用。

五、我的分析:内核竞态条件的永恒挑战

5.1 竞态条件为何难以根除

Bad Epoll 不是第一个、也不会是最后一个内核竞态条件。这类漏洞之所以难以根除,是因为:

  • 并发是性能的核心:epoll 的设计目标之一就是高性能并发事件通知,锁粒度过粗会严重影响性能
  • "正确"不等于"安全":从功能角度看,ep_remove() 的逻辑是正确的——它在持有锁的情况下操作数据。但在并发环境下,"正确"的操作序列可能被其他路径打断
  • 测试覆盖率有限:竞态条件的触发依赖于精确的时序,常规测试很难覆盖所有可能的并发路径组合

5.2 内核安全研究的演进

Bad Epoll 的发现和利用展示了当前内核安全研究的最高水准:

  • 发现:需要深入理解 epoll 的内部锁机制和内存管理
  • 利用:需要精确的时序控制和内存布局操作
  • 稳定化:99% 的成功率说明发现者在缓解竞态不稳定性方面做了大量工程优化

$71,337+ 的 Google kernelCTF 奖励反映了这类漏洞的真实价值。

5.3 给防御者的建议

  1. 及时打补丁:对于内核级漏洞,补丁是唯一有效的防御手段
  2. 最小权限原则:即使攻击者获得了本地代码执行权限,也应限制其可访问的资源和可执行的操作
  3. 运行时检测:虽然竞态条件难以预防,但可以通过异常行为检测(如大量 epoll 创建/销毁操作)来发现利用尝试
  4. 纵深防御:即使内核被攻破,后续的安全层(如容器隔离、应用层访问控制)可以限制损害范围

免责声明

本文仅供网络安全技术研究和教育目的,所有漏洞信息来源于 NVD(CVE-2026-46242)、Linux 内核安全邮件列表及安全厂商的公开风险通告。本文不包含任何可直接用于非法攻击的原始利用代码或攻击载荷,所有技术描述均以安全防御、漏洞修复和行业分析为导向。读者应遵守所在国家/地区的法律法规,仅将本文内容用于授权的安全测试和防御性安全研究。未经授权对他人系统进行渗透测试或攻击属于违法行为。


参考资料