文章总结: 该文档披露了Linux内核CVE-2026-43503漏洞(DirtyClone),这是一个高严重性本地提权漏洞,允许攻击者通过IPsec子系统的数据包克隆路径修改页缓存内存,从而获得root权限。影响启用非特权用户命名空间的Debian、Ubuntu等发行版,需更新至v7.1-rc5内核或禁用相关模块缓解。 综合评分: 85 文章分类: 漏洞分析,应急响应,解决方案,漏洞预警,Linux安全
【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_fclone、skb_shift、skb_segment、skb_gro_receive、skb_gro_receive_list、tcp_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 等变种针对不同的数据包克隆或转发路径,但它们都依赖于一项共享的技术:诱使内核将只读的、文件支持的页缓存内存当作可写的网络缓冲区。
在高层次上,内核在现代设计中并未严格区分三种可以相互重叠的内存角色:
- 文件支持的内存(用于可执行文件和文件的页缓存)
- 网络缓冲区(通过零拷贝路径处理的数据包数据)
- 就地转换(例如,加密/解密并写回到同一缓冲区)
当这三种上下文相交时,内核可能会修改在语义上仍然与文件相关联的内存,从而导致文件支持的数据在原地被破坏。
高层次利用模型
此攻击滥用了同一物理内存页同时被用作以下两种用途的情况:
- 文件数据(页缓存)
- 网络数据包数据(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 隧道,确保数据包保持在本地。
这保证了:
- 数据包由攻击者创建
- 同一个内核处理该数据包
- 数据包通过 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 再次被执行时:
- Linux 复用缓存的页
- 修改后的指令被直接使用
- 身份验证逻辑被绕过
结果:权限提升。
修改后的页缓存
↓
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步”中描述的)时:
- 原始 skb 被创建。
TEE规则复制了它。- 内核调用
__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 权限》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论