一、漏洞概述
CVE-2026-31431(CopyFail)是 Linux 内核 AF_ALG AEAD 接口 中的一个本地权限提升漏洞。该漏洞由一个 逻辑缺陷 引起——不是竞态条件,不需要特定内核偏移量——稳定利用,影响 自 2017 年以来的所有主流 Linux 发行版。
该漏洞允许本地无特权用户通过修改任意只读文件的页缓存(page cache),在不修改磁盘文件的前提下篡改 setuid 二进制文件(如 /usr/bin/su)的内存映像,从而实现从普通用户到 root 的权限提升。
二、技术原理深度分析
2.1 根本原因
2017 年,commit 72548b093ee3 为 algif_aead.c 引入了一项"原地操作"(in-place)优化:在 AEAD 解密时,将源 scatterlist 和目标 scatterlist 设置为同一对象(req->src = req->dst),省去了数据拷贝开销。
然而,当用户通过 splice() 系统调用将文件页缓存页引入 AF_ALG 的输入缓冲区时,这些页缓存页同时出现在了可写的目标 scatterlist 中。
2.2 触发链条
1. splice() 将目标文件(如 /usr/bin/su)的页缓存页引入 AF_ALG 的 TX 缓冲区 ↓2. algif_aead 将 tag 字节从 TX SGL 移动并链接到 RX SGL(此时 RX SGL 包含文件页缓存页) ↓3. authencesn 将 req->src = req->dst 视为原地缓冲区 ↓4. 解密过程中 在 dst[assoclen + cryptlen] 位置执行 4 字节越界写入(scratch write) ↓5. 写入发生在 tag 校验之前,即使解密失败(-EBADMSG),页缓存已被修改 ↓6. execve() 目标文件时加载被篡改的页缓存 → root shell
2.3 关键代码路径
根据 oss-security 邮件列表披露的技术细节:
algif_aead.c:235-244:将 tag 字节从 TX SGL 移至 RX SGLalgif_aead.c:251-252:设置 req->src = req->dst(in-place 优化)authencesn.c:277-279:执行 4 字节写入到 tag 区域authencesn.c:222-223:tag 校验(此时写入已完成,返回 -EBADMSG 为时已晚)
2.4 为什么是"逻辑缺陷"而非竞态
大多数内核 LPE 漏洞需要精确的竞态窗口(race window)或内核版本特定的偏移量。CopyFail 的特殊之处在于:
- 确定性执行:每次 splice + decrypt 操作必定触发 4 字节写入
- 利用代码已广泛传播:GitHub 上已有 27+ 个相关仓库,包含多语言实现
三、影响范围评估
3.1 受影响内核版本
| |
|---|
| 72548b093ee3 |
| a664bf3d603d |
| 2017.08 → 2026.04(近 9 年) |
| 5.10、5.15、6.1、6.6、6.12(截至公开日均未修复) |
| |
稳定分支修复 commits(来自 NVD):
3.2 受影响发行版
Theori 官方直接验证的发行版:
此外,Debian、Arch、Fedora、Rocky、Alma、Oracle Linux、Kali 以及各类嵌入式发行版同样受影响(使用相同内核代码路径)。
3.3 前提条件
3.4 风险等级评估
| | |
|---|
| 高 | 共享开发机、跳板机、构建服务器 → 任意用户可提权为 root |
| 高 | |
| 高 | GitHub Actions 自托管 Runner、GitLab Runner → PR 代码可获取主机 root |
| 高 | Notebook 主机、Agent 沙箱、Serverless → 租户可提权为宿主 root |
| 中 | 单租户环境,但可与其他漏洞链式组合(如 Web RCE) |
| 较低 | |
3.5 容器逃逸原语
特别值得注意的是,CopyFail 提供了容器逃逸原语。由于页缓存在宿主机内核中共享,容器内的攻击者可以修改宿主机上 setuid 二进制文件的页缓存,从而逃逸到宿主机并获得 root 权限。这对 Kubernetes 多租户环境构成严重威胁。
四、修复与缓解措施
4.1 正式修复方案
更新内核至包含修复 commit a664bf3d603d 的版本。该修复回退了 2017 年的 in-place 优化,将源和目标 scatterlist 分离,使页缓存页不再出现在可写的加密目标中。
各发行版补丁状态(截至 2026-04-30):
4.2 临时缓解措施
在打补丁前,立即禁用 algif_aead 模块:
echo"install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.confrmmod algif_aead 2>/dev/null || true
兼容性影响评估:
- ❌ 不影响: dm-crypt/LUKS、kTLS、IPsec/XFRM、OpenSSL/GnuTLS/NSS 默认构建、SSH、内核 keyring 加密(这些使用内核内部 crypto API,不走 AF_ALG)
- ⚠️ 可能影响: 显式启用 AF_ALG engine 的 OpenSSL、部分嵌入式加密卸载路径、直接绑定 aead/skcipher/hash socket 的应用
- 💡 性能影响: AF_ALG 是用户态到内核 crypto API 的接口,禁用后受影响应用回退到用户态加密库,性能基本无感知
4.3 加固建议(针对不可信工作负载)
对于容器、沙箱、CI 环境中的不可信工作负载,无论是否已打补丁,都应通过 seccomp 阻止 AF_ALG socket 创建。
五、信息披露时间线
| |
|---|
| 引入 commit 72548b093ee3(AF_ALG iov_iter rework) |
| |
| |
| |
| |
| |
| 公开披露(copy.fail)+ oss-security 邮件列表公告 |
六、参考链接
- 官方漏洞网站: https://copy.fail[1]
- NVD CVE 详情: https://nvd.nist.gov/vuln/detail/CVE-2026-31431[2]
- 修复 commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a664bf3d603d[3]
- 引入 commit: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=72548b093ee3[4]
- oss-security 公告: http://www.openwall.com/lists/oss-security/2026/04/29/23[5]
七、总结与建议
核心结论
CopyFail 是近十年来影响最广泛的 Linux 内核 LPE 漏洞之一:
- 覆盖面极广:影响 2017 年以来几乎所有 Linux 系统,时间跨度近 9 年
- 利用代码已广泛传播:GitHub 上已有 27+ 个相关仓库,包含多语言实现
- 影响多种部署形态:传统服务器、容器、CI/CD、云 SaaS 均受影响
行动建议
- 立即执行临时缓解:在所有 Linux 服务器上禁用
algif_aead 模块 - 尽快更新内核:升级至包含
a664bf3d603d 的发行版内核包 - 容器环境加固:通过 seccomp 禁止 AF_ALG socket 创建
- 排查入侵痕迹:检查系统中 setuid 二进制文件的页缓存是否被异常修改
- 持续关注发行版公告:各发行版正在推送补丁,保持关注更新状态