“分片失忆”——Dirty Frag补丁如何催生了Fragnesia漏洞

作者:安天研究院      时间 :2026年05月16日

摘要


Linux 内核近期爆发的 Fragnesia(“分片失忆”)漏洞,揭示了安全补丁可能激活历史代码缺陷的连锁风险。该漏洞因 SKB 标记在分片合并过程中静默丢失而得名“分片失忆”:安天研究院研究人员提出了补丁衍生漏洞问题的研究框架,基于大模型的全面辅助,完成本报告编写。旨在深入剖析这一补丁衍生漏洞的技术根因与状态机演化机理,系统梳理同类历史缺陷案例,并针对漏洞挖掘、缺陷修补与补丁审核流程提出优化建议。报告强调:Fragnesia 事件给开发者与安全修复者很深的教益,但其不应导致补丁恐慌心理。其事件证明的是补丁修复机制需要在AI时代升级,由传统路径检测进阶至全局状态机一致性校验。但必须明确的是,补丁修复是应对软件安全缺陷的最基础和必备的机制。

一、引言


1.1 事件回溯:从Dirty Frag到Fragnesia的“漏洞连锁”

2026年5月,Linux内核安全社区经历了一场罕见的连锁安全事件。5月4日,Kuan-TingChen向netdev邮件列表提交了基于shared-frag方法的修复补丁。该补丁引入SKBFL_SHARED_FRAG标记机制,意图在ESP输入路径中识别并阻断来自splice()的共享缓存页。5月7日,独立安全研究员Hyunwoo Kim(@v4bel)通过oss-security邮件列表公开披露了Dirty Frag漏洞——一个通过链式组合xfrm-ESP(CVE-2026-43284)与RxRPC(CVE-2026-43500)两个页缓存写入原语实现的本地权限提升(LPE)漏洞,影响Ubuntu 24.04.4、RHEL 10.1、openSUSE Tumbleweed、CentOS Stream 10、AlmaLinux 10、Fedora 44等全系列主流发行版。该漏洞的破坏性在于其确定性:无需竞态条件,不依赖内核版本差异,单原语即可覆盖setuid二进制文件的内存映像,CVSS评分高达7.8。Linux内核维护者在压力之下迅速响应,5月7日,xfrm子系统维护者Steffen Klassert引导该补丁合入netdev tree;5月8日,补丁(commit f4c50a4034e6)合入mainline。社区一度认为,Dirty Frag的攻击面已被彻底封堵。

然而,约5-6天后的5月13日,安全研究员William Bowling——Zellic公司Head of Assurance、V12 Security团队成员——向netdev邮件列表提交了Fragnesia的修复补丁(Message-ID: 20260513041635.1289541-1-vakzz@zellic.io),正式披露Fragnesia(CVE-2026-46300)。其利用路径直接源于Dirty Frag的修复补丁——SKBFL_SHARED_FRAG标记在skb_try_coalesce()的合并路径中丢失,导致修复后的内核反而开放了新的页缓存写入窗口。攻击者通过AES-GCM的密钥流异或(keystream XOR)实现逐字节精确写入,PoC成功覆盖/usr/bin/su的前192字节。该漏洞的CVSS评分同样高达7.8。从Dirty Frag到Fragnesia,间隔不是数月,而是短短约一周。这不是巧合,而是补丁衍生漏洞(Patch-Induced Vulnerability)的典型案例:一个旨在“治愈”漏洞的补丁,在特定条件下“催生”了新的攻击面。

1.2 演化悖论:安全补丁为何成为新漏洞的温床

漏洞响应修复模型遵循“发现-修复-验证-关闭”的线性逻辑。然而,Fragnesia的事件轨迹呈现了一个非线性悖论:修复行为本身改变了系统的状态空间,使得原本休眠的缺陷获得新的语义上下文,从而被“激活”为可利用漏洞。这一悖论可以视为一个状态机复杂性问题。状态机是固定状态基于触发条件和迁移规则的行为逻辑模型, Linux 内核整套资源、数据结构、网络缓冲区、协议流程共同构成的复杂的全局运行状态流转体系,因此其内核并非静态代码集合,而是动态演化的状态机网络。任何安全补丁——尤其是引入新标记、新检查点、新分支路径的补丁——都会改变状态迁移规则。若补丁设计者对状态机的全局拓扑缺乏完整认知,新引入的状态变量可能在某些迁移路径中“丢失”或“变异”,产生补丁设计者未预期的可达状态。Dirty Frag的修复补丁正是如此:它引入了一个二元标记SKBFL_SHARED_FRAG,假设该标记会随skb(socket buffer)在其全生命周期内正确传播。

然而,skb在内核网络栈中经历分配、克隆、合并、分片、释放等数十种操作,每种操作都可能改变其内部状态。补丁设计者验证了ESP输入路径的标记检查,却遗漏了skb_try_coalesce()合并路径中的标记传播——一个自2013年(commit cef401de7be8)即存在、13年间从未被触发的古老缺陷。Fragnesia补丁同时指向了两个Fixes标签:2013年的cef401de7be8和2026年的f4c50a4034e6,需要特别澄清的是:从技术真相来看,Fragnesia并非由Dirty Frag补丁“引入”新bug,而是Dirty Frag补丁添加了依赖SKBFL_SHARED_FRAG标记正确的代码路径,使得一个已有13年历史的coalescing bug首次变得可被利用。

1.3 “分片失忆”:Fragnesia根因的精确比喻(skb分片合并中的标记丢失)

“分片失忆”是对Fragnesia根因的精确比喻。Fragnesia是William Bowling基于Fragment(碎片、内核网络分片)和nesia = Amnesia(失忆、遗忘)两个词的拼接构造,因此本漏洞也被中译为“分片失忆”。skb_try_coalesce()是内核中负责将两个相邻skb的分片区合并的函数,其设计目标是减少内存分配开销、提升网络吞吐量。在Linux内核网络栈中,skb(socketbuffer)是网络数据包的核心载体。当数据包较大或经过零拷贝路径时,skb的数据区可能由多个分片(fragment,简称frag)组成,这些分片指向独立的内存页。Dirty Frag修复补丁为skb引入了一个“记忆”——SKBFL_SHARED_FRAG标记,定义于include/linux/skbuff.h(SKBFL_SHARED_FRAG = BIT(1)),用于标识该skb包含来自用户态splice()的共享缓存页,这个记忆在ESP输入路径中被读取,若存在则强制触发COW(Copy-On-Write),阻止原地解密对共享页的篡改。然而,当两个skb经过skb_try_coalesce()合并时,这个“记忆”被选择性遗忘了。合并后的skb继承了合并前的数据内容,却丢失了共享页标记。于是,一个本应被标记为“危险”的缓存页,在合并后以“清白”身份进入ESP-in-TCP解密路径,接受AES-GCM的原地异或操作——分片失忆,标记归零,攻击由此发生。

二、治愈与副作用:补丁的正反双重属性


2.1 Dirty Frag修复的关键逻辑:SKBFL_SHARED_FRAG标记机制

Dirty Frag的攻击核心在于:攻击者通过splice()将setuid二进制文件(如/usr/bin/su)的缓存页注入网络skb的分片区,随后skb进入xfrm-ESP或RxRPC解密路径,原地解密操作直接覆盖共享缓存页实现提权。为修复该漏洞,Kuan-Ting Chen提交的修复补丁(commit f4c50a4034e6),由Steffen Klassert等维护者审核后合入主线,该补丁采用了“标记-检查”策略。标记阶段:在splice()将缓存页注入skb分片区时,为skb设置SKBFL_SHARED_FRAG标记;传播阶段:假设该标记会随skb的克隆、引用、传递等操作正确传播;检查阶段:在ESP输入路径(esp_input()→esp_input_done2())中,检查skb是否携带该标记。若携带,则对涉及的原地解密操作强制触发skb_cow_data()进行私有复制,避免在共享frag上执行原地解密。这一策略在单一路径验证中看似完备:只要标记正确设置并在ESP路径前未被篡改,攻击者的共享页注入即被阻断。

2.2 修复的边界假设:标记会随skb全生命周期正确传播

修复补丁隐含了三个边界假设,这些假设共同构成了“充分性幻觉”的基础。

假设一:标记的持久性。SKBFL_SHARED_FRAG作为skb私有标志的一部分,应在skb的所有操作中保持持久,直至skb释放。

假设二:标记的遗传性。当skb被克隆(skb_clone())、复制(skb_copy())或引用时,标记应被正确继承。

假设三:标记的封闭性。skb的分片区操作(如分片添加、删除、合并)不应导致标记丢失,除非操作显式清除了分片的共享属性。每一步迁移都可能涉及skb的重新分配、分片重组或标志位操作。

这三个假设在线性路径中成立,但在非线性状态迁移中失效。skb在内核网络栈中的生命周期并非简单的线性传递,而是经历复杂的图状状态迁移:网络中断接收→GRO(Generic Receive Offload)聚合→skb_try_coalesce()合并→协议栈处理(TCP/UDP)→ULP(Upper Layer Protocol)切换(如espintcp)→xfrm解密。

2.3 被忽视的角落:高性能合并路径中的标记静默丢失

skb_try_coalesce()的合并路径,其核心功能是将两个相邻的skb(to和from)合并为一个,以减少分片数量、提升缓存局部性。skb_try_coalesce()是内核网络栈中的高频优化函数,位于net/core/skbuff.c。

在Dirty Frag修复之前,这一行为无关紧要——网络栈中不存在需要跨skb传播的共享页标记。但修复补丁引入SKBFL_SHARED_FRAG后,skb_try_coalesce()的“标志位不传播”行为从“无害的设计选择”变成了“危险的标记丢失”。该函数自2013年引入以来,历经数十次优化迭代,但其核心逻辑始终未变:合并时复制分片指针,但不复制或合并源skb的标志位。补丁设计者未同步审计skb_try_coalesce()的原因在于性能敏感路径的“修复免疫性”:该函数是每包处理的热路径(hot path),增加任何额外检查(如标志位传播)都会引入分支预测失败和内存访问延迟。开发者在修复Dirty Frag时,本能地回避了对热路径的修改,选择了在“足够安全”的ESP路径入口处增加检查点。

2.4 标记“失忆”:合并后SKBFL_SHARED_FRAG丢失的代码机理

标记丢失的精确机理如下:设定场景为skb_a由攻击者通过splice()注入并携带SKBFL_SHARED_FRAG标记,分片区包含/usr/bin/su的缓存页。skb_b为正常网络数据包,无共享页标记,分片区为内核私有页。其合并过程如下:

1. TCP接收路径中,skb_a和skb_b因数据连续被送入skb_try_coalesce();

2. 函数将skb_a和skb_b的分片区合并为新的分片数组;

3. 函数释放skb_a和skb_b的独立结构,返回合并后的skb_merged;

4. skb_merged未继承SKBFL_SHARED_FRAG——标记丢失;

5. 合并后的skb_merged进入TCP ULP切换路径,被标记为espintcp(ESP-in-TCP);

6. skb_merged进入xfrm ESP-in-TCP解密路径;

7. 由于SKBFL_SHARED_FRAG已丢失,esp_input_done2()中的skb_has_shared_frag()检查返回false;

8. AES-GCM原地解密执行,密钥流异或覆盖共享缓存页;

9. /usr/bin/su的内存映像被篡改,下次执行时触发提权;

图1 Fragnesia攻击链路:从splice()到权限提升

其关键问题在于:标记丢失不是“数据损坏”,而是语义断裂。缓存页仍然是共享的(_refcount>1),但skb的元数据不再反映这一事实。内核的安全决策依赖于元数据而非物理内存状态,元数据的“失忆”直接导致安全策略的失效。正如William Bowling在Fragnesia补丁描述中指出的:skb_try_coalesce()在将分页frag从@from附加到@to时,如果@from设置了SKBFL_SHARED_FRAG标记,合并后的@to仍会保留原有的外部归属或页缓存关联分片,却无法继承共享页标记。标记静默丢失直接破坏了后续解密路径原地写入防护机制所依赖的内核不变量。

三、古老缺陷的“激活”


3.1 2013年的沉睡代码:skb_try_coalesce()标记传播缺陷的历史

skb_try_coalesce()的标记传播缺陷并非新引入的代码错误,而是自2013年即存在的设计惯性。Fragnesia补丁中的Fixes标签明确指向两个commit:

Fixes: cef401de7be8 ("net: fix possible wrong checksum generation") ←2013年提交

Fixes: f4c50a4034e6 ("xfrm: esp: avoid in-place decrypt on shared skb frags") ← Dirty Frag修补丁

2013年,Linux内核网络栈面临10GbE乃至40GbE网络接口的吞吐压力。skb_try_coalesce()的引入是为了解决高带宽场景下skb分片过多导致的缓存抖动和内存分配开销。其设计哲学是最小化元数据操作:仅复制分片指针,不复制标志位,不更新引用计数以外的任何状态。在当时的设计语境中,这一选择是合理的:skb->shinfo->tx_flags主要用于发送路径的硬件卸载标记,与接收路径的内存安全无关;不存在“共享缓存页”的概念需要跨skb传播;合并操作追求极致性能,任何额外的位操作都被视为不必要的开销。因此,skb_try_coalesce()的“标志位不传播”不是bug,而是设计假设——一个在当时完全成立、在13年后被Dirty Frag修复补丁推翻的设计假设。

3.2 为何13年间未被触发:无标记机制时的“无害性”

一处潜伏长达13年的逻辑缺陷,之所以长期未爆发安全风险,原因是漏洞依赖的前置约束始终不存在。skb_try_coalesce()自2013年落地以来,始终遵循合并分片时只拷贝分片数据、不同步传递SKB标志位的固有逻辑。在内核未引入SKBFL_SHARED_FRAG安全标记的漫长周期里,网络栈无需跨skb流转共享页属性与安全元数据,仅frag数据合并即可满足业务与性能需求。此时标记不传播的行为只是普通的历史设计习惯,不存在安全危害。这个问题可类比为:一扇原本无需上锁的门,没有锁具、也无需上锁,“不能上锁”本身算不上缺陷;直到后续为安全防护加装门锁,才发现门体结构先天存在,无法适配锁具逻辑。Dirty Frag修复补丁引入SKBFL_SHARED_FRAG后,相当于给网络栈增设了共享页防护校验,而skb_try_coalesce()遗留的标志位不传播短板,立刻从无害设计变为致命缺陷,最终造成防护标记静默丢失、安全策略被绕过。

3.3 Dirty Frag补丁的“激活效应”

新标记使古老缺陷首次成为攻击路径。Fragnesia的悖论在于:修复补丁不是修补了缺陷,而是激活了缺陷。Dirty Frag修复补丁引入SKBFL_SHARED_FRAG标记,本意是增加安全状态机的维度。然而,这一新增维度与旧有代码路径(skb_try_coalesce())发生了不兼容交互的状态机演化:新状态机中,skb_try_coalesce()成为未定义迁移(undefined transition)——补丁设计者未考虑该路径下标记应如何传播,旧代码也未处理新标记。结果,系统退回到旧状态机的默认行为(skb_normal),绕过了新引入的安全检查。这种“激活效应”是补丁衍生漏洞的典型模式:新代码赋予旧缺陷新的语义上下文,使其从“不可达状态”跃迁至“可达且可利用状态”。

图2 状态机演化图展示Dirty Frag补丁如何引入Fragnesia漏洞

3.4 从“设计疏忽”到“补丁衍生漏洞”的状态跃迁

Fragnesia的状态跃迁揭示了漏洞分类学的演进:补丁衍生漏洞的特殊性在于其责任归属的复杂性:修复者并非引入原始缺陷,但其修复行为改变了系统的状态空间拓扑,使得原始缺陷首次成为攻击路径。这要求安全社区建立补丁副作用审计(Patch Side-Effect Auditing)机制,将修复行为本身纳入漏洞研究范畴。

四、补丁衍生漏洞的规律与启示


4.1 补丁衍生漏洞的三种路径:绕过、降级、激活与历史案例

Fragnesia案例是补丁“激活”漏洞的代表性事件,但“激活型”只是补丁衍生漏洞的路径之一,基于对历史上多起补丁衍生漏洞的分析,我们将衍生路径其划分为三类:绕过型(Bypass)、降级型(Degradation)、激活型(Activation)。当然还有一种情况就是攻击者以修复者的身份出现,在补丁中构造漏洞,典型案例如:XZ Utils 后门事件(CVE-2024-3094),攻击者伪装成修复者、贡献者,在补丁里直接构造漏洞。但这是带有社会工程学的攻击手段,不在本次分析讨论范围之内。

形态一:绕过(Bypass)

该形态的修复补丁增加了检查点(如权限校验、边界检查、状态验证等),但攻击者通过分析补丁引入的控制流变化找到了绕过这些检查点的替代路径,使得安全检查形同虚设。

关键特征:补丁意图正确,检查逻辑本身无缺陷;检查点存在但覆盖路径不全面;攻击者通过ioctl、替代syscall或其他未受控代码路径绕过检查;漏洞仅在补丁应用后才可被利用。

形态二:降级(Degradation)

该形态的修复补丁在尝试降低攻击面或增加安全机制时,反而降低了攻击门槛或扩大了可利用的攻击窗口。修复逻辑本身成为竞争条件、状态不一致或引用计数错误的来源。

关键特征:补丁意图增加安全性或降低攻击面;修复逻辑引入了新的竞争条件或状态不一致;旧漏洞可能仅在高复杂度下可利用,补丁后利用门槛显著降低。

形态三:激活(Activation)

该形态的修复补丁引入新标志位、新状态机或新机制,但与已有代码路径不兼容,导致原本无法触发的休眠缺陷(dormant bug)在新语义上下文中首次变为可利用。

关键特征:补丁引入新标志位、新状态机或新语义;旧代码中存在休眠缺陷;新机制与旧代码路径不兼容;休眠缺陷在新语义上下文中首次可被利用。Fragnesia (CVE-2026-46300)即为典型激活型补丁衍生漏洞。

4.2 “充分性幻觉”:修复覆盖度的认知偏差

“充分性幻觉”是补丁衍生漏洞的心理学根源,就是修复者主观认为现有修复手段已经足够完备。修复者在验证补丁时,往往聚焦于直接攻击路径的覆盖,而忽视间接状态迁移路径的完整性。修复者的验证是线性思维,攻击者的利用是全路径图遍历思维。两者的认知不对称导致了“充分性幻觉”——修复者相信已覆盖所有路径,实际上仅覆盖了主流预期路径。这种思维层面的认知偏差,使得补丁测试仅聚焦主流业务流转链路,刻意忽略冷门合并、异步调度、跨模块联动等边缘执行路径,无法穷尽内核状态机全部迁移分支。最终造成新增的安全约束与状态标记仅在常规流程生效,在开发者未曾顾及的代码逻辑中出现规则失效、状态丢失等漏洞隐患。

图3 充分性幻觉:修复者的线性路径与攻击者的图遍历对比

4.3 性能敏感路径的“修复免疫性”

skb_try_coalesce()未被同步审计的核心原因在于性能敏感路径的“修复免疫性”:这种特性使得高性能优化代码成为安全修复的天然盲区。Fragnesia的案例充分证明,代码年代越久远、性能优先级越高的优化逻辑,越容易成为新增安全机制的兼容性陷阱,也是补丁副作用最容易滋生的区域。

4.4 关键审计点:从“路径检查”到“状态机全局一致性验证”

Fragnesia漏洞事件倒逼漏洞审计与补丁审核范式升级,必须从传统单一路径检查,升级为状态机全局一致性验证,核心审计优化方向如下:

1. 标记传播闭包审计:对skb五十余个核心操作函数逐一校验新增安全标记的全流程传播逻辑;

2. 跨子系统影响分析:新增安全标记不仅校验所属子系统,同步排查TCP、UDP、网络过滤、流量调度等全关联子系统;

3. 历史代码兼容性回溯审计:针对多年前遗留的底层优化函数,重新校验其设计逻辑与新增安全机制的适配性。

五、小结


5.1 开源社区正面临的AI辅助漏洞挖掘和辅助攻击双项挑战

Linux建立了非常复杂精密的开源运营体系,包括分层维护者制度、邮件列表协同开发平台、严格的代码签名与审查流程、自动化持续集成测试、定期版本发布管理、安全漏洞响应团队及CVE分配机制等,完善机制保障Linux内核成为成熟稳定的开源核心系统。但严苛的人工审核机制,已经难以抵御依托大规模AI算力的新型漏洞挖掘手段。AI辅助漏洞分析可在数小时内完成人工数周才能完成的代码遍历、路径溯源与缺陷匹配,极大压缩漏洞发现周期;同时AI可全天候不间断监控代码仓库变更、补丁推送,第一时间完成补丁副作用逆向分析,这种高效挖掘能力已经打破传统安全攻防节奏。

同时需要理性看待AI能力边界,当前AI无法深度理解底层代码设计思想与业务底层逻辑,核心漏洞研判、攻防原理分析依旧需要安全研究员主导,AI仅作为效率放大工具,而非完全替代人工分析。未来三到五年,“AI初筛隐患-专家深度研判-自动化回归验证”将成为内核安全漏洞分析与补丁审核的标准工作流程。

5.2 以AI辅助的状态机验证应对AI辅助的漏洞挖掘

Fragnesia漏洞的核心本质是内核状态机运行不一致:Dirty Frag修复补丁新增skb共享页安全状态标记,却未同步更新分片合并这类老旧状态迁移逻辑,最终造成安全机制失效。Linux内核整体可视为超大规模分布式状态机网络,skb作为核心数据载体,其状态标识在数十个内核函数、十余个子系统之间流转,人工完成全链路状态一致性校验几乎无法实现。

依托AI搭建自动化状态机验证体系,是当前最有效的防御手段,可实现三大核心能力:自动遍历标记全传播链路、自动识别跨子系统语义断裂问题、自动匹配老旧代码设计逻辑与全新安全机制的冲突点。在AI全面赋能漏洞挖掘的大环境下,防御侧必须同步启用同级别的AI防御校验能力,以AI对抗AI,补齐补丁发布前的全局安全校验短板。

5.3 修复不是终点,而是新风险的起点

传统安全运维理念普遍认为,漏洞补丁正式推送、系统完成更新后,安全风险就此终结。但Fragnesia连锁漏洞事件彻底推翻这一固有认知,漏洞补丁的公开推送,等同于向全网攻击者公开完整的修复思路、代码变更逻辑与防护边界,攻击者可快速逆向分析补丁短板,精准定位未被覆盖的攻击路径,大幅缩短从补丁发布到新型衍生漏洞利用的周期。

同时内核补丁推送存在天然时间差,从主线内核合入补丁,到各大商业发行版完成适配推送存在数天至数周的脆弱窗口期,极易被攻击者针对性利用。对于企业安全运维团队而言,必须建立补丁前置风险审计机制,在正式批量部署系统补丁前,完成补丁副作用压力测试与隐患排查;对于内核开源社区而言,探索分级分批补丁发布机制,缩小高危漏洞补丁的公开暴露范围,降低衍生漏洞曝光风险。

5.4 补丁仍是必备的、基础安全机制

Fragnesia补丁衍生漏洞事件,切勿引发行业内“拒绝打补丁”的极端错误认知。补丁衍生漏洞属于小概率、短窗口期安全风险,而未及时修复公开高危漏洞属于确定性高风险安全隐患,二者风险等级完全不对等。放任系统漏洞裸奔,远比修复漏洞催生潜在衍生漏洞的危害更大。

复杂大型代码系统天生存在设计不完备性,千万行级别的内核代码无法依靠一次性开发实现绝对无缺陷,持续迭代修复漏洞、优化安全机制,是大型基础软件唯一的安全进化路径。各类终端防护、流量隔离、入侵检测等安全手段仅能实现风险缓解,无法从根源消除内核底层安全漏洞,系统补丁修复依旧是根除底层漏洞最核心、最基础的安全手段。

AI时代之下,补丁安全体系需要全面升级,一方面依托AI强化补丁全流程安全校验,提前拦截补丁衍生隐患;另一方面搭建热补丁应急修复+正式版本补丁根治的双轨修复体系,兼顾系统业务稳定性与漏洞修复时效性。行业需要理性看待补丁副作用,优化补丁审核流程,而非否定补丁本身的安全价值。

附录


附录 A:skb_try_coalesce() 标记传播缺陷的代码片段与修复方案

A.1 缺陷代码分析

skb_try_coalesce()函数位于net/core/skbuff.c,其标记传播缺陷的核心在于合并分片时未同步合并源skb的SKBFL_SHARED_FRAG标记。

A.2 触发条件

标记丢失的触发需要满足完整条件链:攻击者通过splice()+MSG_SPLICE_PAGES注入共享缓存页并设置安全标记;数据包进入内核分片合并流程造成标记丢失;最终流入ESP解密路径绕过安全校验,完成本地权限提升攻击。

A.3 Fragnesia 上游修复补丁

本次官方修复补丁同时追溯修复2013年遗留代码缺陷与2026年Dirty Frag安全修复补丁带来的兼容性问题,补齐分片合并流程内共享页标记同步传播逻辑,彻底封堵Fragnesia漏洞攻击路径。

附录 B:Fragnesia 触发路径简化示意图

本文正文已完整梳理漏洞全链路触发流程,本附录可作为运维排查、漏洞复现参考流程图使用。

附录 C:参考资料清单

本附录所列参考资料按正文引用顺序编号,严格遵循GB/T 7714-2015参考文献著录规范,涵盖漏洞官方披露邮件、内核源码提交记录、安全研究员公开分析报告、权威漏洞数据库条目等权威资料。

[1] KIM H. Dirty Frag: Linux kernel LPE via xfrm-ESP and rxrpc page-cache write[EB/OL]. (2026-05-07)[2026-05-15].
https://github.com/V4bel/dirtyfrag
[2] KELLERMANN M. Dirty Pipe - CVE-2022-0847[EB/OL]. (2022-03-07)[2026-05-15].
https://dirtypipe.cm4all.com/
[3] SUSE. Solution Security Risk Report 2022: Dirty Pipe (CVE-2022-0847)[R]. SUSE, 2022.
https://documentation.suse.com/sbp/security/pdf/SBP-SUSE-security-report-2022_en.pdf
[4] HG TECH. Why Linux Keeps Getting Rooted by the Same Bug Class: The Page Cache Curse[EB/OL]. (2026-05-10)[2026-05-15].
https://thehgtech.com/articles/dirty-frag-page-cache-curse-2026.html
[5] LINUX KERNEL SOURCE TREE. commit f4c50a4034e6 - xfrm: esp: avoid in-place decrypt on shared skb frags[EB/OL]. (2026-05-07)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f4c50a4034e6
[6] RECONIX. Dirty Frag: How a Linux Kernel Embargo Failed in Public View[EB/OL]. (2026-05-08)[2026-05-15].
https://reconix.co/th/blog/dirty-frag-linux-zero-day-lpe/
[7] Linux Kernel Organization. splice(2) - Linux manual page[EB/OL]. (2025-09-20)[2026-05-15].
https://man7.org/linux/man-pages/man2/splice.2.html
[8] LINUX KERNEL DOCUMENTATION. XFRM (IPsec transform) subsystem documentation[EB/OL]. (2026)[2026-05-15].
https://docs.kernel.org/networking/xfrm.html
[9] RECONIX. Dirty Frag: How a Linux Kernel Embargo Failed in Public View[EB/OL]. (2026-05-08)[2026-05-15].
https://reconix.co/th/blog/dirty-frag-linux-zero-day-lpe/
[10] CYBERSCOOP. ‘Copy Fail’ is a real Linux security crisis wrapped in AI slop[EB/OL]. (2026-05-04)[2026-05-15].
https://cyberscoop.com/copy-fail-linux-vulnerability-artificial-intelligence/
[11] ANTIY LABS. Thinking of “Attack Primitive” Based on Dirty Frag Vulnerability Discovery Process[EB/OL]. (2026-05-09)[2026-05-15].
https://www.antiy.net/p/thinking-of-attack-primitive-based-on-dirty-frag-vulnerability-discovery-process-re-discussion-on-human-machine-division-of-vulnerability-discovery-and-analysis/
[12] Palo Alto Networks Unit 42. Copy Fail: What You Need to Know About the Most Severe Linux Threat in Years[EB/OL]. (2026-05-05)[2026-05-15].
https://unit42.paloaltonetworks.com/cve-2026-31431-copy-fail/
[13] LINUX KERNEL SOURCE TREE. commit a664bf3d603d - Revert “crypto: algif_aead - fix AEAD decryption for assoclen”[EB/OL]. (2026-04-01)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a664bf3d603d
[14] BOWLING W. [PATCH net] net: skbuff: preserve shared-frag marker during coalescing[EB/OL]. netdev mailing list, (2026-05-13)[2026-05-15].
https://lists.openwall.net/netdev/2026/05/13/79
[15] National Vulnerability Database. CVE-2024-50264[EB/OL]. (2024-11-19)[2026-05-15].
https://nvd.nist.gov/vuln/detail/CVE-2024-50264
[16] Linux Kernel Organization. vmsplice(2) - Linux manual page[EB/OL]. (2025-09-21)[2026-05-15].
https://man7.org/linux/man-pages/man2/vmsplice.2.html
[17] BOWLING W. Fragnesia: Linux kernel LPE via XFRM ESP-in-TCP[EB/OL]. (2026-05-13)[2026-05-15].
https://github.com/v12-security/pocs/tree/main/fragnesia
[18] LINUX KERNEL DOCUMENTATION. sk_buff data structure and network packet processing[EB/OL]. (2026)[2026-05-15].
https://docs.kernel.org/networking/skbuff.html
[19] LINUX KERNEL SOURCE TREE. net/core/skbuff.c - skb_try_coalesce() implementation[EB/OL]. (2026-05-13)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/core/skbuff.c
[20] LINUX KERNEL SOURCE TREE. include/linux/skbuff.h - SKBFL_SHARED_FRAG flag definition[EB/OL]. (2026-05-07)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/skbuff.h
[21] LINUX KERNEL SOURCE TREE. include/linux/skbuff.h - SKBFL_SHARED_FRAG flag definition[EB/OL]. (2026-05-07)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/skbuff.h
[22] BOWLING W. [PATCH net] net: skbuff: preserve shared-frag marker during coalescing[EB/OL]. (2026-05-13)[2026-05-15].
https://lore.kernel.org/netdev/20260513041635.1289541-1-vakzz@zellic.io/
[23] BOWLING W. [PATCH net] net: skbuff: preserve shared-frag marker during coalescing[EB/OL]. (2026-05-13)[2026-05-15].
https://lore.kernel.org/netdev/20260513041635.1289541-1-vakzz@zellic.io/
[24] BOWLING W. [PATCH net] net: skbuff: preserve shared-frag marker during coalescing[EB/OL]. (2026-05-13)[2026-05-15].
https://lore.kernel.org/netdev/20260513041635.1289541-1-vakzz@zellic.io/
[25] LINUX KERNEL SOURCE TREE. commit f4c50a4034e6 - xfrm: esp: avoid in-place decrypt on shared skb frags[EB/OL]. (2026-05-07)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f4c50a4034e6
[26] LINUX KERNEL SOURCE TREE. net/ipv4/tcp_ulp.c - TCP ULP (Upper Layer Protocol) framework[EB/OL]. (2026)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/ipv4/tcp_ulp.c
[27] LINUX KERNEL DOCUMENTATION. ESP-in-TCP (espintcp) - IPsec ESP over TCP connections[EB/OL]. (2026)[2026-05-15].
https://docs.kernel.org/networking/epsintcp.html
[28] LINUX KERNEL SOURCE TREE. commit cef401de7be8 - net: fix possible wrong checksum generation[EB/OL]. (2013-10-28)[2026-05-15].
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cef401de7be8
[29] Google Project Zero. 0-day in the Wild: CVE-2021-0920[EB/OL]. (2021-11)[2026-05-15].
https://googleprojectzero.github.io/0days-in-the-wild/0day-RCAs/2021/CVE-2021-0920.html
[30] CVE-2021-0920漏洞分析(中文)[EB/OL]. (2023-05-10)[2026-05-15].
https://bsauce.github.io/2023/05/10/CVE-2021-0920/
[31] KIM H. Dirty Frag: Linux kernel LPE via xfrm-ESP and rxrpc page-cache write[EB/OL]. (2026-05-07)[2026-05-15].
https://github.com/V4bel/dirtyfrag
[32] KIM H. oss-security - Dirty Frag disclosure[EB/OL]. (2026-05-07)[2026-05-15].
https://www.openwall.com/lists/oss-security/2026/05/07/8
[33] CVE-2022-29582详细分析[EB/OL]. (2022-08-05)[2026-05-15].
https://ruia-ruia.github.io/2022/08/05/CVE-2022-29582-io-uring/
[34] Wiz Vulnerability Database. CVE-2022-29582[EB/OL]. (2022-04)[2026-05-15].
https://www.wiz.io/vulnerability-database/cve/cve-2022-29582
[35] Wiz Vulnerability Database. CVE-2022-3028[EB/OL]. (2022-09)[2026-05-15].
https://www.wiz.io/vulnerability-database/cve/cve-2022-3028
[36] openEuler. CVE-2022-3028追踪[EB/OL]. (2022)[2026-05-15].
https://gitee.com/src-openeuler/kernel/issues/I5OPA4
[37] CVE-2022-2602漏洞分析(中文)[EB/OL]. (2023-06-08)[2026-05-15].
https://bsauce.github.io/2023/06/08/CVE-2022-2602/
[38] CVE-2022-2602内核提权详细分析[EB/OL]. (2022-10)[2026-05-15].
https://idocdown.com/app/articles/blogs/detail/15354
[39] oss-security. CVE-2022-4378 disclosure[EB/OL]. (2022-Q4)[2026-05-15].
https://seclists.org/oss-sec/2022/q4/178
[40] ZENG K. CVE-2022-4378原始报告[EB/OL]. (2022-12-09)[2026-05-15].
https://www.openwall.com/lists/oss-security/2022/12/09/1
[41] Google Security Research. CVE-2023-31436 PoC and vulnerability documentation[EB/OL]. (2023-05)[2026-05-15].
https://github.com/google/security-research/blob/master/pocs/linux/kernelctf/CVE-2023-31436_mitigation/docs/vulnerability.md
[42] CVE-2023-31436漏洞分析(中文)[EB/OL]. (2023-05)[2026-05-15].
https://idocdown.com/app/articles/blogs/detail/8187
[43] THE REGISTER. Dirty Frag gets a sequel as Fragnesia hands Linux attackers root-level access[EB/OL]. (2026-05-14)[2026-05-15].
https://www.theregister.com/security/2026/05/14/dirty-frag-gets-a-sequel-as-fragnesia-hands-linux-attackers-root-level-access/5240270
[44] THEORI. Copy Fail: 732 Bytes to Root on Every Major Linux Distribution[EB/OL]. (2026-04-29)[2026-05-15].
https://xint.io/blog/copy-fail-linux-distributions
[45] National Vulnerability Database. CVE-2026-31431[EB/OL]. (2026-04-22)[2026-05-15].
https://nvd.nist.gov/vuln/detail/CVE-2026-31431
[46] AI JOURNAL. Theori Wins $1.5 Million Prize at DARPA’s AI Cyber Challenge[EB/OL]. (2025-08-11)[2026-05-15].
https://aijourn.com/theori-wins-1-5-million-prize-at-darpas-ai-cyber-challenge/
[47] Linux Kernel Organization. splice(2) - Linux manual page[EB/OL]. (2025-09-20)[2026-05-15].
https://man7.org/linux/man-pages/man2/splice.2.html