
New DirtyClone Linux Kernel Flaw Lets Local Users Gain Root via Cloned Packets
DirtyClone 是一项新的 Linux kernel privilege escalation 漏洞,属于 DirtyFrag family。它可让本地用户透过 cloned network packet 篡改 file-backed memory 并取得 root。JFrog 在 6 月 25 日公开工作 exploit,受影响系统应尽快更新。
DirtyClone 是 DirtyFrag family 里一个新的 Linux kernel privilege escalation。JFrog Security Research 在 6 月 25 日公开了这个漏洞的 working exploit walkthrough,这是这个变种的第一次公开 demonstration。
它被追踪为 CVE-2026-43503(CVSS 8.8),可让本地用户透过 cloned network packet 篡改 file-backed memory 并取得 root。补丁已在 5 月 21 日进入 mainline;如果你的 kernel 还没有这个补丁,现在就应该更新。
当 kernel 在内部复制一个 network packet 时,两个 helper functions 会丢掉一个 safety flag,这个 flag 用来标记 packet 的 memory 与磁盘上的 file 是 shared 的。这个缺失的 flag 就是整个漏洞所在。
攻击者先把一个 privileged binary,比如 /usr/bin/su,载入 memory,把这些 memory pages 接到一个 network packet 上,然后强迫 kernel 去 clone 它。这个 cloned packet 会经过攻击者控制的 IPsec tunnel,而 decryption step 会把 binary 的 login checks 覆写成攻击者挑选的 bytes。下一次任何人运行 su 时,它就会交出 root。
磁盘上的 file 从来没有被改动。修改只存在于 kernel 的 in-memory copy 里,所以 file-integrity tools 会漏掉它,攻击也不会留下 audit trail,而且 reboot 之后会恢复原来的 binary。等到任何人可能想到要检查时,攻击者已经拿到 root 了。
要利用这个漏洞,攻击者需要 CAP_NET_ADMIN 来配置 loopback IPsec tunnel。在 Debian 和 Fedora 上,unprivileged user namespaces 默认是启用的,所以本地用户可以在一个新的 namespace 里面取得这个 capability。
Ubuntu 24.04 以及之后的版本会通过 AppArmor 限制 namespace creation,从而阻挡默认的 exploit path。Page cache 是在 host level 共享的,所以在 namespace 里面做的修改会影响机器上的每一个 process。
受影响的系统包括 multi-tenant servers、CI runners、container hosts,以及允许不受信任用户创建 namespaces 的 Kubernetes clusters。JFrog 已在 Debian、Ubuntu 和 Fedora 系统上,用默认 namespace configurations 确认了这个 exploit。
第四个 in a Series
这是最近第四个具有相同 failure mode 的 privilege escalation:file-backed memory 被当成 packet data 来处理,然后一个 in-place network operation 写到了本来应该只是 copy 的位置。
Copy Fail(CVE-2026-31431)最先在 4 月底出现,它利用 algif_aead module 做了一个 four-byte page-cache write。
DirtyFrag(CVE-2026-43284 和 CVE-2026-43500)随后在 5 月 7 日出现,串联 IPsec ESP 和 RxRPC paths,获得完整的 write primitive。
Fragnesia(CVE-2026-46300)在 5 月 13 日出现,它通过 skb_try_coalesce() 里的一个 flag-dropping bug 绕过 DirtyFrag patch。
每一个 fix 都只关闭了一条 code path,却留下了其他路径。DirtyClone 的已展示 exploit 重点在 __pskb_copy_fclone(),而 skb_shift() 也同样受影响;更广泛的 CVE fix 还涵盖了其他 frag-transfer helpers,因为同样的 flag 也可能在那里丢失。
根本问题并不是某一个坏掉的 helper function,而是一个 contract 问题:每一条移动 skb fragments 的 code path,都必须每一次保留 shared-frag bit。
kernel 的 zero-copy networking 让 file-backed memory 可以充当 packet data,而链条中任何地方只要有一个 flag 被丢掉,一个原本为了 performance 的 optimization 就会变成 write primitive。每个变种都找到了一条没有遵守这个 contract 的路径。
原本 DirtyFrag 的 researcher、Hyunwoo Kim,在 5 月 16 日提交了一个更广泛的 multi-site patch,覆盖了几个剩余的 frag-transfer helpers。合并后的 fix 在 5 月 21 日被 merged(commit 48f6a5356a33),在 5 月 23 日被分配 CVE-2026-43503,并在 5 月 24 日随 Linux v7.1-rc5 发布。
What to Do
安装你发行版提供的 kernel update。这个 fix 已经在 upstream 的 v7.1-rc5 中落地,并已 backport 到 stable 和 LTS branches。Ubuntu、Debian 和 SUSE 都已经发布 advisories;Red Hat 也有一个 Bugzilla tracking entry。
如果你今天不能打补丁,有两个 workaround 可以降低 attack surface。限制 unprivileged user namespaces:在 Debian 和 Ubuntu 上,把 kernel.unprivileged_userns_clone 设为 0(其他发行版使用不同机制)。
或者,把 esp4、esp6 和 rxrpc kernel modules 加入 blacklist,不过这会破坏 IPsec 和 AFS,而且只有在这些功能是以 loadable modules 形式存在、而不是编译进 kernel 时才有效。两者都只是 temporary controls,不是 fixes。
DirtyFrag 这个 class 很可能还没结束。任何在转移 fragment descriptors 时没有传播 shared-frag flag 的 function,都可能成为新的 CVE,而 audit 应该覆盖所有在 fragment transfer 期间会触碰 skb_shinfo()->flags 的路径。