Koshmare-Blossom/Copyfail-sh
GitHub: Koshmare-Blossom/Copyfail-sh
CVE-2026-31431 的 Bash 实现,利用 Linux 内核 algif_aead 漏洞实现确定性本地提权。
Stars: 3 | Forks: 1
# copyfail-sh
CVE-2026-31431 (Copy Fail) 的一个 Bash 实现。该脚本在运行时内联编译了一个最小化的 C 辅助程序。Bash 层负责架构检测、payload 解压和目标选择;C 层则负责处理 Bash 自身无法触及的实际内核交互(AF_ALG socket、`splice`、`sendmsg`)。
有关完整的技术分析,请参阅 [copy.fail](https://copy.fail)。
## 工作原理 ( tl;dr )
该漏洞存在于 `algif_aead`(内核的 AF_ALG AEAD socket 接口)中。2017 年的一项就地优化使得页缓存页最终出现在了 `authencesn` 解密操作的可写目标 scatterlist 中。通过 `splice()` 提供正确的输入,你就可以对任何可读文件的页缓存进行确定性的 4 字节写入,包括你不拥有的 setuid 二进制文件。
每次 4 字节地用 shellcode 覆盖 `/usr/bin/su`,然后运行它,即可获得一个 root shell。没有竞争窗口,不依赖特定内核符号,无需重试。
## 用法
```
chmod +x copyfail.sh
# 在执行任何操作前检查系统是否存在漏洞
./copyfail.sh -c
# 运行 exploit(必须以非 root 用户)
./copyfail.sh
# 指定不同的 setuid 目标
./copyfail.sh -t /usr/bin/passwd
# 列出系统上所有的 setuid-root 候选项
./copyfail.sh -s
```
### 获取 shell 后恢复 su
该 exploit 仅覆盖内存中的页缓存,磁盘上的文件保持不变。重启即可恢复一切。如果你想立即清理:
```
# 在你的 root shell 中
/usr/bin/su --version # still works from disk if page cache is evicted
# 或者直接重启
```
如果你使用了 `-t` 指定 `su` 以外的目标,情况同理。仅影响页缓存,磁盘文件无改动。
## 环境要求
- Linux(内核 4.11 到 7.0,见下文)
- `gcc`(用于编译内联 C 辅助程序)
- `python3`(用于解压 shellcode payload,单行命令,无需额外的包)
- 内核模块:`algif_aead`、`authencesn`、`hmac`、`cbc`
如果相应的算法不可用:
```
sudo modprobe algif_aead authencesn hmac cbc
```
某些发行版在 `/etc/modprobe.d/` 中提供了阻断配置作为临时缓解措施。如果存在,请将其移除:
```
sudo rm /etc/modprobe.d/disable-algif{_,-}aead.conf 2>/dev/null
```
## 受影响的内核
```
floor: torvalds/linux 72548b093ee3 August 2017, v4.14
(AF_ALG iov_iter rework that introduced
the file-page write primitive via splice
into the AEAD scatterlist)
ceiling: torvalds/linux a664bf3d603d April 2026, mainline
(reverts the 2017 in-place optimization;
source and destination scatterlists are
now separate, page-cache pages can no
longer end up as writable crypto output)
```
在这两个提交之间:每一个没有回溯移植该修复补丁的主要发行版均受影响。在漏洞披露时,已确认 Ubuntu、RHEL、SUSE、Amazon Linux 和 Debian 均受影响。各发行版的补丁回溯移植大约始于 2026-04-29。要检查特定的内核,请在更新日志中查找 `a664bf3d603d`(或其对应的发行版回溯移植补丁)。
## 支持的架构
| 架构 | 状态 |
|---|---|
| x86_64 | ✓ |
| aarch64 | ✓ |
| i386 / i686 | ✓ |
| armv7l | ✓ |
## 缓解措施
**彻底解决:** 更新你的内核。
**临时变通方案**(阻断 AF_ALG socket;不影响直接使用内核 crypto API 的 IPsec/XFRM):
```
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null
```
**容器环境:** 添加一个阻止创建 `AF_ALG` socket 的 seccomp 配置文件,并在你的 pod 安全上下文中设置 `allowPrivilegeEscalation: false`。这会启用 `no_new_privs`,从而阻止内核在执行 `execve()` 时尊崇 setuid 位。
## 与其他实现的对比
| | Python | Go | **Bash** |
|---|---|---|---|
| 依赖 | python3 | 无 (静态二进制) | gcc + python3 |
| 预编译二进制文件 | 否 | 是 | 否 |
| 单文件 | 是 | 否 | 是 |
| 编译步骤 | 否 | 否 | 是 (运行时自动内联编译) |
Bash 版本在依赖项上不占优势,但它是一个单脚本,你可以在运行前从头到尾完整阅读。C 辅助程序是在运行时通过 heredoc 生成并编译的,无需单独审计额外的二进制文件。
## 参考文献
- [copy.fail](https://copy.fail) - 官方网站与 write-up
- [Xint.io 博客](https://xint.io/blog/copy-fail-linux-distributions) - 技术深入分析
- [内核修复 - a664bf3d603d](https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5)
- [CVE-2026-31431 - NVD](https://nvd.nist.gov/vuln/detail/CVE-2026-31431)
- [oss-security 漏洞披露](https://www.openwall.com/lists/oss-security/2026/04/29/23)
- [badsectorlabs/copyfail-go](https://github.com/badsectorlabs/copyfail-go) - Go 实现(shellcode payload 来源于此)
- [xeloxa/copyfail-exploit](https://github.com/xeloxa/copyfail-exploit) - Python 实现
## 致谢
- **Taeyang Lee & Theori / Xint Code** - 漏洞发现及原始 PoC
## 免责声明
仅供授权的安全测试和研究使用。请勿在你不拥有或未获得明确书面授权的测试系统上运行此程序。
标签:AF_ALG, CVE-2026-31431, Page Cache, setuid, Shellcode, Web报告查看器, 云资产清单, 内核漏洞, 内联C语言, 协议分析, 应用安全, 技术调研, 攻击路径可视化, 本地提权, 权限提升, 漏洞复现, 系统攻击, 网络安全, 逆向工程, 隐私保护, 零日漏洞, 黑客工具