-
-
[注意]732字节,通杀所有Linux!一个潜伏十年的“隐形杀手”终曝光
-
发表于: 8小时前 296
-
一个仅有732字节的Python脚本,就能在几乎所有2017年后发布的Linux发行版上,以100%的成功率拿下root权限。这并非科幻情节,而是4月29日被公开的Linux内核漏洞CVE-2026-31431,代号“Copy Fail”。
与传统需要反复尝试、碰运气的竞态漏洞不同,Copy Fail是一条“直线逻辑错误”——它不依赖任何竞争条件,不需要反复重试,一次执行即可稳定提权。更致命的是,它的攻击手法极其隐蔽,且能直接穿透容器。
一个潜伏十年的设计缺陷
漏洞的根源是三次看似无害的内核改动在十年间悄然叠加,最终酿成大祸。
2011年,为了支持IPsec的64位扩展序列号,内核引入了authencesn加密模板。该模板在计算HMAC时,需要重新排列序列号的高低位字节。当时的设计者选择直接用调用者提供的目标缓冲区作为“临时草稿纸”,在缓冲区边界之外写入4字节的序列号低位,且从未恢复原始数据。由于当时只有内核内部的xfrm层调用此功能,这一越界写入行为并未暴露。
2015年,authencesn被转换为新的AEAD接口,越界写入的位置被精确确定为“关联数据长度+密文长度”之后。同年,AF_ALG模块获得了AEAD支持,可通过splice()零拷贝将文件页面缓存直接传入加密操作的数据列表中。但此时加密操作仍是“异地”(out-of-place)模式,输入和输出使用不同的内存区域,文件页面缓存仅作为只读输入,因此尚不可利用。
2017年,一项性能优化彻底打开了潘多拉魔盒:AF_ALG被改为“就地”(in-place)模式,输入和输出共享同一份内存列表。在解密操作中,内核会将认证标签部分直接“链入”输出区域——这些标签页面恰恰来自攻击者通过splice()传入的文件页面缓存。此时,authencesn那4字节的越界写入便会精准地篡改内核缓存中的文件内容。
整个过程不需要任何竞争条件,一次系统调用即可精准命中。攻击者通过精心构造的关联数据、splice偏移量和长度,能够精确控制要篡改的4字节内容及位置。一个攻防链条就此形成:篡改内存中/usr/bin/su等setuid二进制文件的代码段,注入恶意指令,执行后直接获得root权限。
三大特性让Copy Fail格外危险
全平台通杀:同一个732字节的Python脚本(仅使用标准库),无需针对特定发行版修改偏移量或重新编译,在Ubuntu、Debian、RHEL、Amazon Linux、SUSE等主流系统上均可直接运行。
极度隐蔽:攻击全程只修改内存中的页面缓存,磁盘上的原始文件丝毫不受影响。内核从未将该页面标记为“脏”,因此不会触发写回磁盘。这意味着普通的文件完整性校验工具会直接漏过,因为磁盘镜像和校验和都是干净的。重启后,系统自动恢复正常状态,几乎不留痕迹。
容器逃逸天然适配:页面缓存是宿主机级别共享的。一个普通容器内的攻击者,就可以修改宿主机的页面缓存,进而逃逸到宿主机,威胁整个节点。这一点在多租户Kubernetes集群中尤为致命。
与其他著名提权漏洞的对比
相较于 Dirty Cow 需要赢得竞争条件、多次尝试且可能造成系统崩溃,Dirty Pipe 仅影响特定版本且需精细操控管道缓冲区,Copy Fail的直线逻辑缺陷使其具有无可比拟的稳定性。同一脚本一次执行,成功率100%,影响范围横跨近九年。
给用户的具体应对指南
需要明确的是,Copy Fail是一个本地提权漏洞,攻击者必须首先在目标机器上获得普通用户代码执行权限,远程攻击者无法直接利用。但对于多用户共享服务器、CI/CD环境、容器宿主机,以及开放SSH账号的机器,风险极高。
立即检测当前系统状态:
- 检查内核版本:uname -r
- 查看已安装的内核镜像:dpkg -l 'linux-image*' | grep '^ii'
- 检查algif_aead模块是否加载:lsmod | grep algif_aead
临时缓解措施(在官方补丁到达前):
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf sudo rmmod algif_aead 2>/dev/null sudo reboot
此操作会禁用漏洞所依赖的内核模块,对绝大多数系统的日常使用无影响。
永久修复:等待操作系统官方推送修复内核后执行:
sudo apt update sudo apt full-upgrade