Skip to main content

#今天又看了啥 #security io_uring ZCRX Freelist LPE — 从 u32 到 root -- ze3tar

  1. Forwarded from 🐱MiaoTony's Box | 困困困 zzz (MiaoTony 🐱)
    #今天又看了啥 #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。 🔥

    需要高端网卡,散了散了