CVE-2026-22979CVE-2026-22979是Linux内核中的一个内存泄漏漏洞,存在于networking子系统的skb_segment_list函数中。该漏洞发生在处理GRO(Generic Receive Offload)引擎聚合的数据包分段时。问题源于commit ed4cccef64c1对GRO引擎的修改,该修改改变了fraglist条目的孤立方式(将skb->sk设置为NULL),但未同步更新skb_segment_list()中的truesize会计逻辑。攻击者可利用此漏洞通过发送特制的GRO聚合数据包触发内存泄漏,导致sk_wmem_alloc保持非零状态,阻止socket正常销毁,最终造成系统内存持续消耗。该漏洞需要本地低权限访问,CVSS评分5.5,属于中危漏洞。
漏洞核心在于skb_segment_list()函数的truesize会计处理逻辑不一致。具体来说:1) 历史代码设计假设分段需要独立的socket内存会计,因此会从父SKB转移truesize到新创建的段;2) commit ed4cccef64c1改变了行为,确保fraglist条目被显式孤立(skb->sk = NULL),使整个socket内存charge保留在head SKB;3) 但skb_segment_list()中的会计逻辑未同步更新,仍在无条件地将每个fragment的truesize添加到delta_truesize并从父SKB中减去;4) 由于fragments不再向socket收费,这种减法导致内存计数不足。攻击者可通过构造SKB_GSO_FRAGLIST类型的GSO数据包,在数据包转发过程中触发skb_segment_list()调用,利用kmemleak可观察到未释放的socket对象。修复方案移除不必要的truesize调整,但保留skb_release_head_state()调用以正确处理SKB扩展的引用计数。