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, 内存损坏, 内核安全, 协议分析, 可视化界面, 数字签名, 暴力破解, 本地提权, 权限提升, 缓冲区溢出, 网络流量审计, 通知系统, 页缓存任意写