Maxime288/CVE-2026-31431-Copy-Fail-R-pertoire-de-Pr-vention
GitHub: Maxime288/CVE-2026-31431-Copy-Fail-R-pertoire-de-Pr-vention
这是一个针对Linux内核CVE-2026-31431漏洞的PoC仓库,用于演示基于页面缓存的本地提权攻击。
Stars: 0 | Forks: 0
# 🔴 CVE-2026-31431 — 复制失败:防范目录
## 📋 目录
1. [概述](#vue-densemble)
2. [漏洞机制](#mécanisme-de-la-faille)
3. [受影响系统](#systèmes-affectés)
4. [演示 (测试环境)](#démonstration-environnement-de-test)
5. [入侵指标](#indicateurs-de-compromission)
6. [修复与补丁](#remédiation-et-correctifs)
7. [临时缓解措施](#atténuation-temporaire)
8. [参考资料](#références)
## 概述
**CVE-2026-31431**,绰号 *Copy Fail*,是 Linux 内核加密子系统中的一个逻辑漏洞。它允许 **任何非特权用户** 通过向某个 setuid 可执行文件的 **页面缓存** 中 **受控写入 4 字节** 来获取 `root` 权限。
### 为什么它很关键
| 特性 | 细节 |
|---|---|
| **利用代码** | 732 字节的 Python 代码,仅需标准库 |
| **条件** | 无竞态条件,无需精确时序控制 |
| **检测性** | ⚠️ 对磁盘完整性检查工具不可见 |
| **影响** | 本地 root 权限 + 容器逃逸 (Kubernetes) |
| **可移植性** | 同一个脚本适用于所有测试的发行版 |
## 漏洞机制
该漏洞源于内核在十年间 **三个独立修改** 的交叉点:
```
2011 → authencesn ajouté au kernel (support IPsec ESN)
2015 → AF_ALG acquiert le support AEAD + splice()
2017 → Optimisation "in-place" dans algif_aead.c ← ROOT CAUSE
```
### 1. 涉及的组件
**`AF_ALG`** — 将加密子系统暴露给用户空间(无需特权)的套接字。
**`splice()`** — 在文件描述符之间 *无需复制* 传输数据,通过直接引用页面缓存中的页面。
**`authencesn`** — 用于 IPsec ESN(扩展序列号)的 AEAD 模板。使用目标缓冲区作为临时工作区来重新排列 ESN 字节。
### 2. 漏洞点
在 2017 年的“就地”优化中,内核开始通过 `sg_chain()` 将页面缓存中的页面直接链接到 *目标* scatterlist:
```
Input SGL: AAD || Ciphertext || Tag (page cache pages)
↑
Output SGL: AAD || Ciphertext --------+ (chaîné par référence)
↑ ↑
Buffer RX Buffer RX (mémoire utilisateur)
```
随后 `authencesn` 在偏移 `assoclen + cryptlen` 处写入 **`seqno_lo` 的 4 字节** —— 即直接写入目标文件的页面缓存页面中。
### 3. 攻击者控制的原语
| 原语 | 控制 |
|---|---|
| **哪个文件** | 当前用户可读的任何文件 |
| **哪个偏移量** | 由 `assoclen`、splice 的偏移和长度决定 |
| **什么值** | AAD(附加认证数据)的第 4–7 字节(`seqno_lo` 字段) |
### 4. 对隐蔽性的影响
内核 **永远不会** 将被破坏的页面标记为“脏”(dirty)以进行回写。磁盘上的文件保持完整。只有页面缓存(在 `execve()` 时实际读取的内容)被破坏。
```
Fichier disque : [intact] ← sha256sum, tripwire, AIDE → ✅ pas d'alerte
Page cache : [corrompu] ← execve() lit ici → ⚠️ shellcode exécuté
```
## 受影响系统
### 已测试的发行版
| 发行版 | 内核版本 | 状态 |
|---|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ✅ 易受攻击(已测试) |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ✅ 易受攻击(已测试) |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ✅ 易受攻击(已测试) |
| SUSE 16 | 6.12.0-160000.9-default | ✅ 易受攻击(已测试) |
### 漏洞窗口期
任何包含提交 `72548b093ee3`(2017 年)直到补丁 `a664bf3d603d`(2026-04-01)的内核都可能存在漏洞 —— 时间跨度 **近十年**。
## 演示 (测试环境)
### 前置条件
```
# Ubuntu Server — 验证内核版本
uname -r
# 检查 algif_aead 模块是否存在
lsmod | grep algif_aead
# 需要 Python 3.10+(用于 os.splice)
python3 --version
```
### 克隆 PoC
```
git clone https://github.com/theori-io/copy-fail-CVE-2026-31431.git
cd copy-fail-CVE-2026-31431
```
### 启动测试
```
# 作为非特权用户
id # → uid=1001(user) gid=1001(user)
python3 copy_fail_exp.py
# 易受攻击内核上的预期结果:
# uid=0(root) gid=0(root) groups=0(root)
```
### 预期观察结果
1. 脚本在 `authencesn(hmac(sha256),cbc(aes))` 上创建一个 `AF_ALG` 套接字
2. 它将 `/usr/bin/su` splice 到一个管道,然后进入套接字
3. 每次 `recv()` 调用都会向 `su` 的页面缓存写入 4 字节的 shellcode
4. `execve("/usr/bin/su")` 加载被破坏的版本 → root shell
### 漏洞利用后验证
```
# 磁盘文件完整无缺
sha256sum /usr/bin/su # même hash qu'avant
# 但页面缓存已损坏
# (通过清除缓存并观察行为可见)
echo 3 > /proc/sys/vm/drop_caches
# 此操作后,/usr/bin/su 恢复正常
```
## 入侵指标
鉴于该利用的隐蔽性(无磁盘修改),检测很困难。以下是需要注意的信号:
### 需要监控的系统日志
```
# 可疑系统调用:AF_ALG + splice 组合使用
# 在 auditd 中监控:
auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k af_alg_socket
auditctl -a always,exit -F arch=b64 -S splice -k splice_call
# 意外的权限提升
grep "uid=0" /var/log/auth.log | grep -v "sudo\|su\|login"
```
### 行为检测
```
# 来自 su 的 UID 为 0 的意外子进程
ps aux | awk '$1 == "root" && $11 !~ /^(sshd|systemd|cron)/'
# 来自意外 root 进程的网络连接
ss -tlnp | grep LISTEN
```
### 内存检测工具
```
# 比较磁盘文件与内存中的哈希值
# (通过 /proc/PID/maps 手动方法)
# 现代 EDR 可检测页面缓存/磁盘不一致
```
## 修复与补丁
### ✅ 最终解决方案:更新内核
官方补丁 (`a664bf3d603d`) 将操作改为 `algif_aead.c` 中的 **非就地** 操作,分离了源和目标 scatterlist。
```
# Ubuntu / Debian
sudo apt update && sudo apt upgrade linux-image-$(uname -r)
sudo reboot
# RHEL / CentOS Stream
sudo dnf update kernel
sudo reboot
# Amazon Linux 2023
sudo dnf update kernel
sudo reboot
# SUSE
sudo zypper update kernel-default
sudo reboot
```
### 验证补丁是否已应用
```
# 重启后验证内核版本
uname -r
# 已修补内核上的 algif_aead 模块将拒绝原地操作
```
## 临时缓解措施
如果无法立即更新内核:
### 选项 1:禁用 `algif_aead` 模块
```
# 永久黑名单
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
# 立即卸载(如果已加载)
sudo rmmod algif_aead 2>/dev/null
# 验证
lsmod | grep algif_aead # → rien
```
### 选项 2:通过 seccomp 进行限制
对于容器化环境,通过 seccomp 策略限制创建 `AF_ALG` 套接字(地址族 38)。
```
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{ "index": 0, "value": 38, "op": "SCMP_CMP_EQ" }
]
}
]
}
```
### 选项 3:加强监控(非预防性)
```
# 在敏感系统调用上启用 auditd
sudo systemctl enable auditd
sudo auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k copy_fail_watch
```
## 参考资料
| 资源 | 链接 |
|---|---|
| 官方 PoC | [theori-io/copy-fail-CVE-2026-31431](https://github.com/theori-io/copy-fail-CVE-2026-31431) |
| 完整技术分析文章 | [xint.io/blog/copy-fail-linux-distributions](https://xint.io/blog/copy-fail-linux-distributions) |
| 内核补丁 (提交) | [a664bf3d603d](https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5) |
| 原始漏洞提交 | [72548b093ee3](https://github.com/torvalds/linux/commit/72548b093ee3) (2017) |
| NVD | [nvd.nist.gov/vuln/detail/CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) |
### 协调披露时间线
| 日期 | 事件 |
|---|---|
| 2026-03-23 | 向 Linux 内核安全团队报告 |
| 2026-03-24 | 收到确认 |
| 2026-03-25 | 补丁审查 |
| 2026-04-01 | 补丁并入内核主线 |
| 2026-04-22 | 分配 CVE-2026-31431 |
| 2026-04-29 | 公开披露 |
## ⚖️ 法律声明
本代码库 **仅用于教育目的和防御性安全研究**。
在未经明确授权的系统上利用此漏洞是 **非法的**(《法国刑法典》第 323-1 条及后续条款;美国的《计算机欺诈和滥用法案》)。
**仅**在您自己的系统或经授权的渗透测试框架内进行测试。
*由 [@Maxime288](https://github.com/Maxime288) 维护*
标签:0day挖掘, AF_ALG, authencesn, Chrome Headless, Copy Fail, crypto子系统, CVE-2026-31431, Kubernetes安全, Linux内核漏洞, root权限, setuid漏洞, splice, Web截图, Web报告查看器, 内核安全, 威胁模拟, 安全渗透, 安全补丁, 容器安全, 容器逃逸, 密码学漏洞, 权限提升漏洞, 逆向工具, 页面缓存攻击