跳至正文
Wener Notes

CVE-2026-43121

约 2 分钟阅读
  • io_uring ZCRX freelist - 零拷贝接收路径的引用计数竞态,使同一缓冲区重复进入空闲列表并造成越界写
  • CVE 记录公开:2026-05-06
  • 上游引入版本:Linux 6.15
  • 严重性:CVSS 3.1 4.7 Medium(NVD)
    • CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H
  • CWE:CWE-362(共享资源访问同步不当导致竞态,NVD)

成因与利用条件

  • io_zcrx_put_niov_uref() 将 user_refs 的检查和递减拆成两个操作,无法与 scrub 路径的清零操作保持原子性
  • scrub 与 refill 并发时,同一个 niov 可能两次进入 freelist,使 free_count 超过数组容量,后续操作越界写入相邻内存
    • 这里的重复释放首先体现为 freelist 重复入队,不宜直接等同于两次 kfree()
  • 可造成内存破坏和拒绝服务;Red Hat 还指出潜在提权或代码执行风险,NVD 上述评分只计入可用性影响
  • 需要本地可达的 ZCRX 零拷贝接收功能及相关并发操作,普通 io_uring 使用场景不能直接等同于可利用
    • Linux v6.18 的 io_register_zcrx_ifq() 注册入口检查 CAP_NET_ADMIN
    • 该权限检查针对所引用版本的注册入口;其他版本及已委派资源的权限边界需按实现核对
  • 与 的 Unix socket 垃圾回收 UAF 是不同问题

修复与缓解

上游分支Linux CNA 列出的修复版本
6.186.18.16
6.196.19.6
主线正式版7.0
  • 修复使用 atomic_try_cmpxchg 循环,将检查与递减合并为原子操作
  • 更新到包含该修复的受支持内核;6.15–6.17 等历史分支另查厂商补丁,不能仅比较主线版本
  • 避免向不可信任务提供 ZCRX 资源及不必要的管理能力可减少暴露;不能替代修复,也不能据此推断既有资源不可被利用

PoC

  • 以下为 Linux CNA 公告给出的竞态时序,属于原理示意;尚未确认可信的独立可运行 PoC 仓库
  • 初始条件:同一 niov 的 user_refs = 1
步骤refill 路径scrub 路径
1读取 user_refs,得到 1
2将 user_refs 原子清零,第一次将 niov 放入 freelist
3依据此前读取结果递减,计数从 0 变为 -1
4再次将同一 niov 放入 freelist
  • 重复入队使空闲计数不再反映真实容量,后续 push 可能越界写入;补丁将检查与递减合并,阻止这种交错
  • 表格说明根因,不代表已在某个内核构建中复现崩溃或提权;具体注册能力和资源条件见前文

参考

关联信息

反向链接、本文链接的其他页面和外部资料。

站内链接

  • CVE-2022-2602
    笔记 · CVE-2022-2602

    iouring UAF - iouring 与 Unix 域套接字垃圾回收之间的竞态,造成释放后使用 · UAF / Use After Free / 释放后使用 · 公开披露:2022-10-18(oss-security);CVE/NVD 记录在 2024-01-08 才公开

参考资料

GitHub1 条
其他外链3 条
最近更新commit 0c5208b编辑