News Hacker|极客洞察

138 8 小时前 ze3tar.github.io
😬io_uring ZCRX freelist 越界写可致 root
一个 u32,怎么总能一路送到 root?

🎯 讨论背景

这篇帖子讨论的是 Linux 内核 io_uring(Linux 内核的异步 I/O 机制)里 ZCRX(zero-copy receive,零拷贝接收)路径的 freelist 越界写,标题里的“u32”指的是一个看似普通的 32 位整数,却能被利用成本地提权。评论里有人提到 oss-security 邮件列表上已经讨论过这个漏洞,相关修复似乎也进了 stable 分支,所以它更像是一个已知攻击面的再曝光。可利用面还受 CAP_NET_ADMIN、CAP_SYS_ADMIN、真实 ZCRX-capable NIC 和特定驱动/硬件条件限制,因此很多人把它看成“高危但场景受限”的内核漏洞。讨论同时延伸到 io_uring 是否应该默认禁用、静态分析与 Rust 能否减少这类 bug,以及 LLM agent 是否正在改变 CVE 的发现速度。

📌 讨论焦点

边界检查与 Rust/C 争论

评论首先拆解了这个 bug 的直接原因:`free_count` 在写入前就自增,导致当 freelist 已满时会把索引写到 `freelist[num_niovs]`,也就是数组末尾外一格。有人认为这只是一个普通的 bounds check 漏洞,补丁里已经加了检查;另一派则把它当作反例,说明只要是 C 代码,类似错误就会反复出现。讨论随后转到 Rust 和静态分析:有人强调 safe Rust 默认有边界检查,`unsafe` 只是少数需要审计的区域;也有人指出静态分析、Coverity、Sparse 之类工具能抓到部分问题,但要么成本高,要么误报或路径推理太脆弱,`clang -fbounds-safety` 也还只是设计阶段。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13]

标题与新旧漏洞争议

不少人怀疑这不是全新的 exploit,而是和几个月前的 io_uring 攻击路径很接近,甚至可能已经在 stable 里修好了。还有人指出,原文关于“有 CAP_SYS_ADMIN 就能拿 root shell”的表述在 oss-security 讨论后被修订,说明标题和正文都带有一定夸张。基于这个角度,标题更像是在放大冲击感,而不是描述一个完全陌生的漏洞类别。

[来源1] [来源2] [来源3]

实际影响与权限门槛

围绕实际可利用面,评论集中在 CAP_NET_ADMIN 和 CAP_SYS_ADMIN 这两个 Linux capabilities 上。有人指出在 unprivileged user namespace 里,这两个能力可以被拿到“名字上像 root”的版本,但这并不自动等于能改宿主机上的非 namespace 参数,例如 `modprobe_path` 这类全局 sysctl。还有人补充说,ZCRX page pool 只会在真实的 ZCRX-capable NIC 上创建,比如 mlx5 ConnectX-6+、Intel E800 或 NFP,因此攻击面比标题看上去更窄。尽管如此,拿到这个 OOB write 之后,是否能转成 container escape 或其他数据导向攻击,仍然被认为值得继续研究。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8]

io_uring 的安全争议与防御

也有人把这事放进 io_uring 的长期安全争议里看:它被形容成一个 security nightmare,因为历史上不断出现 privesc 和 syscall smuggling 相关问题。几位评论者提到,某些生产环境和容器默认会直接禁用 io_uring,Google 也曾在生产服务器上这么做并缓慢恢复。防御建议主要是通过 `sysctl -w kernel.io_uring_disabled=2` 之类的方式彻底关掉,或者依赖容器、AppArmor、SELinux 这类 sandboxing / MAC 机制,但也有人担心这些方案因为 UX/DX 太差,最后会被用户自己关掉。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8]

AI/LLM 在 CVE 发现中的作用

另一条很热的线索是,最近 HN 前页频繁出现安全漏洞,并不只是因为项目变脆弱,而是 LLM agent 已经能批量做漏洞发现。有人概述了一个很朴素的流程:挑一个文件做种子,让一个模型在 agent harness 里找 bug,再让另一个模型去验证或写 exploit,如果两者一致,往往就是真漏洞。评论里还提到 Anthropic 之类的研究和实际使用案例,认为现在的能力已经足够把大规模 repo 扫描自动化;也有人担心这会让公开源码更容易被批量搜刮,甚至怀疑闭源代码在这方面会相对更“安全”。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12]

Linux 安全态势:暴露更多不等于更差

关于“Linux 正在崩坏”的情绪,更多评论持反对态度,认为公开 CVE 只是过去积累的缺陷被更快发现和修复。有人强调,补丁是在填旧洞而不是制造新洞,因此更像是安全加固过程而非系统性失控。另一些人则提醒,政府机构或其他对手可能早已把其中一些漏洞收入私有工具箱,所以公开披露只能缩小一部分风险窗口。

[来源1] [来源2] [来源3] [来源4]

📚 术语解释

io_uring: Linux 内核的异步 I/O 机制,用提交队列和完成队列提高性能。

ZCRX: zero-copy receive 的缩写,指网络接收时尽量避免数据拷贝的路径。

LPE: local privilege escalation,本地提权,指把低权限提升到更高权限。

CAP_SYS_ADMIN / CAP_NET_ADMIN: Linux capabilities 中的高权限标记,分别对应泛管理权限和网络管理权限。

user namespace: Linux 的用户命名空间,进程可在其中拥有与宿主机隔离的权限视图。

static analysis: 不执行程序、直接检查源码或中间表示以找出缺陷的分析方法。

unsafe Rust: Rust 中显式放宽安全检查的代码区域,允许指针等低层操作,但需要手工保证安全性。

SELinux / AppArmor: Linux 强制访问控制框架,用策略限制进程即使拿到部分权限后的行为。