732字节,炸穿所有Linux
一条Python脚本,换来root权限。
4月29日,安全公司Xint Code披露了编号CVE-2026-31431的内核漏洞,代号"Copy Fail"。732字节Python代码,不需要编译,不需要安装依赖,任何普通用户都能在2017年以来几乎所有Linux发行版上直接拿到root。
Ubuntu、Amazon Linux、RHEL、SUSE,一个脚本,全部拿下。
跟过去的漏洞不太一样。
它和Dirty Cow有什么本质区别
2016年的Dirty Cow需要竞争条件——你得在正确的时间做正确的事,有时候要试很多次,有时候还把系统搞崩。2022年的Dirty Pipe(CVE-2022-0847)需要精确操作pipe缓冲区,而且只影响特定版本。
Copy Fail没有这些问题。它是纯逻辑缺陷,触发不需要竞争,不需要重试,不需要特殊时机。就是一行行执行,到位了,root就到手了。
更离谱的是:这732字节用的全是Python标准库(os、socket、zlib),Python 3.10以上系统自带,连pip install都不用打。
原理是什么
AF_ALG是Linux内核给普通用户调用的加密接口,不需要任何权限就能对任意数据做加解密。splice()是另一个关键工具,能在文件描述符和管道之间"零拷贝"传递数据——内核直接让两边共用同一块内存页面,不复制。
把一个文件splice进管道,再送进AF_ALG做解密,内核会把数据分成三段处理:AAD(附加认证数据)→ 密文 → 认证标签。前两段正常复制到用户缓冲区,但认证标签那一段,内核做了一个聪明但危险的操作——它把目标文件的页面缓存直接"链"进了输出用的可写scatterlist,没有复制。
这意味着:目标文件的内存页面,现在出现在了一个本不应该出现的位置——一个"可写"的scatterlist里。精心构造输入之后,攻击者可以让内核把4个字节的数据写进目标文件的页面缓存。
为什么能绕过安全检查
setuid文件是Linux用来做权限提升的——普通用户运行它,它会以root身份执行。Linux会在运行前检查文件的完整性,但这个检查针对的是磁盘上的文件,而不是内存里的页面缓存。
Copy Fail改的,恰恰是内存里的页面缓存,不是磁盘上的文件。磁盘上的文件看起来完全正常,任何文件完整性检查工具都检测不出问题。系统重启?磁盘恢复?没用——下次读取那个文件,内核还是会从磁盘加载正确版本,攻击者再跑一遍脚本就是了。
它不只是本地提权
页面缓存在整个系统里是共享的,不分容器边界。Copy Fail不仅是本地提权,它还是一个容器逃逸工具,能突破容器直接影响宿主机。第二部分的技术细节尚未完全公开,但已知它可以作为Kubernetes节点的入侵向量。在容器里跑一个普通用户进程,跑完,你拿到的是宿主机root。
AI找到了它
这次发现实际上是AI辅助的。Xint Code团队透露,灵感来自Theori的安全研究员Taeyang Lee——他在研究Linux加密子系统和页面缓存交互时产生了关键直觉判断。后来通过Xint Code平台把这个发现扩展到整个加密子系统做自动化分析,Copy Fail是那次大规模扫描中最重要的成果。
你现在需要做什么
立即检查你的系统内核版本。
主流发行版已推送修复补丁:Ubuntu 24.04 LTS → 补丁已推送;Amazon Linux 2023 → 补丁已推送;RHEL 10.x → 补丁已推送;SUSE → 补丁已推送。
容器环境尤其要重视——不要假设容器边界是安全的,这次不是。打补丁,重启,就这么简单。但如果你手上有一批跑着旧内核的服务器,现在该检查了。
CVE-2026-31431,大概是近年来最干净的内核提权漏洞:没有运气成分,代码短到离谱,影响范围覆盖几乎所有Linux系统。
素材来源:① Copy Fail — CVE-2026-31431 ② Copy Fail: 732 Bytes to Root on Every Major Linux Distribution ③ Zed 1.0 ④ Zig project's rationale for their firm anti-AI contribution policy