网络安全研究人员公开披露了 Linux 内核中的一个关键 0Day 漏洞(CVE-2026-31431),该漏洞允许任何无特权的本地用户在几乎所有 2017 年后发布的 Linux 发行版上获取 root 权限。
该漏洞被命名为 "Copy Fail",由 Theori 研究员 Taeyang Lee 发现,并由 Xint Code 研究团队通过 AI 辅助分析构建了完整的漏洞利用链。该漏洞是 Linux 内核 authencesn 加密模板中的一个直线逻辑错误(非竞态条件),可通过 AF_ALG 套接字接口结合 splice() 系统调用来触发。
漏洞技术细节
与 Dirty Cow(CVE-2016-5195)或 Dirty Pipe(CVE-2022-0847)等历史漏洞不同,"Copy Fail" 漏洞无需竞态条件获胜、无需内核版本偏移、无需重新编译,也无需编译有效载荷。
仅需一个 732 字节的 Python 脚本(仅使用标准库模块),即可在所有测试过的发行版和架构上确定性地获取 root 权限。该漏洞利用针对内核的页面缓存(文件的内存表示形式),通过触发对攻击者可读文件的页面缓存页面的 4 字节可控写入来实现提权。
由于 Linux 内核不会将损坏的页面标记为脏页进行回写,因此磁盘上的文件保持不变,导致基于校验和的文件完整性工具完全无法检测到修改。攻击者随后可执行被篡改的内存版 setuid 二进制文件(如 /usr/bin/su),从而获得 root shell。
漏洞根源分析
该漏洞源于 2017 年对 algif_aead.c(提交 72548b093ee3)引入的一项就地优化。当用户将文件拼接至管道并输入 AF_ALG 套接字时,AEAD 输入分散列表直接引用了该文件的内核物理页面缓存页面,而非副本。
对于 AEAD 解密操作,algif_aead.c 设置了 req->src = req->dst,使源和目标都指向同一个组合分散列表。这将页面缓存页面置于可写目标分散列表中。authencesn 算法(IPsec 用于支持 64 位扩展序列号 ESN)随后使用调用者的目标缓冲区作为暂存空间来重新排列 ESN 字节,在声明的输出边界之外(偏移量 assoclen + cryptlen 处)写入 4 字节,直接进入链式页面缓存页面。
2011 年、2015 年和 2017 年的三项独立且合理的代码变更共同导致了这一可利用条件,近十年来无人发现它们的交集问题。
影响范围验证
未经修改的漏洞利用脚本在所有四个测试平台上均成功获取 root shell:
该漏洞自内核 4.14 版本引入,影响所有包含未修复代码的发行版。除本地提权外,"Copy Fail" 还可作为 Kubernetes 容器逃逸原语。由于页面缓存在主机上的所有进程间共享(包括跨容器边界),被入侵的容器可破坏其他容器和主机内核可见的 setuid 二进制文件。Xint Code 研究系列的第二部分将详细介绍完整的 Kubernetes 节点入侵方法。
补丁与缓解措施
官方修复补丁(提交 a664bf3d603d)将 algif_aead.c 恢复为异地 AEAD 操作,永久分离 TX 分散列表(可能包含页面缓存页面)和 RX 分散列表(用户输出缓冲区)。这消除了将页面缓存页面链接到可写目标的 sg_chain() 机制。
内核更新前的临时缓解方案:
- 禁用
algif_aead 内核模块以消除攻击面:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.confrmmod algif_aead 2>/dev/null
该漏洞于 2026 年 3 月 23 日报告给 Linux 内核安全团队,补丁于 2026 年 4 月 1 日提交到主线,CVE 编号于 2026 年 4 月 22 日分配,并于 2026 年 4 月 29 日公开披露。系统管理员应立即应用内核更新。