CVE-2026-46242
eventpoll: 修复 ep_remove 中 struct eventpoll / struct file 的释放后使用
- 已发布
- 2026年5月30日
- 已更新
- 2026年8月5日
- 分配 CNA
- Linux
- 观察到的证据
- 2026年8月8日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H低 · 未来 30 天
- 百分位
- 87.4%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
在 Linux 内核中,以下漏洞已得到修复:eventpoll:修复 ep_remove 中 struct eventpoll / struct file 的 UAF ep_remove()(经由 ep_remove_file())在持有 file->f_lock 时清除 file->f_ep,但随后在临界区内仍继续使用 @file(is_file_epoll()、通过链表头执行 hlist_del_rcu()、spin_unlock)。在该时间窗口内,并发的 __fput() 若走 eventpoll_release() 快速路径,会观察到这一瞬态 NULL,从而跳过 eventpoll_release_file() 并直接进入 f_op->release / file_free()。就 epoll 监视 epoll 的场景而言,f_op->release 为 ep_eventpoll_release() -> ep_clear_and_put() -> ep_free(),其中会 kfree() 掉被监视的 struct eventpoll。其内嵌的 ->refs hlist_head 恰好就是 epi->fllink.pprev 所指向的位置,因此紧随其后的 hlist_del_rcu() 中的 "*pprev = next" 会乱写已释放的 kmalloc-192 内存。此外,struct file 属于 SLAB_TYPESAFE_BY_RCU,支撑 @file 的槽位有可能被 alloc_empty_file() 回收——在 ep_remove() 名义上仍处于该锁内时便重新初始化 f_lock 和 f_ep。最终结果是攻击者可以对错误的 slab 缓存执行一次可控的 kmem_cache_free()。在 ep_remove() 开头通过 epi_fget() 固定 @file,并仅在固定成功时才进入临界区。持有固定引用时,@file 的引用计数不可能降为零,这会使 __fput() 无法执行,并间接保证被监视的 struct eventpoll 在 hlist_del_rcu() 和 f_lock 使用期间保持存活,从而同时堵住这两处 UAF。若固定失败,说明 @file 的引用计数已降至零,其 __fput() 正在执行中。由于我们在清除 f_ep 之前便已退出,该路径会走 eventpoll_release() 慢路径进入 eventpoll_release_file(),并阻塞在 ep->mtx 上,直到等待方一侧的 ep_clear_and_put() 释放该锁。被放弃的 epi 在 ep->refcount 中所占的份额保持完好,因此 ep_clear_and_put() 末尾的 ep_refcount_dec_and_test() 无法在 eventpoll_release_file() 执行期间抢先释放该 eventpoll;这个孤儿 epi 随后会在那里得到清理。固定成功还证明我们没有在该 epi 上与 eventpoll_release_file() 竞争,因此可以去掉 f_lock 下对 epi->dying 的冗余复查。廉价的免锁 READ_ONCE(epi->dying) 快速路径提前退出仍然保留。
来源
6- bad-epoll漏洞利用
针对 CVE-2026-46242 的 Linux 内核权限提升漏洞利用程序,该漏洞是 epoll 中的竞争条件释放后使用(use-after-free)漏洞,可在台式机、服务器和 Android 设备上以 99% 的可靠性获取 root 权限。
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。