近日,一个名为“Dirty Frag”的Linux内核本地提权漏洞细节被公开。该漏洞目前尚无CVE编号,属于未修补状态,能够将两个独立的页缓存写入漏洞进行链式利用,进而在几乎所有主流Linux发行版上获得root权限。由于第三方在2026年5月7日提前打破信息禁运,漏洞的完整利用程序已流传到野外。
安全研究员Hyunwoo Kim(@v4bel)发现并报告了该漏洞。Dirty Frag被视为Dirty Pipe和近期刚被披露的Copy Fail(CVE-2026-31431,CVSS评分7.8)漏洞的同类后继。Kim在技术报告中指出:“Dirty Frag是一种漏洞类别,通过链接xfrm-ESP页缓存写入漏洞和RxRPC页缓存写入漏洞,在大多数Linux发行版上实现root权限。它扩展了Dirty Pipe和Copy Fail所属的缺陷类别。由于这是一个确定性的逻辑缺陷,不依赖时间窗口,因此无需竞态条件,利用失败时内核不会崩溃,且成功率极高。”
漏洞技术原理Dirty Frag利用了内核零拷贝发送路径中的缺陷。当通过splice()系统调用将一个只读页缓存页面的引用植入发送端套接字缓冲区(struct sk_buff)的frag槽位后,接收端的内核代码会对这些攻击者植入的片段直接执行原地加密操作,从而永久性地修改内存中的页缓存。此后,即便非特权攻击者仅拥有只读权限,任何对该文件的读取操作都会看到被篡改后的内容。
该攻击链条由两个独立的页缓存写入漏洞组成:
xfrm-ESP页缓存写入:存在于IPsec ESP接收路径esp_input()中。当skb为非分片但缺少片段列表时,代码会跳过skb_cow_data()的强制性缓冲区分配步骤,直接对攻击者植入的片段进行AEAD原地解密。攻击者利用XFRMA_REPLAY_ESN_VAL netlink属性,可以精确控制每次存储操作的位置(文件偏移)和值(4字节)。实际利用中,通过48次4字节写入共192字节,可将/usr/bin/su的页缓存覆写为一个静态的root shell ELF。操作返回认证失败(-EBADMSG)但页缓存写入已永久化。此变种需要创建用户命名空间(unshare(CLONE_NEWUSER))。
RxRPC页缓存写入:存在于rxkad_verify_packet_1()中,对RxRPC有效载荷的前8字节执行单块pcbc(fcrypt)解密。由于skb_to_sgvec()直接将splice钉住的页缓存页转换为散列表,攻击者控制的页面同时成为源和目标。8字节的解密结果由攻击者可自由指定的会话密钥决定,该密钥通过不需要任何特权的add_key("rxrpc", ...)注册。攻击者在用户空间暴力破解该密钥,直到产生期望的明文,例如将/etc/passwd第一行中root的密码字段变为空,从而利用PAM nullok机制绕过认证。
链式利用覆盖所有环境两种变体单独使用时均存在盲区。ESP变体在多数发行版上可用,但创建用户命名空间在某些Ubuntu配置上会被AppArmor策略阻止;RxRPC变体不需要命名空间特权,但rxrpc.ko模块在默认构建中仅Ubuntu等少数发行版加载,而RHEL 10.1等默认并不附带。Kim解释称:“链接两个变体可使盲区相互覆盖。在允许创建用户命名空间的环境中,先运行ESP提权;而在Ubuntu这类阻止用户命名空间但构建了rxrpc.ko的系统上,RxRPC提权便会生效。”利用程序首先尝试ESP路径,若unshare()失败,则自动回退到RxRPC路径攻击/etc/passwd。
广泛影响ESP漏洞的根源可追溯至2017年1月的一个代码提交,而RxRPC漏洞则于2023年6月引入,这意味着此攻击链的有效影响窗口长达约9年。值得注意的是,该2017年1月17日的同一提交也曾是另一个缓冲区溢出漏洞(CVE-2022-27666,CVSS评分7.8)的源头。
已确认受影响的发行版及内核版本包括:
Ubuntu 24.04.4(内核6.17.0-23-generic)
RHEL 10.1(内核6.12.0-124.49.1.el10_1.x86_64)
openSUSE Tumbleweed(内核7.0.2-1-default)
CentOS Stream 10(内核6.12.0-224.el10.x86_64)
AlmaLinux 10(内核6.12.0-124.52.3.el10_1.x86_64)
Fedora 44(内核6.19.14-300.fc44.x86_64)
CloudLinx在其安全公告中指出,该缺陷位于“ESP-in-UDP的MSG_SPLICE_PAGES无COW快速路径中,并可通过XFRM用户态netlink接口访问”。AlmaLinux则说明:“此缺陷存在于esp4、esp6和rxrpc的原地解密快速路径:当套接字缓冲区携带非内核私有的分页片段(如通过splice(2)/sendfile(2)/MSG_SPLICE_PAGES附加的管道页面)时,接收路径会直接在这些外部支持的页面上执行解密,从而暴露或破坏非特权进程仍持有引用的明文。”
此外,Dirty Frag的触发与algif_aead模块是否可用无关。这意味着,即便系统已应用针对Copy Fail的公开缓解措施(将algif_aead加入黑名单),Linux系统仍然对Dirty Frag漏洞敞露无遗。
披露经过与补丁状态Hyunwoo Kim于2026年4月30日将漏洞报告给Linux内核维护者。由于第三方在5月7日提前打破禁运,导致细节与PoC公开。目前,针对ESP变体的修复补丁已于5月7日合并入netdev树,其采用Kuan-Ting Chen提交的共享片段标记方法,利用SKBFL_SHARED_FRAG确保经过splice钉住的页面始终通过skb_cow_data()路径。而添加了|| skb->data_len条件以强制隔离非线性skb的RxRPC补丁尚未被上游合并。截至公开时,两个子漏洞均未分配CVE编号。
立即缓解措施在发行版级补丁可用前,管理员应立即禁用受影响的三个内核模块。请以root权限执行以下命令:
sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"
此举会将esp4、esp6和rxrpc模块列入黑名单并尝试卸载它们。作为权衡,系统上的IPsec VPN隧道和RxRPC功能将因此中断。依赖相关服务的系统在操作前须仔细评估业务影响,并优先计划部署内核补丁。
完整的深度技术报告与PoC利用代码已发布在研究者的GitHub仓库中。