CVE-2026-31429
net: skb: 修复 KFENCE 分配的 skb 头部跨缓存释放问题
- 已发布
- 2026年4月20日
- 已更新
- 2026年5月11日
- 分配 CNA
- Linux
- 观察到的证据
- 2026年8月25日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H低 · 未来 30 天
- 百分位
- 17.9%
- 型号日期
- 2026年9月21日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
在 Linux 内核中,已解决以下漏洞:net: skb: 修复 KFENCE 分配的 skb 头部的跨缓存释放问题 SKB_SMALL_HEAD_CACHE_SIZE 被有意设置为非 2 的幂值(例如在 x86_64 上为 704),以避免与通用 kmalloc 桶大小发生冲突。这确保了 skb_kfree_head() 能够可靠地使用 skb_end_offset 来区分从 skb_small_head_cache 分配的 skb 头部与从通用 kmalloc 缓存分配的 skb 头部。 然而,当启用 KFENCE 时,kfence_ksize() 返回的是精确请求的分配大小,而不是 slab 桶大小。如果调用者(例如 bpf_test_init)通过 kzalloc() 分配 skb 头部数据,且请求的大小恰好等于 SKB_SMALL_HEAD_CACHE_SIZE,那么 slab_build_skb() -> ksize() 会返回该精确值。在减去 skb_shared_info 开销后,skb_end_offset 最终与 SKB_SMALL_HEAD_HEADROOM 匹配,导致 skb_kfree_head() 错误地将对象释放到 skb_small_head_cache,而不是释放回原始的 kmalloc 缓存,从而造成 slab 跨缓存释放: kmem_cache_free(skbuff_small_head): Wrong slab cache. Expected skbuff_small_head but got kmalloc-1k 通过始终在 skb_kfree_head() 中调用 kfree(head) 来修复此问题。这保持了释放路径的通用性,并避免了对 KFENCE 对象的分配器特定误分类。
来源
1# CVE-2026-31429 的 PoC(Linux 内核 >= 6.3 < 6.12.82 Slab 跨缓存混淆)—— 由 Antonius - w1sdom - bluedragonsec.com 发现的漏洞
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。