#今天又看了啥 #security
io_uring ZCRX Freelist LPE — 从 u32 到 root -- ze3tar
https://ze3tar.github.io/post-zcrx.html

漏洞概要
- Linux 6.15~6.19 中 io_uring 新子系统 ZCRX(零拷贝收包)存在 OOB(越界)堆写入漏洞
- 漏洞位置:freelist[] 管理空槽索引时,free_count 无上界检查,导致写入 freelist[num_niovs](超尾 4 字节)
- 写入值:niov 索引,范围 [0, N-1] —— 看似没用,实则致命

触发条件
- 需要 CAP_NET_ADMIN 权限
- 需要支持 ZCRX 的物理网卡(Mellanox ConnectX-6+、Intel E800、NFP 等)
- 触发方式:网卡 down(SIOCSIFFLAGS ~IFF_UP)→ page_pool_destroy() → 两条路径(ptr_ring drain + scrub loop)重复入栈导致 free_count 溢出

利用链
1. 选择 area 大小 → 控制 num_niovs → 控制 freelist 所在的 slab cache → 控制相邻对象
2. 堆喷 msg_msg(kmalloc-128)→ 让 freelist 与 msg_msg 相邻
3. 触发 OOB → 覆盖相邻 msg_msg 的 m_list.next 低 4 字节
4. msgrcv 堆读取 → 扫描内核指针 → 破解 KASLR
5. 写 modprobe_path(通过 /proc/sys/kernel/modprobe)→ 指向恶意脚本
6. 触发未知 socket 协议call_usermodehelper → 提权为 root

修复
- commit 770594e(2026-04-21),在 io_zcrx_return_niov_freelist 中增加 free_count >= num_niovs 检查
- 尚未合入任何 stable 分支,仍在路上的内核均有风险

PoCs 已公开
- zcrx_crash.c — 纯 OOB 触发验证
- zcrx_lpe.c — 完整 LPE 利用链(KASLR + modprobe_path + SUID bash)


一句话:io_uring 新版 ZCRX 没做边界检查,网卡 down 时重复入栈写穿 slab,一个 0~31 的小整数一路打到 root。 🔥

需要高端网卡,散了散了
 
 
Back to Top