以 4 字节污染拿 Root:Linux 内核 Copy Fail 漏洞解析
0x00 前言
在 Linux 内核安全领域,逻辑漏洞往往比堆栈溢出更具杀伤力。近日,Theori 团队通过其 AI 漏洞挖掘系统披露了一个名为 "Copy Fail"(CVE-2026-31431)的高危漏洞。
该漏洞的优雅之处在于:它不依赖复杂的堆喷(Heap Spray),不需要绕过 KASLR,甚至无需处理竞态条件(Race Condition)。 攻击者只需利用内核 AEAD 加密接口与 Page Cache 的交互逻辑缺陷,通过受控的 4 字节写入,即可实现对只读文件(如 /etc/passwd)的内存篡改,从而瞬时获取 Root 权限。
0x01 核心原理:三位一体的逻辑崩塌
"Copy Fail" 的本质是内核在追求“零拷贝”性能优化时,忽视了跨组件状态的一致性。漏洞由三个核心组件交织而成:
- 1. AF_ALG (algif_aead) 的原位操作:内核允许加密/解密在同一个缓冲区内完成(
src == dst),以减少内存拷贝开销。 - 2. splice() 的零拷贝特性:
splice 系统调用可以将文件直接映射到内核管道(Pipe),而无需经过用户态。此时,Pipe 缓冲区直接指向文件在内存中的 Page Cache。 - 3. authencesn 的“擦写”行为:在执行解密前,内核会暂时将 4 字节的序列号(Sequence Number)写入输出缓冲区。
致命逻辑: 当攻击者将 /etc/passwd 通过 splice 映射为加密接口的输出缓冲区时,内核在验证 HMAC 失败前,就已经把 AAD 中的 4 字节数据写入了 /etc/passwd 的 Page Cache。即便最后返回错误,这 4 字节的污染也已经永久留在了内存里。
0x02 攻击流程图
以下是漏洞触发的逻辑全景图:
0x03 关键攻击代码片段
利用该漏洞需要精确控制 AF_ALG 的 AAD 数据偏移。
1. 算法接口初始化
// 绑定 authencesn 算法,这是触发 4 字节写入的载体struct sockaddr_alg sa = { .salg_family = AF_ALG, .salg_type = "aead", .salg_name = "authencesn(hmac(sha256),cbc(aes))"};int tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0);bind(tfmfd, (struct sockaddr *)&sa, sizeof(sa));int opfd = accept(tfmfd, NULL, 0);
2. 利用 splice 挂载目标文件
int target_fd = open("/etc/passwd", O_RDONLY);int pipe_fds[2];pipe(pipe_fds);// 将目标文件(只读)的内容引入管道// 偏移量 offset 需要精确计算,使 4 字节写入正好落在 UID 字段splice(target_fd, &offset, pipe_fds[1], NULL, 4096, SPLICE_F_MOVE);
3. 触发 4 字节“脏写入”
// 通过 recvmsg 诱导内核执行 authenc_esn_decrypt// 虽然会因为 HMAC 错误返回 -EBADMSG,但 Page Cache 已被污染struct msghdr msg = {};// ... 构建包含 AAD 和目标管道引用的 msghdr ...recvmsg(opfd, &msg, 0);
0x04 深度解析:为什么是“4 字节”?
在内核 crypto/authencesn.c 的源码中,存在一段看似无害的操作:
内核为了处理 IPsec 的扩展序列号(ESN),会在解密前调用 scatterwalk_map_and_copy 将序列号拷贝到输出缓冲区。
这 4 个字节 的写入动作发生在 认证校验之前。如果输出缓冲区是通过 splice 映射的文件内存页,这 4 字节就会绕过文件系统的只读保护。攻击者只需将目标用户的 UID(如 1001)覆盖为 0000,系统在内存中就会认为该用户是 Root。
0x05 漏洞总结与安全建议
- • 威胁等级:高危。稳定、通用、无损(重启后 Page Cache 恢复,不留物理痕迹)。
- • 影响范围:Linux Kernel 4.14+ 且开启了
CONFIG_CRYPTO_USER_API_AEAD 的发行版。 - 1. 内核升级:各大发行版已发布针对
algif_aead 的修复补丁,禁止其在不安全条件下的原位操作。 - 2. 临时缓解:对于关键生产环境,若无法重启,可考虑使用
modprobe -r algif_aead 临时下线该算法接口。
参考来源:Xint.io - Copy Fail Analysis [https://xint.io/blog/copy-fail-linux-distributions]
x86、arm64版本POC可在公众号留言 Copy Fail 获取