Linux内核中一个关键的零日漏洞已被公开披露,该漏洞允许任何非特权的本地用户获得自2017年以来发布的几乎所有主流Linux发行版的root访问权限。
该漏洞被命名为 “Copy Fail”,编号为 CVE-2026-31431,由 Theori 研究员 Taeyang Lee 发现,并由 Xint Code Research Team 利用 AI 辅助分析将其扩展为完整的漏洞利用链。
Copy Fail 是一个直线逻辑错误,而非竞争条件。它存在于 Linux 内核的 authencesn 加密模板中,可通过 AF_ALG 套接字接口结合 splice() 系统调用触发。
与之前的漏洞(如 Dirty Cow (CVE-2016-5195) 或 Dirty Pipe (CVE-2022-0847))不同,该漏洞无需赢得竞争条件、无需内核版本偏移、无需重新编译,也无需编译后的有效负载。
Linux 内核 0-Day “Copy Fail” 详情
一个仅 732 字节、仅使用标准库模块的 Python 脚本,即可在所有经过测试的发行版和架构上确定性地获得 root 权限。
该漏洞利用针对内核的页缓存(文件在内存中的表示),通过触发向属于攻击者可读任意文件的页缓存页中写入可控的 4 字节数据。由于 Linux 内核永远不会将该损坏的页标记为脏页以写回磁盘,因此磁盘上的文件保持不变,导致基于校验和的常规文件完整性检测工具完全无法察觉修改。然后,攻击者执行损坏的内存版本的 setuid 二进制文件(例如 /usr/bin/su),从而实现 root shell 执行。
该漏洞源于 2017 年对 algif_aead.c 引入的一项就地优化(commit 72548b093ee3)。当用户将一个文件 splice 到管道中,并将其送入 AF_ALG 套接字时,AEAD 输入散列表持有该文件内核物理页缓存页的直接引用——而非副本。对于 AEAD 解密操作,algif_aead.c 设置 req->src = req->dst,使源和目标指向同一个组合散列表。这将页缓存页放入了一个可写的目标散列表中。随后,被 IPsec 用于支持 64 位扩展序列号 (ESN) 的 authencesn 算法,会将调用者的目标缓冲区用作临时空间来重新排列 ESN 字节,从而在 assoclen + cryptlen 偏移量之后写入 4 字节,直接写入链式页缓存页中。
2011 年、2015 年和 2017 年的三个独立且合理的代码变更共同创造了这一可利用条件,而近十年来没有人意识到它们交汇后产生的问题。
同一未经修改的漏洞利用脚本在所有四个测试平台上均成功获得 root shell:
该漏洞自内核 4.14 版本引入,并在未修复的版本线上影响所有发行版。
除了本地权限提升,Copy Fail 还可作为 Kubernetes 容器逃逸的原语。由于页缓存由主机上的所有进程共享(包括跨容器边界),一个被攻破的容器可以破坏其他容器和主机内核可见的 setuid 二进制文件。Xint Code 研究系列的第二部分涵盖了完整的 Kubernetes 节点攻破。
补丁已发布
官方修复(commit a664bf3d603d)恢复了非就地 AEAD 操作,将 TX 散列表(可能包含页缓存页)与 RX 散列表(用户输出缓冲区)永久分离。这消除了将页缓存页链接到可写目标 sg_chain() 的机制。
在内核更新之前的立即缓解措施:
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 日公开披露。强烈建议系统管理员立即应用内核更新。