2026年5月7日,安全研究领域迎来了一次重大的震荡,安全研究员 Hyunwoo Kim 披露了一种名为 "Dirty Frag" 的新型 Linux 内核本地权限提升(LPE)漏洞。该漏洞属于纯逻辑型缺陷,其破坏力极大,允许任何非特权本地用户在几乎所有主流 Linux 发行版上实现稳定、无需竞态条件的 Root 权限提升。
Dirty Frag 漏洞并非单一的代码疏漏,而是由内核网络协议栈中两个独立子系统的历史遗留架构问题串联而成:分别存在于 xfrm-ESP(自2017年引入)与 RxRPC(自2023年引入)子系统中的原地解密(In-place Decryption)逻辑缺陷。该漏洞与此前轰动业界的 "Copy Fail" (CVE-2026-31431) 和著名的 "Dirty Pipe" (CVE-2022-0847) 属于同一漏洞家族,均利用了 Linux 内核在零拷贝(Zero-Copy)路径(如 splice()、sendfile() 或使用 MSG_SPLICE_PAGES 标志)上对页缓存(Page Cache)写入权限把控不严的致命弱点。
Linux 操作系统采用页缓存机制来大幅加速文件系统的读写操作。当用户态进程读取磁盘上的文件时,内核会将文件内容加载到物理内存的“页”(通常为 4KB 大小)中,这些被缓存的物理页即为页缓存。如果多个进程读取同一个文件,它们将透明地共享同一块物理内存中的页缓存,从而极大地节省了系统内存开销并提升了并发读取效率。
在正常的权限控制与内存保护模型下,如果一个非特权进程以只读模式(Read-Only)打开文件,它只能读取这些页缓存,绝对无法进行修改。任何修改意图都必须通过内核的写时复制(Copy-On-Write, COW)机制进行处理:当内核检测到写入操作时,会为进程分配一个私有的内存页副本,所有的修改均在副本上进行,从而保护了原始页缓存的纯洁性和底层磁盘文件的完整性。Dirty Frag 漏洞的本质,正是攻击者找到了一条未被严密监控的“捷径”,绕过了写时复制机制,直接向驻留在内存中的只读文件页缓存中非法写入了恶意指令数据。
为了满足万兆甚至更高速率网络的数据传输需求,减少用户态与内核态之间不必要的上下文切换,Linux 引入了 splice() 和 sendfile() 等零拷贝系统调用。零拷贝的核心理念是避免数据在“用户态缓冲区”和“内核态缓冲区”之间进行消耗 CPU 周期的无意义拷贝。
在网络传输层,内核使用 sk_buff(Socket Buffer)结构体来管理网络数据包。传统的 sk_buff 包含一个连续的数据区域(即线性区)。而在零拷贝路径中,内核会生成非线性的 sk_buff:即 sk_buff 的 frag 数组(片段数组)并不包含实际的数据内存拷贝,而是直接存储指向页缓存中现有物理页的指针或引用。
当应用程序通过 splice() 系统调用将一个文件发送到网络套接字,且在底层路径中使用了 MSG_SPLICE_PAGES 标志时,内核会将该文件的页缓存直接挂载到 sk_buff 的 frag 结构中。此时,这些物理页的“所有权(Ownership)”实际上并不属于网络协议栈,而是属于底层的文件系统或匿名内存映射。网络协议栈在处理这些引用的 sk_buff 时,应当严格将其视为“只读”数据,或在必须修改时显式调用 COW 机制创建私有副本。
在处理复杂的网络协议栈(如 IPsec 隧道或加密 RPC 调用)时,数据包的加密与解密是高度计算密集型的任务。为了追求极致的吞吐量和最低的延迟,内核网络开发者倾向于使用原地操作(In-place Operation)来进行密码学运算。原地操作意味着密码引擎直接在密文所在的原始内存地址上进行解密计算,并将生成的明文直接覆盖在原本的密文之上,从而彻底免除了分配新内存和进行数据拷贝的开销。
然而,原地操作的绝对前提是:内核必须在运算前百分之百地确保当前操作的内存区域是私有的且完全可写的。如果当前的 sk_buff 是非线性的,且其内部的 frag 指向的是外部拥有的页缓存(例如通过 splice 系统调用挂载的、其他进程正在使用的只读文件页),此时直接进行原地解密,就会导致解密后的数据(或被攻击者刻意构造的伪造密文)被内核自身强制写入到不该被修改的系统页缓存中。这种架构层面的假设失配,构成了整个漏洞利用链条中最核心的突破口。
分析 Dirty Frag 无法脱离其在安全发展史中的演进脉络。此类“页缓存污染(Page Cache Poisoning/Write)”漏洞已经形成了一个具有明显家族特征的攻击面,暴露出 Linux 内核在处理文件缓存与 I/O 缓冲区融合时的系统性脆弱。

Dirty Frag 与 Copy Fail 共享了完全相同的底层漏洞模型(Sink)和攻击原语,但 Dirty Frag 彻底摆脱了对 algif_aead 密码学模块的依赖 。这意味着,即使系统管理员在之前应对 Copy Fail 漏洞时已经通过黑名单禁用了 algif_aead 模块,系统依然完全暴露在 Dirty Frag 的威胁之下。
Dirty Frag 是一个高度复杂的复合型逻辑漏洞,它巧妙地利用了内核在处理 UDP 封装(UDP Encapsulation)和特定加密网络传输协议时的状态机缺陷。具体而言,该漏洞是由两个相互独立但原理高度一致的子缺陷构成的,攻击者只要能够触及其中任意一条代码路径,即可实现完整的权限提升。
xfrm 是 Linux 内核中负责实现 IPsec(IP 安全架构)的基础框架,而 ESP(Encapsulating Security Payload)是 IPsec 协议族中的核心组件,用于为网络层数据提供机密性、数据源验证和抗重放攻击保护。
自 2017 年 1 月提交的内核补丁 cac2661c53f3 开始,ESP 子系统的代码在处理接收到的网络数据包时,为了提升 UDP 封装下 ESP 数据包的处理性能,引入了一个致命的逻辑缺陷。在常规的、负责任的安全协议栈处理流程中,函数 skb_cow_data() 被强制调用,用来仔细检查 sk_buff 是否包含共享的或由外部持有的只读引用页(如通过 splice 挂载的页缓存)。如果发现存在此类引用,该函数会强制执行写时复制(COW),将数据拷贝到安全的私有内存中,以确保后续的解密覆写操作不会越界破坏系统状态。
然而,在 ESP-in-UDP 的无写时复制快速路径(no-COW fast path)中,内核代码的处理逻辑出现了偏差。esp_input 函数在某些特定的套接字状态下,错误地绕过了对 skb_cow_data() 的调用,并直接指令 crypto_authenc_esn_decrypt 函数在原始的 sk_buff 片段(frag)上执行极其危险的原地解密操作。
在一条经典的攻击路径中:攻击者首先通过 AF_INET6 等协议族建立一个配置了 UDP 封装特性的 IPsec 套接字。随后,攻击者调用 splice(),将一个高权限的 SUID 二进制文件(如 /usr/bin/su 或 /usr/bin/sudo)的只读页缓存直接拼接到该套接字的发送队列中,从而构造出一个带有 MSG_SPLICE_PAGES 标志、其片段指针直接指向目标文件页缓存的非线性数据包。当该数据包被发送并经由本地环回接口(Loopback)或底层路由重新进入接收端的快速路径时,ESP 解密例程盲目地假定当前 sk_buff 的认证标签区域(Tag area)和数据负载区域均是可写的私有内存。解密引擎全速运转,将攻击者精心构造的“密文”解码,并将解码后的恶意数据直接强制写入到原本属于 /usr/bin/su 文件的物理内存页缓存中 。由于这一写入过程是在内核最高权限(Ring 0)下发生的,底层的页表只读属性被完全无视,页缓存污染宣告完成 。
与 ESP 漏洞的成因如出一辙,第二个构成 Dirty Frag 的子漏洞隐藏在 AF_RXRPC 协议栈的深处。RxRPC 是一种专门为 Andrew File System (AFS) 及其相关分布式计算服务设计的远程过程调用(RPC)网络传输层协议。
自 2023 年 6 月的内核提交 2dc334f1a63a 引入以来,RxRPC 子系统中的 rxkad_verify_packet_1 函数便潜伏着一个类似的页缓存写入缺陷。在对接收到的 RxRPC 数据包进行完整性验证与解密时,该函数会调用 pcbc(fcrypt) 加密算法,对数据包执行高效率的原地单块解密(in-place single-block decrypt)。
如果攻击者针对该协议栈发起攻击,将一个受其完全控制且由 splice 系统调用映射的只读文件页缓存强行投递到 RxRPC 的接收处理链条中,解密引擎同样会绕过至关重要的 COW 机制,以不可阻挡的态势,强行在这些本不属于网络栈的外部物理页上覆盖解密后的字节流 。
在操作系统内核漏洞的利用历史中,类似于 Dirty COW(CVE-2016-5195)这样的经典提权漏洞,往往高度依赖于极为苛刻的精确时间窗口来引发竞态条件(Race Condition)。这种依赖性导致漏洞利用在不同 CPU 架构、系统负载或内核版本下的成功率波动极大,甚至频繁导致内核崩溃(Kernel Panic)。
相比之下,Dirty Frag 被安全界定义为一个异常纯粹的“确定性逻辑漏洞”(Deterministic Logic Bug)。在 Dirty Frag 的利用流程中,内存映射的创建、数据包的构造、套接字的发送与接收、以及最终解密函数的调用,其生命周期和执行流是严格确定且串行的。只要攻击者成功触发了带有 MSG_SPLICE_PAGES 标志的快速路径,并迫使内核调用对应的原地加密接口,数据覆写的动作就必定发生。这种冷酷的确定性赋予了该漏洞无与伦比的极高稳定性——其利用成功率在大多数环境下接近 100%,且几乎不会留下导致系统崩溃的内存破坏痕迹。这种特性使得 Dirty Frag 在实战环境(例如高级持续性威胁 APT 攻击、勒索软件的横向提权、或自动化僵尸网络的隐蔽部署)中具备了极高的战术价值。
Dirty Frag 漏洞的影响深度和覆盖广度在近年来的内核安全事件中实属罕见。它不仅横跨了长达近 9 年的 Linux 内核发布周期,波及了几乎所有已知的主流企业级操作系统,更对当前依赖内核隔离的云原生架构和多租户商业模式提出了根本性的挑战。
漏洞在内核代码树中的生存周期极长。公开的分析表明:
xfrm-ESP 页缓存污染缺陷: 自内核补丁提交 cac2661c53f3(2017 年 1 月)起,便已潜伏在代码中,这意味着近九年来发布的所有包含 IPsec 组件的内核均在其威胁笼罩之下 17。
RxRPC 页缓存污染缺陷: 自内核补丁提交 2dc334f1a63a(2023 年 6 月)引入,持续影响后续的所有上游内核版本 17。
下表详细汇总了已知受该漏洞直接影响的主流操作系统发行版:

令人极其忧虑的是,在漏洞曝光初期,即便是最新的主线 Linux 内核版本(例如 7.0.3-1 甚至刚发布的 7.0.4 候选版本)同样处于未修补状态,这意味着整个开源生态在一段时间内处于完全的“裸奔”状态。
Dirty Frag 的高危性不仅仅体现在桌面端或传统服务器上,其真正的灾难性影响在于其能够轻易瓦解现代云计算环境中的复杂隔离架构。
多租户共享主机架构的崩溃 在由 CloudLinux 等技术构建的共享主机(Web Hosting)环境中,成百上千个不相关的网站租户或小型企业共享同一个底层 Linux 内核以降低成本。Dirty Frag 允许一个仅拥有极低权限(如受限的 PHP 执行权限或 jailed shell)的恶意租户,通过运行一个简单的 Python 或 C 脚本,瞬间提权为 Root。一旦获取 Root 权限,攻击者即可肆意穿透隔离沙箱,直接访问、篡改或窃取同一物理节点上其他所有租户的数据库凭证、商业机密及用户隐私数据。
Kubernetes 集群的容器逃逸与横向接管 云原生 Kubernetes (K8s) 环境面临着同等级别的风险。如果集群中的工作负载(Pods)未配置极为严格的无特权沙箱机制(例如未通过 Sysctl 显式禁用 unprivileged_userns),攻击者在利用 Web 漏洞攻陷一个看似受限的普通业务容器后,可以利用 Dirty Frag 漏洞执行跨边界打击。由于页缓存机制在宿主机操作系统层面是全局共享的,攻击者能够在容器内部直接修改宿主机底层的基础二进制文件(如 /bin/bash 或 runc)。当宿主机的合法管理员或其他进程调用这些已被注入木马的文件时,攻击者便实现了从容器到宿主机 (Container-to-Host) 的完美逃逸。获取底层的 Root 权限后,攻击者可顺势接管 Kubelet 组件,进而向整个微服务集群发起横向移动(Lateral Movement)。
CI/CD 流水线构建环境的风险 在诸如 GitHub Actions、GitLab CI、Jenkins 等持续集成与持续部署(CI/CD)环境中,平台需要频繁运行由外部开发者提交的、潜在不受信任的代码以进行编译和测试。恶意行为者可以通过提交经过伪装的恶意 Pull Request,在构建流水线的 Runner 节点中静默利用 Dirty Frag 提权。由于该漏洞无竞态、不导致崩溃,此类攻击极难被传统的异常检测机制捕获。提权成功后,攻击者可轻易窃取整个代码仓库的环境变量、生产环境的 API 密钥、代码签名证书及底层云基础设施的访问凭证,从而实施极具破坏性的供应链攻击。

Dirty Frag 所提供的核心攻击原语是:有限但高度可控的任意页缓存写入能力(Controlled Arbitrary Write to Page Cache)。受限于内核加密模块内部固定结构和处理块大小的逻辑约束,攻击者或许无法在一次系统调用中写入数兆字节的连续数据。然而,在现代操作系统的二进制执行机制下,这种限制已无关紧要。攻击者只需精确计算偏移量,覆盖关键系统组件(如具有 SUID 标志的 /usr/bin/su、/usr/bin/passwd 二进制文件,或是核心动态链接库 libc.so)中的短短数个关键字节(例如 4 字节的跳转指令覆盖),便足以兵不血刃地彻底改变整个程序的执行流向。
阶段 1:环境评估与目标劫持锁定
攻击程序首先探测当前系统的架构与内核特性,并选择一个系统中广泛存在且具有 SUID 标志(允许程序以文件所有者即 root 权限运行)的目标文件(如 /usr/bin/su)。程序以普通的只读模式(O_RDONLY)安全打开该文件,并使用内存映射(mmap)技术或直接读取操作,精准定位需要被替换的目标机器指令的内存偏移量。
阶段 2:构建管道与映射 Splice 缓冲区
攻击程序在内存中实例化一个标准的 UNIX 管道(Pipe)。随后,调用 splice() 系统调用,指明将目标文件(/usr/bin/su)的对应文件描述符单向映射到该管道的输入端。在此关键步骤中,内核为追求效率,绝对不会复制任何底层文件数据,而是仅仅将指向该文件物理页缓存的内存管理指针装载到管道内核结构的环形缓冲区(Ring Buffer)内。
阶段 3:特殊套接字初始化与协议栈注入准备 攻击程序进而请求内核分配一个特定的网络套接字。在利用 ESP 漏洞分支的情况下,程序会实例化一个针对 UDP 封装模式的 AF_INET6(或 AF_INET)套接字,并隐蔽地配置相应的 IPsec 策略路由;若采取利用 RxRPC 分支的策略,则会直接创建一个 AF_RXRPC 类型的套接字体系 。
阶段 4:触发 MSG_SPLICE_PAGES 与致命的原地修改 此阶段是整个漏洞链的核心。攻击者使用支持零拷贝的高级网络发送函数(如 sendmsg),明确携带 MSG_SPLICE_PAGES 标志,将之前填充好的管道内容推送至底层的网络协议栈。内核网络子系统顺理成章地将这些源自管道的物理页引用,直接封装进网络数据包 sk_buff 结构的非线性片段数组(frag)中。
随后,当数据流经底层网络栈并进入接收端的数据处理逻辑时,esp_input 或 rxkad_verify_packet_1 函数拦截到了这些数据包。进入密码学处理阶段时,由于缺乏对内存所有权的边界感知,密码学引擎将攻击者在用户态预先控制的“伪造密文”或“状态参数”,通过原地解密(In-place Decryption)机制,直接、暴力地覆写到了那块原本被标记为只读的、属于目标二进制文件的页缓存上。
阶段 5:执行流篡改与权限接管 底层内存覆写瞬间完成。攻击程序随即调用常规的 execve() 系统调用,请求操作系统运行那个看似正常的 /usr/bin/su 文件 16。当内核加载该二进制文件并为其分配执行空间时,由于 Linux 的缓存机制,它直接命中了已经驻留在内存中并被严重污染的页缓存。原本用于执行密码验证逻辑的核心指令,在 CPU 执行时已被偷梁换柱为攻击者注入的反弹 Shell(Reverse Shell)指令或专门的提权 Shellcode。操作系统忠实地执行了这些最高权限指令,随之将一个具有完全 Root 权限的交互式终端拱手让给了底层的攻击者。
鉴于 Dirty Frag 漏洞属于未经协调即被强制公开的严重 0-day 事件,全球 Linux 基金会、各大商业操作系统供应商以及网络安全机构在极短时间内启动了最高级别的联合应急响应。
ESP 漏洞修补逻辑 (xfrm-ESP) 针对影响深远的 xfrm-ESP 子系统,Linux 上游的 netdev 代码树在紧急响应后合并了修复补丁,对应的代码提交 ID 为 f4c50a4034e62ab75f1d5cdd191dd5f9c77fdff4。 该修复方案的核心技术思路是:在协议栈深处彻底撤销不安全的内存就地操作假设,强制要求系统在网络层进入加密或解密例程之前,必须对非私有属性的内存页执行严格的写时复制(COW)或进行深度的内存所有权校验。补丁通过修改底层结构,确保了在调用 crypto_authenc_esn_decrypt 等需要高频修改数据缓冲区的密码学函数时,目标 sk_buff 所携带的所有 frag 数据均映射到绝对安全的私有分配内存中。这一举措从微观层面彻底阻断了数据包处理逻辑跨越权限域非法篡改页缓存的可能。
RxRPC 漏洞修补逻辑 (AF_RXRPC) 针对第二个漏洞分支 RxRPC,相应的修复补丁已被提交至 Linux 内核邮件列表(LKML)进行严谨审查,其对应的技术讨论追踪标识为 afKV2zGR6rrelPC7@v4bel。该补丁全面重构了 rxkad_verify_packet_1 函数的缓冲区遍历与数据提取逻辑,从架构层面明令禁止密码学引擎在由外部传入的、属性未知的不可变页上直接启动 pcbc(fcrypt) 算法的单块解密运算。
各大主流企业级发行版(如 Ubuntu, AlmaLinux, RHEL, Debian)的系统工程师团队正加紧拉取上述上游补丁,并进行繁杂的向后移植(Backport)工作,以将其集成至各自维护的 LTS(长期支持)内核版本中。例如,注重安全响应的 AlmaLinux 已率先在 kernel-6.12.0-124.55.2.el10_1 等测试仓库版本的内核中集成了完整的防御修复。
考虑到在复杂的企业数据中心和云基础设施中,大规模的内核升级和系统全局重启往往需要数周的调度窗口,安全响应团队必须在官方稳定版补丁部署前,立即实施非破坏性的临时缓解方案。
1. 阻断攻击路径:禁用受影响的内核模块 (Module Blacklisting)
由于漏洞的触发与利用过程严重依赖于特定底层网络协议栈模块的支撑,当前最直接、最快速且行之有效的缓解措施是阻止 esp4, esp6 和 rxrpc 这三个模块被内核守护进程动态加载至内存中。系统管理员可通过在系统的模块配置文件中写入虚拟的黑名单指令来实现拦截:
# 写入黑名单防护配置,并尝试强制卸载当前可能已加载的脆弱模块
sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"执行上述防护命令后,攻击者在用户态试图使用的恶意 PoC 将因无法请求创建相关的底层网络套接字结构而直接报错退出,原本畅通无阻的漏洞利用链条被硬性切断。此操作具备极高的实施效率(通常耗时不超过 10 秒),且全程无需重启系统服务。当后续应用了官方内核更新后,仅需删除 /etc/modprobe.d/dirtyfrag.conf 文件即可恢复系统原状。
黑名单策略的局限性与兼容性风险评估: 需要强调的是,禁用 esp4 和 esp6 模块将直接导致所有高度依赖内核数据路径的 IPsec 安全隧道(如通过 strongSwan 或 Libreswan 配置的企业级 VPN 节点)陷入瘫痪。同理,禁用 rxrpc 模块将导致那些依赖于 Andrew File System (AFS) 协议的分布式服务无法通信。然而,对于未开启此类隧道的绝大多数通用 Web 业务服务器、数据库集群或微服务节点而言,此方案是完全安全的(它不会对依赖其他机制的隧道协议如 Tailscale, WireGuard, OpenVPN 造成任何负面影响)。
在 AlmaLinux 等特定发行版中,rxrpc 模块可能仅通过特定的 kernel-modules-partner 扩展包提供,此时更彻底的解决方案是直接使用包管理器将其移除:
sudo dnf remove kernel-modules-partner这能有效削减不必要的内核攻击面。
2. 消除既有威胁:清除被污染的页缓存 (Cache Eviction) 鉴于 Copy Fail 和 Dirty Frag 这类漏洞的特殊机制,它们仅仅修改了驻留在系统动态内存中的页缓存数据,由于巧妙避开了写回触发机制,并未将相应的物理页标记为“脏页”(Dirty,即需要被操作系统写回持久化存储的标志),因此底层磁盘上文件的真实物理内容往往并未受损。
然而,这引发了一个更隐蔽的风险:如果在安全人员介入、模块被禁用或网络阻断之前,系统就已经遭受了隐秘攻击,那么那些被植入了恶意逻辑的指令页可能依然潜伏在活跃的内存缓存中。因此,在实施任何访问控制后,必须通过内核接口强制系统清空缓存,迫使内核抛弃内存中的可疑数据,并在下一次文件访问时从安全的底层磁盘重新读取纯净的二进制数据块:
# 强制内核清空页缓存、目录项 (dentries) 和 inode 缓存
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches清除缓存前依然可以成功:

清除缓存后失败:

将模块强制隔离与系统级缓存清理紧密结合,可以在缺乏官方有效内核补丁的高危时间窗口内,最大程度地夺回系统控制权并保障核心业务的安全运行。
内核热补丁技术 (Livepatching): 包括 CloudLinux 在内的主流企业级云服务提供商,通过其 KernelCare 等基础设施提供了非颠覆性的热补丁更新方案。这类技术允许运维团队在不中断当前运行进程、不牺牲系统高可用性(SLA)的前提下,将针对 Dirty Frag 的 CVE 修复逻辑直接动态注入到运行中的内核内存空间中,实现了对漏洞的瞬时无感阻断。
非特权用户命名空间限制 (User Namespaces Restriction): 对于无需运行 rootless 容器的普通业务系统,通过系统参数限制无特权用户的命名空间创建权限(如执行 echo 1 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns),能够在极大程度上收缩内核的复杂攻击面,阻断此类需要复杂环境构造的提权路径。
基于 eBPF 的无侵入式行为监控引擎: 针对该漏洞高度特征化的攻击行为,防御平台可编写并下发 eBPF(Extended Berkeley Packet Filter)探针,深入内核关键路径,实时监控程序调用 splice() 且目的端句柄指向 AF_INET6(配置为 UDP 封装状态)或 AF_RXRPC 协议等异常行为进程链。通过在运行时设置基于多维时序特征的异常序列检测模型,安全平台可以在漏洞真正触发文件覆写的前置阶段,提前捕获微小的异常状态并精准阻断恶意进程的执行。
本课程最终解释权归蚁景网安学院
本页面信息仅供参考,请扫码咨询客服了解本课程最新内容和活动