Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-31429-POC — # CVE-2026-31429 的 PoC(Linux 内核 >= 6.3 < 6.12.82 Slab 跨缓存混淆)—— 由 Antonius - w1sdom - bluedragonsec.com 发现的漏洞 | Kitploit
工具/GitHubGitHub/bluedragonsecurity/cve-2026-31429-poc
漏洞分析漏洞利用学习与教育二进制利用
GitHubbluedragonsecurity/cve-2026-31429-poc

CVE-2026-31429-POC

# CVE-2026-31429 的 PoC(Linux 内核 >= 6.3 < 6.12.82 Slab 跨缓存混淆)—— 由 Antonius - w1sdom - bluedragonsec.com 发现的漏洞

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
14个月前尚未审核
分享

CVE-2026-31429 — Linux 内核:通过 bpf_prog_test_run_skb 对 KFENCE 分配的 SKB 头部进行跨缓存释放

严重性: 中危(CWE-763:释放无效指针或引用)
发布时间: 2026-04-20
受影响子系统: net/core/skbuff.c — skb_kfree_head()
研究人员: Antonius / w1sdom — Blue Dragon Security
联系方式: [email protected]
Lore 线程: https://lore.kernel.org/netdev/CAK8a0jxC5L5N7hq-DT2_NhUyjBxrPocoiDazzsBk4TGgT1r4-A@mail.gmail.com/


可能的安全影响

  • 缓解措施绕过
  • 禁用 LSM
  • 内核 rootkit 植入
  • 容器逃逸
  • 拒绝服务

概述

本仓库包含 CVE-2026-31429 的概念验证代码(非可利用漏洞利用,仅为 POC),这是 Linux 内核网络协议栈中的一个 slab 跨缓存混淆漏洞。当启用 KFENCE 且调用者(特别是 net/bpf/test_run.c 中的 )通过 分配一个大小恰好等于 的 SKB 头部缓冲区时,该漏洞即被触发。由于 KFENCE 的精确大小报告语义,内核的 函数错误地将对象释放回 而非原始的 缓存,从而破坏 slab 元数据。

bpf_test_init
kzalloc()
SKB_SMALL_HEAD_CACHE_SIZE
skb_kfree_head()
skb_small_head_cache
kmalloc-1k

受影响版本

状态范围
受影响Linux >= 6.3(由 bf9f1baa279f 引入)
不受影响< 6.3
已修复>= 6.12.82
已修复>= 6.18.23
已修复>= 6.19.13
已修复>= 7.0(主线,提交 0f42e3f4fe2a)

该漏洞由提交 bf9f1baa279f("net: add dedicated kmem_cache for typical/small skb->head")引入,该提交添加了 skb_small_head_cache 以及 skb_kfree_head() 中的条件释放逻辑。


根因分析

背景:skb_small_head_cache 设计意图

SKB_SMALL_HEAD_CACHE_SIZE 被有意设置为非 2 的幂的值(例如 x86_64 上为 704 字节),以避免与通用 kmalloc 桶大小(始终为 2 的幂:512、1024、...)冲突。skb_kfree_head() 中的启发式逻辑利用这一唯一性,仅通过 skb_end_offset 来路由释放操作:

root@kitploit:~
// net/core/skbuff.c(存在漏洞 — 修复前)
static void skb_kfree_head(void *head, unsigned int end_offset)
{
    if (end_offset == SKB_SMALL_HEAD_HEADROOM)
        kmem_cache_free(net_hotdata.skb_small_head_cache, head);
    else
        kfree(head);
}
  • end_offset == SKB_SMALL_HEAD_HEADROOM → 假定来自 skb_small_head_cache → kmem_cache_free()
  • 否则 → 通用 kfree()

该启发式逻辑仅在正常 slab 语义下是可靠的,此时 ksize() 返回桶大小(704 字节请求对应 1024),该值永远不会等于 SKB_SMALL_HEAD_CACHE_SIZE。

KFENCE 例外

KFENCE(Kernel Electric-Fence)拦截部分内核分配并从带守卫页的内存中提供服务。其关键行为差异在于:kfence_ksize() 返回精确的请求大小,而非 slab 桶大小。

易受攻击的调用链

root@kitploit:~
BPF_PROG_TEST_RUN  (系统调用 321,cmd BPF_PROG_TEST_RUN=10)
  └─> __sys_bpf()
        └─> bpf_prog_test_run_skb()
              └─> bpf_test_init()
                    └─> kzalloc(size, GFP_USER)
                    │       size == SKB_SMALL_HEAD_CACHE_SIZE (x86_64 上为 704)
                    │       KFENCE 拦截 → 对象从 kmalloc-1k 区域提供
                    │
                    └─> slab_build_skb(data, NULL, size)
                          └─> ksize(data)
                                └─> kfence_ksize()   ← 返回 704(精确值!)
                          └─> skb_end_offset
                                = ksize(data) - sizeof(skb_shared_info)
                                = 704 - 320
                                = 384
                                = SKB_SMALL_HEAD_HEADROOM  ← 错误匹配!

  [在 SKB 释放路径上:]
  └─> sk_skb_reason_drop()
        └─> skb_release_data()
              └─> skb_free_head()
                    └─> skb_kfree_head(head, skb->end)
                          └─> (end_offset == SKB_SMALL_HEAD_HEADROOM) == TRUE
                                └─> kmem_cache_free(skb_small_head_cache, head)
                                      ↑ 漏洞:head 来自 kmalloc-1k,而非 skb_small_head_cache!
                                      → warn_free_bad_obj() → SLUB 损坏

为什么 skb_end_offset = 384?

在 x86_64 上:

root@kitploit:~
SKB_SMALL_HEAD_CACHE_SIZE  = 704 字节
sizeof(skb_shared_info)    = 320 字节
SKB_SMALL_HEAD_HEADROOM    = 704 - 320 = 384

当 KFENCE 拦截 704 字节的 kzalloc() 时,kfence_ksize() 精确返回 704。该算术运算产生 skb_end_offset = 384 = SKB_SMALL_HEAD_HEADROOM,满足 skb_kfree_head() 中的条件 — 从而触发错误的释放路径。

修复方案

由 Jiayuan Chen 提交(Eric Dumazet 审阅,Jakub Kicinski 合并)的上游修复完全消除了该启发式逻辑:

root@kitploit:~
// net/core/skbuff.c(已修复)
static void skb_kfree_head(void *head, unsigned int end_offset)
{
    kfree(head);   // 始终使用通用释放;两种情况均适用
}

kfree() 对于 kmalloc 分配的内存和 skb_small_head_cache 分配的内存都是安全的,因为不再需要对 skb_small_head_cache 调用 kmem_cache_free() — 通用 kfree() 通过 slab 页的 kmem_cache 指针在内部解析正确的缓存。


dmesg 输出(复现证据)

复现程序(repro_bpf.c)在 QEMU 环境(i440FX,BIOS 1.17.0-debian)中的 Linux 7.0.0-rc5 上运行。观察到以下内核 WARNING 级联:

root@kitploit:~
[ 3065.322973] ------------[ cut here ]------------
[ 3065.322990] kmem_cache_free(skbuff_small_head, ffff888186d6e000): object belongs to different cache kmalloc-1k
[ 3065.323005] WARNING: mm/slub.c:6258 at warn_free_bad_obj+0x91/0xc0, CPU#0: repro_bpf/2167
[ 3065.323061] CPU: 0 UID: 0 PID: 2167 Comm: repro_bpf Not tainted 7.0.0-rc5 #1 PREEMPT(lazy)
[ 3065.323098] RIP: 0010:warn_free_bad_obj+0x98/0xc0
...
[ 3065.323231] Call Trace:
[ 3065.323247]  skb_free_head+0x1ec/0x290
[ 3065.323267]  skb_release_data+0x7a6/0x9d0
[ 3065.323308]  bpf_prog_test_run_skb+0x14f8/0x3410
[ 3065.323510]  __sys_bpf+0x769/0x4b60
[ 3065.323763]  __x64_sys_bpf+0x78/0xc0
[ 3065.323794]  do_syscall_64+0x111/0x690
[ 3065.323813]  entry_SYSCALL_64_after_hwframe+0x77/0x7f

每次触发会产生 4 个独立的 splat:

  1. warn_free_bad_obj — 主要跨缓存释放检测(mm/slub.c:6258)
  2. depot_fetch_stack — 栈仓库池索引越界(lib/stackdepot.c:506),出现在 Allocated 跟踪中
  3. stack_depot_print — 检测到损坏的句柄(lib/stackdepot.c:780)
  4. depot_fetch_stack + stack_depot_print — 相同配对在 Freed 跟踪中重复出现

该级联表明对象的 SLUB 跟踪元数据(alloc_track / free_track)引用了在错误缓存释放后损坏的栈仓库句柄。


复现程序

前提条件

root@kitploit:~
内核:  Linux >= 6.3,编译时启用:
           CONFIG_KFENCE=y
           CONFIG_BPF_SYSCALL=y
           CONFIG_NET_SCH_INGRESS=y  (或任何支持 SCHED_CLS 的驱动程序)
           CONFIG_SLUB_DEBUG=y       (用于可见的 warn_free_bad_obj)
           CONFIG_STACKDEPOT=y       (用于完整级联)

权限:root(uid=0)— BPF_PROG_LOAD 所需

构建

root@kitploit:~
gcc -O2 -o cve-2026-31429-poc-only cve-2026-31429-poc-only.c

运行

root@kitploit:~
sudo ./cve-2026-31429-poc-only
root@kitploit:~
dmesg | grep -E "warn_free_bad_obj|Wrong slab cache|cross-cache"

触发机制

该 PoC 加载一个最小的 3 指令 BPF 程序(类型 BPF_PROG_TYPE_SCHED_CLS):

root@kitploit:~
ld_imm64 r0, 0    ; 2 条指令(宽)
exit              ; 1 条指令

然后调用 BPF_PROG_TEST_RUN(cmd=10),参数为:

  • data_size_in = 284 字节的 Syzkaller 派生数据包数据
  • flags = BPF_F_TEST_RUN_ON_CPU (0x4) — 将执行固定到 CPU 0
  • repeat = 4
  • 随后循环额外调用 50 次以提高可靠性

284 字节的输入数据使 bpf_test_init 的分配路径请求的缓冲区大小等于 SKB_SMALL_HEAD_CACHE_SIZE,从而概率性地命中 KFENCE 拦截窗口。


修复提交

提交树合并者日期
0f42e3f4fe2a主线Jakub Kicinski2026-04-06
60313768a8edlinux-stableGreg Kroah-Hartman2026-04-18
2d64618ea846linux-stableGreg Kroah-Hartman2026-04-18
474e00b935dblinux-stableGreg Kroah-Hartman2026-04-18

签名链: Jiayuan Chen → Reviewed-by Eric Dumazet (Google) → Jakub Kicinski → Greg Kroah-Hartman
报告者署名: Antonius <[email protected]> 出现在全部 4 个提交中
引入者: bf9f1baa279f("net: add dedicated kmem_cache for typical/small skb->head")


参考资料

  • NVD / CVE 条目:https://www.cve.org/CVERecord?id=CVE-2026-31429
  • 上游补丁(主线):https://git.kernel.org/stable/c/0f42e3f4fe2a58394e37241d02d9ca6ab7b7d516
  • Stable 6.12.x:https://git.kernel.org/stable/c/60313768a8edc7094435975587c00c2d7b834083
  • Stable 6.18.x:https://git.kernel.org/stable/c/2d64618ea846d8d033477311f805ca487d6a6696
  • Stable 6.19.x:https://git.kernel.org/stable/c/474e00b935db250cac320d10c1d3cf4e44b46721
  • Lore 报告:https://lore.kernel.org/netdev/CAK8a0jxC5L5N7hq-DT2_NhUyjBxrPocoiDazzsBk4TGgT1r4-A@mail.gmail.com/
  • Blue Dragon Security:https://bluedragonsec.com

仓库内容

root@kitploit:~
.
├── README.md         		    — 本文件
├── cve-2026-31429-poc-only.c       — 仅概念验证(非可利用漏洞利用)
└── dmesg.txt                       — 成功复现的原始内核 splat

披露时间线

日期事件
~2026 年初通过 Syzkaller 模糊测试在 Linux 7.0-rc5 上发现漏洞
2026-04-03Jiayuan Chen 编写补丁,Reported-by 署名 Antonius
2026-04-06主线提交 0f42e3f4fe2a 由 Jakub Kicinski 合并
2026-04-18Greg Kroah-Hartman 合并稳定版回溯(6.12.x、6.18.x、6.19.x)
2026-04-20CVE-2026-31429 发布

作者

Antonius(昵称:w1sdom)
创始人兼高级研究员 — Blue Dragon Security
印度尼西亚
[email protected]


法律声明

本 PoC 在上游补丁可用后发布,仅供教育和研究目的使用。请勿在非您所有或未经明确许可的系统上使用。作者对滥用行为不承担任何责任。

下载工具