copyfail 0day 漏洞检测及修复方案
CVE-2026-31431(Copy Fail)漏洞概述
CVE-2026-31431,代号 "Copy Fail",是 2026 年 4 月公开披露的一个高危 Linux 内核本地提权漏洞,CVSS 评分 7.8(High)。该漏洞影响自 2017 年以来几乎所有主流 Linux 发行版,包括 Ubuntu、RHEL、SUSE、Amazon Linux、Debian、Fedora 和 Arch Linux 等。
漏洞原理
漏洞位于 Linux 内核的 algif_aead 模块(AF_ALG 用户态加密 API 的 AEAD 接口)。2017 年引入的一个原地操作优化(commit 72548b093ee3)存在逻辑缺陷:当通过 AF_ALG 套接字结合 splice() 系统调用处理文件时,内核错误地复用了源内存作为解密目标缓冲区。
具体攻击链如下:
splice()将目标文件的页缓存页面通过引用传入 AF_ALG 套接字的 scatterlist- 在
authencesn模板的crypto_authenc_esn_decrypt()中,解密过程使用dst[assoclen + cryptlen]作为临时缓冲区写入 4 字节数据 - 这 4 字节恰好写入目标文件的页缓存,但页面不会被标记为 dirty,因此磁盘文件保持不变,仅内存中的页缓存被篡改
- 攻击者通过反复写入,可篡改
/usr/bin/su等 setuid 二进制文件的内存映像,执行时获得 root 权限。
关键特征
| 特征 | 说明 |
|---|---|
| 攻击向量 | 本地(需非特权用户 shell 访问) |
| 利用可靠性 | 100% 确定性,无需竞态条件或内存布局猜测 |
| 利用代码大小 | 仅约 732 字节(Python 脚本) |
| 隐蔽性 | 仅修改内存页缓存,磁盘文件不变,绕过标准完整性检查 |
| 容器影响 | 页缓存在宿主机和所有容器间共享,可实现容器逃逸 |
| 影响范围 | 内核版本 4.14 至 6.19.12 |
发现背景
该漏洞由 Theori 安全研究团队通过其 AI 系统 Xint Code 发现。据 Theori 披露,仅用一个提示词、约 1 小时的扫描时间就在 Linux crypto 子系统中定位到了此漏洞。Theori 是 DEF CON CTF 九届冠军团队,也是 DARPA AI Cyber Challenge 决赛入围者。
修复方案
Linux 内核社区的修复方案为:crypto: algif_aead - Revert to operating out-of-place,即回退原地操作优化,改为直接复制关联数据(AD)
缓解措施(补丁发布前)
方案 A:模块黑名单(适用于 Ubuntu/Debian,模块为 =m 编译)
echo "install algif_aead /bin/true" > /etc/modprobe.d/cve-2026-31431.conf
rmmod algif_aead
方案 B:启动参数禁用(适用于 RHEL/AlmaLinux/CloudLinux,模块为 =y 编译)
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
补丁状态
- CISA 已将其加入 Known Exploited Vulnerabilities (KEV) 目录
- Microsoft Defender 已发布检测规则(Exploit:Linux/CopyFailExpDl.A 等)
- 各发行版已发布补丁内核包,需更新后重启生效。
测试与争议
有安全研究人员在 OpenShift 4.20.16(RHEL 9.6 内核)上进行了详细测试,确认页缓存篡改确实成功,但在其测试环境中未能实现实际的权限提升或容器逃逸,restricted-v2 SCC 策略有效限制了影响范围。
升级内核
# 1. 更新软件包索引
sudo apt update
# 2. 升级内核(只升级内核相关包,避免影响其他业务)
sudo apt install linux-image-amd64 linux-headers-amd64
# 3. 确认新内核已安装
dpkg -l | grep linux-image
# 4. 更新 initramfs 和 GRUB
sudo update-initramfs -u -k all
sudo update-grub
# 5. 重启生效
sudo reboot
##重启后验证
# 查看新内核版本
uname -r
# 预期输出:6.1.0-XX-amd64(其中 XX >= 159)
# 确认 algif_aead 状态(修复后仍可加载,但漏洞已修补)
lsmod | grep algif_aead
# 验证漏洞是否修复(运行POC测试,应失败)
# 或检查内核 changelog 中是否包含 a664bf3d603d 补丁
zcat /usr/share/doc/linux-image-$(uname -r)/changelog.Debian.gz | head -50
标准更新(推荐)
通过APT获取官方最新内核补丁(安全更新):
# 1. 更新软件包索引
sudo apt update
# 2. 查看可用的内核更新
apt list --upgradable | grep linux-image
# 3. 升级内核及相关包(推荐)
sudo apt full-upgrade
# 或仅升级内核
sudo apt install linux-image-amd64 linux-headers-amd64
# 4. 重启生效
sudo reboot
# 5. 验证新版本
uname -r
full-upgrade 会处理依赖关系,比 upgrade 更彻底,适合内核这类关键包。
升级到更新的内核版本(如6.6 LTS)
Debian 12 官方仓库提供 linux-image-6.1(默认)和可选的 linux-image-6.6(backports):
# 启用 backports 源(如未启用)
echo 'deb http://deb.debian.org/debian bookworm-backports main' | \
sudo tee /etc/apt/sources.list.d/backports.list
sudo apt update
# 从 backports 安装 6.6 内核
sudo apt install -t bookworm-backports linux-image-amd64 linux-headers-amd64
# 重启
sudo reboot
安装特定版本内核(精确控制)
# 查看仓库中所有可用内核版本
apt-cache search linux-image | grep -E '^linux-image-[0-9]'
# 安装指定版本(示例:6.1.140)
sudo apt install linux-image-6.1.0-37-amd64 linux-headers-6.1.0-37-amd64
# 或安装更新的 6.1 系列
sudo apt install linux-image-6.1.0-38-amd64
清理旧内核(释放空间)
# 查看已安装的所有内核
dpkg -l | grep linux-image
# 自动移除不再需要的旧内核
sudo apt autoremove --purge
dpkg -l | grep linux-image
ii linux-image-6.1.0-37-amd64 6.1.140-1 amd64 Linux 6.1 for 64-bit PCs (signed)
ii linux-image-6.1.0-42-amd64 6.1.159-1 amd64 Linux 6.1 for 64-bit PCs (signed)
ii linux-image-amd64 6.1.159-1 amd64 Linux for 64-bit PCs (meta-package)
# 或手动移除指定旧内核(保留当前和上一个作为备用)
sudo apt remove --purge linux-image-6.1.0-XX-amd64
sudo apt remove --purge linux-image-6.1.0-37-amd64
GRUB 引导配置(多内核管理)
# 查看当前默认启动项
sudo grub-editenv list
# 查看所有可用内核启动项
grep menuentry /boot/grub/grub.cfg
# 设置默认启动内核(如需回退)
sudo grub-set-default "Advanced options for Debian GNU/Linux>Debian GNU/Linux, with Linux 6.1.0-37-amd64"
sudo update-grub
针对 CVE-2026-31431 (Copy Fail) 的特别建议
内核 6.1.0-37 属于受影响范围(4.14 - 6.19.12),建议:
# 1. 先检查当前系统是否加载了 algif_aead
lsmod | grep algif_aead
# 2. 立即应用临时缓解(如无法立即重启)
sudo modprobe -r algif_aead
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
# 3. 更新内核到已修复版本
sudo apt update
sudo apt full-upgrade
# 4. 重启后验证
sudo reboot
uname -r # 确认版本 >= 6.1.140-2 或包含补丁的版本本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝