Boos4721/copyfail-rs
GitHub: Boos4721/copyfail-rs
CVE-2026-31431(Copy Fail)的 Rust 利用实现,通过 Linux 内核 AF_ALG splice 页缓存写入漏洞,允许非特权用户篡改页缓存实现本地提权。
Stars: 3 | Forks: 0
# copyfail-rs
CVE-2026-31431 (Copy Fail) 的 Rust 实现 —— 一种通过 AF_ALG splice 实现的 Linux 内核页缓存写入漏洞。
[中文文档 / Chinese README](README_CN.md)
## CVE-2026-31431
Linux 内核的 `algif_aead` 实现允许非特权用户通过 `splice()` 系统调用将任意数据写入任何可读文件的页缓存中。`authencesn` AEAD 算法将 `seqno_lo`(用户控制的 AAD 字节 4-7)写入目标散列表中偏移量为 `assoclen + cryptlen` 的位置,当通过 `splice()` 链接到页缓存页面时,这将导致任意 4 字节写入。磁盘上的内容保持不变,但所有后续读取操作都会看到被破坏的页缓存数据。
**受影响的内核:** Linux < 6.12.23, < 6.13.11, < 6.14.2
## 功能
| 标志 | 描述 |
|---|---|
| `--check` | 安全预检:检查解析的 `su` 目标并退出 |
| `--escalate` | 在页缓存中修补 `/etc/passwd` 以移除 root 密码,然后执行 `su root` |
| `--set-password` | 先提权,然后从 stdin 读取新的 root 密码并通过 `chpasswd` 应用 |
| `--uid` | 在 `/etc/passwd` 中将当前用户的 UID 翻转为 0,然后执行 `su ` |
| `--backup ` | 在覆盖前备份 `su` 二进制文件 |
| `--exec ` | 覆盖后以 root 身份运行特定命令 |
### 提权模式
**1. `--uid`** — 通过页缓存写入,将 `/etc/passwd` 中当前用户的 UID 字段翻转为 `0000`。修补后,使用您自己的密码执行 `su ` 即可获取 root shell。该工具会在身份验证之后、启动 shell 之前尝试清除页缓存,从而降低 SSH 持续将该账户视为 UID 0 的可能性。无需修改 root 密码。适用于任何 4 位数的 UID (1000-9999)。
**2. `--escalate`** — 通过页缓存写入修补 `/etc/passwd` 中的 root 行:`root:x:0:0:root:...` → `root::0:0:root :...`。注释字段会用空格填充以保持行长度不变。修补后,无需密码即可执行 `su root`。
**3. `--set-password`** — 首先提权(移除 root 密码),然后从 stdin 读取新密码并使用 `chpasswd` 应用。
**4. 默认模式 (无标志)** — 使用特定架构的 shellcode payload (x86_64, x86, aarch64) 覆盖 `su` 二进制文件的页缓存,然后执行 `su` 以获取 root shell。
## 构建
```
cargo build
cargo build --release
cargo test
cargo clippy
```
## 用法
```
./copyfail-rs --check
./copyfail-rs --uid
./copyfail-rs --escalate
printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
./copyfail-rs --backup /tmp/su.bak
./copyfail-rs --exec /bin/bash
```
## 恢复
页缓存的修改是易失性的 —— 清除缓存即可恢复磁盘上的原始内容:
```
echo 3 > /proc/sys/vm/drop_caches
```
## 验证环境
| 操作系统 | 内核 | 结果 |
|---|---|---|
| Ubuntu 22.04.2 LTS | 6.8.0-87-generic | `--escalate` 通过, `--set-password` 通过, `--uid` 通过 |
| Ubuntu 22.04.2 LTS | 6.8.0-107-generic | `--escalate` 通过, `--uid` 通过 |
| Ubuntu 25.10 | 6.17.0-5-generic | splice EINVAL, 内核已修补 |
| Ubuntu 25.10 | 6.17.0-8-generic | `--uid` 通过 |
| Alpine Linux edge | 6.19.12 | 漏洞利用程序已运行,页缓存写入被内核修复阻止 |
## 文档
- [快速入门](docs/quick-start.md)
- [漏洞原理](docs/principle.md)
- [演示](docs/demo.md)
- [防御与缓解](docs/mitigation.md)
## 许可证
本项目仅用于授权的安全测试和教育目的。
标签:0day挖掘, AF_ALG, algif_aead, CSV导出, CVE, CVE-2026-31431, etc-passwd, Exploit, Hakrawler, Linux内核漏洞, PoC, Root提权, Rust, splice系统调用, Web报告查看器, Write Primitive, 内存损坏, 内核安全, 协议分析, 可视化界面, 数字签名, 暴力破解, 本地提权, 权限提升, 缓冲区溢出, 网络流量审计, 通知系统, 页缓存任意写