对 Linux 内核中 CVE-2026-43284(Dirty Frag)本地权限提升漏洞的详细技术分析。
CVE-2026-43284(通常被视为 Dirty Frag 漏洞套件的一部分)是 Linux 内核中的一个严重本地权限提升(LPE)漏洞。它源于 xfrm ESP(封装安全载荷)输入子系统中的一个逻辑缺陷。该漏洞允许本地非特权攻击者绕过典型的写时复制(CoW)保护,并实现对只读系统文件(如 /usr/bin/su)的任意页缓存写入原语,最终导致完全的 root 权限沦陷。
漏洞剖析与攻击向量1.
约束条件:与内核的 IPsec 配置进行交互通常需要 CAP_NET_ADMIN 能力,这是普通用户所不具备的特权。 绕过方式:本地非特权用户可以创建一个独立的非特权用户命名空间和网络命名空间(使用 CLONE_NEWUSER | CLONE_NEWNET 等标志)。在这个隔离的非特权容器空间内,攻击者成为该命名空间的“root”进程,从而在这个受限上下文中获得 CAP_NET_ADMIN 特权。
在自定义网络命名空间内拥有 CAP_NET_ADMIN 后,攻击者配置一个伪造的安全关联(SA)和 IPsec 策略。
使用 splice(2) 或 vmsplice(2) 等系统调用,攻击者将属于目标只读文件(例如 /usr/bin/su)的内存页附加到套接字缓冲区(skb)片段中。
约束条件:攻击者必须迫使内核通过 esp_input() 例程解析数据。
策略:攻击者创建一个 ESP-in-UDP 封装网络结构,并将传输定向到主机的环回接口(127.0.0.1)。
当数据包通过环回通道在本地被接收时,内核的网络栈识别出 UDP 数据包封装,对其进行解封装,并将内部载荷交给 esp_input() 进行处理。
由于 IPv4/IPv6 数据报追加路径中的逻辑缺陷,内核在将内存页拼接进 UDP 套接字时,未能正确地为底层套接字缓冲区片段标记 SKBFL_SHARED_FRAG 标志。
因此,esp_input() 将该数据包误判为私有的、未被克隆的缓冲区,并走上“无 COW”的性能优化快速路径。
esp_input() 并未将数据复制到安全的用户缓冲区,而是直接在从系统页缓存借用的内存页上执行就地解密。
通过精细调整加密载荷数据并利用加密算法配置(如扩展序列号),解密过程会确定性地覆写页缓存中的目标二进制文件。
一旦 /usr/bin/su 等二进制文件的页缓存在内存中被攻击者的载荷污染,执行该二进制文件便会以 root 身份触发载荷执行,而无需接触或修改存储在物理磁盘上的实际二进制文件。
影响:高可靠性、确定性的本地权限提升,可跨主要企业级 Linux 发行版实施,且不会引发内核崩溃。
修复措施:将 Linux 内核更新至包含相应补丁的版本,该补丁对数据报拼接强制执行 SKBFL_SHARED_FRAG 处理,并在 ESP 处理逻辑中引入对 skb_cow_data() 的安全回退。