【CVE-2026-43503】DirtyClone本地用户通过克隆数据包获得Root权限

admin 2026-06-30 08:06:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档披露了Linux内核CVE-2026-43503漏洞(DirtyClone),这是一个高严重性本地提权漏洞,允许攻击者通过IPsec子系统的数据包克隆路径修改页缓存内存,从而获得root权限。影响启用非特权用户命名空间的Debian、Ubuntu等发行版,需更新至v7.1-rc5内核或禁用相关模块缓解。 综合评分: 85 文章分类: 漏洞分析,应急响应,解决方案,漏洞预警,Linux安全


cover_image

【CVE-2026-43503】DirtyClone 本地用户通过克隆数据包获得 Root 权限

原创

骨哥说事 骨哥说事

骨哥说事

2026年6月29日 09:09 上海

在小说阅读器读本章

去阅读

| | | — | | 声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |

#

#

防走失:https://gugesay.com/

不想错过任何消息?设置星标↓ ↓ ↓

#

JFrog 安全研究团队在审计近期 Linux 内核补丁时发现,尽管针对 DirtyFrag 漏洞家族的修复措施已经部署,但仍有一个衍生问题未被解决。这个漏洞使得同一种攻击手法,能够通过 XFRM/IPsec 子系统中的不同数据包处理路径持续存在。

我们在5月19日将此问题报告给 Linux 内核维护者。恰巧,原始 DirtyFrag 的研究者 “Hyunwoo Kim” 在5月16日也提交了一份相关的 更广泛的报告。该漏洞变种已于5月21日(v7.1-rc5 版本,提交记录 9e171fc1d7d7)被打上补丁并合并到主线内核,并被分配了 CVE-2026-43503。

在撰写本文时,尚未有关于此漏洞的公开概念验证 (PoC)。JFrog 研究人员已成功为 CVE-2026-43503 新发现的 DirtyFrag 变种开发出提权利用程序,我们将其命名为 “DirtyClone”。我们发布这项研究,是因为它展示了一种影响多个 skb(套接字缓冲区)处理路径的、更广泛的利用模式,表明其底层的攻击原语并非仅限于单个有漏洞的代码路径。

影响

CVE-2026-43503 是一个高严重性(CVSS 评分 8.8)的本地权限提升 (LPE) 漏洞。 此问题的严重性在于,它允许任何未经授权的本地用户通过操纵 Linux 页缓存来获取 root 访问权限。该攻击是静默的,不会留下内核日志或审计痕迹,并能绕过常见的磁盘完整性监控工具。

受影响系统与范围

此漏洞影响了众多的现代 Linux 发行版,前提是它们运行着受影响的特定内核版本和配置。

  • 受影响的发行版: 已确认攻击在启用了非特权用户命名空间的流行发行版上有效,包括Debian、Ubuntu 和 Fedora
  • 受影响的内核: 任何缺乏完整的 DirtyFrag 漏洞家族修复链的内核都存在风险。那些完全没有修复原始漏洞(CVE-2026-43284 和 CVE-2026-43500)的系统将广泛暴露于攻击之下。此外,任何应用了初始缓解措施但缺少后续补丁(CVE-2026-46300 和 CVE-2026-43503)的主线、稳定版或长期支持 (LTS) 内核分支,仍然对特定的绕过方式脆弱。只有当应用了完整的补丁系列后,系统才能完全防御这种利用模式。
  • 可被利用的用户: 运行脆弱内核的服务器或设备上的任何本地用户,只要持有或能够获取 CAP_NET_ADMIN 权限(通常可通过非特权用户命名空间获得),都可能被攻击。这对启用了用户命名空间或部署了特权容器的多租户云环境、Kubernetes 集群和容器化工作负载构成了最高风险。

安全防护(缓解措施)

该问题已于2026年5月21日被打上补丁并合并到主线内核。

  • 即时建议: 用户应立即将其 Linux 内核更新至已修复的版本 v7.1-rc5,或者为其发行版的内核应用针对 CVE-2026-43503 的向后移植补丁。
  • 变通方法: 如果无法立即打补丁,变通方法包括:通过设置 kernel.unprivileged_userns_clone=0 来阻止 CAP_NET_ADMIN 权限的获取,或者将 esp4、esp6 和 rxrpc 内核模块列入黑名单以阻止就地解密原语。
  • 这对 JFrog 客户意味着什么: 由于此漏洞针对的是主机内核,它强调了采取强有力安全态势的必要性。JFrog Artifactory 和 Xray 在此防御中至关重要;请确保所有二进制文件和包都通过安全的、经过管理的注册中心(如 Artifactory、Repo21)获取,并定期由 Xray 扫描,以便在恶意或未经批准的包到达您的机器之前将其阻止,从而降低可能促成此类内核 LPE 的潜在供应链风险。

时间线

  • 5月4日: DirtyFrag 补丁(针对 CVE-2026-43284 和 CVE-2026-43500)登陆 Linux 内核主线。它修复了 spliced UDP 数据包缺失 SKBFL_SHARED_FRAG 标志的缺陷,确保执行就地解密的子系统触发安全的写时复制。
  • 5月13日: Fragnesia (CVE-2026-46300) 被披露;补丁登陆 Linux 内核 netdev。标志在skb合并 (skb_try_coalesce) 过程中丢失,绕过了缓解措施。
  • 5月16日: 上游多站点补丁提交,覆盖了剩余的碎片传输辅助函数(__pskb_copy_fcloneskb_shiftskb_segmentskb_gro_receiveskb_gro_receive_listtcp_clone_payload)。
  • 5月19日: JFrog 独立地在 __pskb_copy_fclone 变种中重新发现此问题,构建了 PoC,并报告了它。
  • 5月21日: 补丁合并到主线(提交记录 48f6a5356a33)。
  • 5月23日: CVE-2026-43503 发布。
  • 5月24日: Linux v7.1-rc5 发布,这是第一个修复的标签版本。

DirtyFrag 漏洞家族

DirtyFrag 是 Linux 内核核心网络栈中的一个内存破坏漏洞家族,影响套接字缓冲区(skb)引用共享页缓存内存的方式,这些漏洞随后通过诸如 XFRM/IPsec 或 RxRPC 等子系统中的就地加密转换被武器化。

尽管 DirtyFrag、Fragnesia 和 DirtyClone 等变种针对不同的数据包克隆或转发路径,但它们都依赖于一项共享的技术:诱使内核将只读的、文件支持的页缓存内存当作可写的网络缓冲区。

在高层次上,内核在现代设计中并未严格区分三种可以相互重叠的内存角色:

  1. 文件支持的内存(用于可执行文件和文件的页缓存)
  2. 网络缓冲区(通过零拷贝路径处理的数据包数据)
  3. 就地转换(例如,加密/解密并写回到同一缓冲区)

当这三种上下文相交时,内核可能会修改在语义上仍然与文件相关联的内存,从而导致文件支持的数据在原地被破坏。

高层次利用模型

此攻击滥用了同一物理内存页同时被用作以下两种用途的情况:

  • 文件数据(页缓存)
  • 网络数据包数据(skb)

通常,这两者是分开的:

  • 文件 → 页缓存页
  • 网络 → skb 缓冲区

DirtyFrag 将它们连接了起来。

为了利用这种重叠,攻击者遵循以下步骤:

第 1 步:选择目标页

攻击者映射一个特权二进制文件,例如 /usr/bin/su,导致该文件被加载到页缓存中。

/usr/bin/su
↓
页缓存页(RAM)

此页成为操作的目标。

第 2 步:使数据包引用页缓存

攻击者制作一个 IPsec 数据包,其有效载荷由相同的页缓存页支持。

利用 vmsplice 和 splice,内核将页缓存支持的内存附加到 skb 中,而不是复制它。

int fd = open("/usr/bin/su", O_RDONLY);
char *p = mmap(NULL, mmap_size, PROT_READ, MAP_SHARED, fd, 0);

struct iovec iov = { .iov_base = p + patch_offset, .iov_len = 16 };
vmsplice(pipefd[1], &iov, 1, 0);
splice(pipefd[0], NULL, sockfd, NULL, 16, 0);

此时,数据包缓冲区在字面意义上是由文件内存支持的。

第 3 步:强制本地 IPsec 处理

攻击者使用基于环回地址的 IPsec 隧道,确保数据包保持在本地。

这保证了:

  1. 数据包由攻击者创建
  2. 同一个内核处理该数据包
  3. 数据包通过 IPsec 接收路径

当被处理时,数据包到达 ESP 解密阶段 (esp_input())。

第 4 步:就地解密成为一种写入原语

为了性能,IPsec 就地解密数据包有效载荷。

这意味着:

  • 输入缓冲区 == 输出缓冲区
  • 解密后的字节覆盖同一块内存

正常情况下是安全的,但此处的缓冲区由页缓存页支持。 如果 skb 数据驻留在一个源自文件映射的、由页支持的缓冲区中,就地解密就可以修改该共享页的内容。

IPsec 解密
   ↓
写回到 skb 缓冲区
   ↓
同一物理页,即 /usr/bin/su 所在页

第 5 步:受控地覆写文件支持的内存

攻击者控制加密的输入参数(密钥、初始向量 IV 和数据包布局)。在 AES-CBC 中,IV 会影响第一个解密的块。

通过组合:

  • 已知的原始字节
  • 选定的密文结构
  • 受控的 IV

攻击者可以在特定偏移量处强制输出可预测的字节,在受限条件下,这可以影响共享的、由页支持的缓冲区中的解密结果字节。

第 6 步:修改内存中的二进制文件

攻击者利用此原语来修补 /usr/bin/su 内部的小段指令序列。

只需要修改几个字节(例如,控制身份验证的条件分支逻辑)。磁盘上的文件并未改变,但页缓存的副本被修改了。

原始的 su 页
   ↓
IPsec 写入原语
   ↓
修改后的 su 页 (RAM)

第 7 步:执行修改后的二进制文件

当 /usr/bin/su 再次被执行时:

  1. Linux 复用缓存的页
  2. 修改后的指令被直接使用
  3. 身份验证逻辑被绕过

结果:权限提升。

修改后的页缓存
   ↓
su 被执行
   ↓
修改后的逻辑运行
   ↓
获得 root 权限

修复措施

原始的 DirtyFrag 修复为 spliced UDP 数据包设置了 SKBFL_SHARED_FRAG 标志。这是一个元数据标志,用于标记那些引用了共享页缓存内存的 skb 数据包,确保执行就地解密的子系统会触发安全的写时复制。

如果设置了此标志,IPsec 会在解密前强制进行复制。

检测到共享页
   ↓
SKBFL_SHARED_FRAG = 1
   ↓
复制 skb
   ↓
安全解密

这防止了直接修改文件支持的页。

Fragnesia 和 CVE-2026-43503 的修复确保 SKBFL_SHARED_FRAG 标志在函数间正确传递,并且不会在过程中被意外“丢弃”。

利用 DirtyClone

为了配置所需的网络和 IPsec 环境,需要 CAP_NET_ADMIN 权限,因为它允许控制网络接口、路由和 XFRM/IPsec 策略。

攻击者首先创建一个新的网络命名空间:

unshare -Urn

这将在命名空间内提供网络管理权限。虽然权限是命名空间化的,但页缓存在主机级别是共享的,因此,如果通过共享映射修改了文件支持的页,其影响可能会传播到使用这些页的其他进程。

第 1 步:初始化本地 IPsec 处理环境

攻击者配置一个基于环回的 IPsec 隧道,以便数据包由同一个内核实例在本地处理。

ip link set lo up
ip addr add 10.99.0.2/24 dev lo

然后创建一个 IPsec (XFRM) 状态(创建 IPsec 接口):

ip xfrm state add \
src 127.0.0.1 dst 127.0.0.1 \
proto esp spi 0x12345678 reqid 1 mode transport \
enc 'cbc(aes)' ... \
auth 'hmac(sha1)' ...

一条匹配的策略将强制出站流量通过 IPsec:

ip xfrm policy add \
src 127.0.0.1 dst 127.0.0.1 dir out \
tmpl src 127.0.0.1 dst 127.0.0.1 proto esp reqid 1 mode transport

最后,添加一个 netfilter 规则(强制我们的数据包通过有漏洞的 fclone 路径):

iptables -t mangle -A OUTPUT -p udp --dport 4500 \
-j TEE --gateway 10.99.0.2

关键点

TEE 目标是至关重要的: 它会在内核内部复制出站数据包。在内部,这会触发 nf_dup_ipv4,从而通过 __pskb_copy_fclone() 导致 skb 克隆。

第 2 步:理解有漏洞的克隆行为

当发送一个 UDP 数据包(类似于“高层次利用模型 – 第2步”中描述的)时:

  1. 原始 skb 被创建。
  2. TEE 规则复制了它。
  3. 内核调用 __pskb_copy_fclone() 来创建一个克隆的 skb。

此时,存在两个 skb 对象:

  • 原始 skb → 遵循正常路径
  • 克隆 skb → 进入有漏洞的转换路径

在克隆过程中,克隆的 skb 未能正确保留 SKBFL_SHARED_FRAG 标志。

这个标志是内核的安全标记,表明该 skb 引用了共享的(可能是文件支持的)页内存。因此:

  • 原始 skb = 安全 – 元数据完好
  • 克隆 skb = 不安全 – 元数据缺失

这种差异正是 DirtyClone 绕过的根源。

第 3 步:构建 IPsec 路由路径

两个 skb 实例都通过本地基于环回的 IPsec 配置进行路由。

这确保了:

  • 数据包保持在本地
  • 数据包由同一内核实例处理
  • 克隆 skb 到达 IPsec 接收路径

最终,克隆 skb 到达:

esp_input()

此时,skb 有效载荷已不是普通的网络内存。相反,它引用的是源自文件映射(例如 /usr/bin/su)的、由页缓存支持的内存。

因此内存布局是:

文件支持的页(页缓存)
    ├─ /usr/bin/su 的内容
    └─ skb 有效载荷引用

重要的是,skb 并没有复制数据;它引用的是相同的物理页。这种共享引用使得页缓存写入原语能够在所有 DirtyFrag 变种中被重复利用。

第 4 步:IPsec 就地解密路径

当克隆 skb 到达 esp_input() 时,IPsec 对数据包有效载荷进行解密。

出于性能考虑,这是就地完成的:

  • 输入缓冲区 == 输出缓冲区
  • 解密后的字节覆盖掉现有的 skb 内存。

概念上:

加密的 skb 有效载荷
        ↓
IPsec 解密(就地)
        ↓
将输出写入同一缓冲区

由于克隆 skb 引用了页缓存内存,内核将解密后的数据直接写入到一个文件支持的页中。

第 5 步:通过加密参数进行受控写入

攻击者得到的并不是任意的写入能力。

他们控制:

  • AES-CBC 密钥材料(通过 SA 配置)
  • 每个数据包的 IV
  • 数据包布局和偏移量

在 AES-CBC 中:

  • 每个解密块都依赖于 IV
  • 攻击者可以计算一个 IV,使得输出变得可预测

因此,通过结合已知的原始字节、期望的目标字节和受控的 IV,攻击者将解密操作转变为对页缓存内存的受控写入原语。

发送的数据包看起来像这样:

第 6 步:修改内存中的 /usr/bin/su

利用此原语,攻击者修补 /usr/bin/su 内部选定的指令字节。

典型的修补目标包括身份验证检查和条件分支指令。仅需进行小的、局部的修改。结果是磁盘文件保持不变,而页缓存中包含修改后的可执行代码。

原始的 su 页
      ↓
受控的 IPsec 写入
      ↓
RAM 中被修改的 su 页

第 7 步:执行修改后的二进制文件

当 /usr/bin/su 被执行时,Linux 从页缓存加载二进制文件。如果修改后的页仍然在缓存中:

  • 无需从磁盘重新加载
  • 修改后的指令被直接执行

执行流程:

修改后的页缓存
      ↓
su 被执行
      ↓
修改后的逻辑运行
      ↓
权限提升
  • END –

感谢阅读,如果觉得还不错的话,动动手指给个三连吧~


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:骨哥说事 骨哥说事 骨哥说事《【CVE-2026-43503】DirtyClone 本地用户通过克隆数据包获得 Root 权限》

评论:0   参与:  0