#今天又看了啥 #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(越界)堆写入漏洞
- 漏洞位置:
- 写入值:niov 索引,范围 [0, N-1] —— 看似没用,实则致命
触发条件
- 需要 CAP_NET_ADMIN 权限
- 需要支持 ZCRX 的物理网卡(Mellanox ConnectX-6+、Intel E800、NFP 等)
- 触发方式:网卡 down(
一句话:io_uring 新版 ZCRX 没做边界检查,网卡 down 时重复入栈写穿 slab,一个 0~31 的小整数一路打到 root。 🔥
需要高端网卡,散了散了
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
修复
- commit770594e(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。 🔥
需要高端网卡,散了散了