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

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

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

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

工具目录

分类

查看所有分类
Loading categories
cve-2026-52910-poc — CVE-2026-52910 的竞态复现与压力测试工具包,该漏洞是 Linux 内核 reuseport cBPF 选择器程序中的释放后使用漏洞,附带 dmesg 和泄漏检查。 | Kitploit
工具/GitHubGitHub/yolkfull/cve-2026-52910-poc
防御工具漏洞分析漏洞利用模糊测试论文与研究二进制利用
GitHubyolkfull/cve-2026-52910-poc

cve-2026-52910-poc

CVE-2026-52910 的竞态复现与压力测试工具包,该漏洞是 Linux 内核 reuseport cBPF 选择器程序中的释放后使用漏洞,附带 dmesg 和泄漏检查。

查看仓库
20小时13分前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-52910 — reuseport cBPF 释放后使用复现器

CI

针对 CVE-2026-52910 的竞态复现器与压力测试工具包。该漏洞是 Linux 内核在处理 经典 BPF(cBPF)reuseport 选择器程序时出现的释放后使用(UAF),上游已通过提交 "bpf: Free reuseport cBPF prog after RCU grace period" 修复。

CVECVE-2026-52910
类型释放后使用 / 越界读取(CWE-125),CVSS 3.1 7.8 HIGH AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
引入版本v4.5(随 reuseport cBPF 支持引入)
修复版本5.10.259、5.15.210、6.1.176、6.6.143、6.12.94、6.18.36、7.0.13(stable);主线 v7.1
上游报错BUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock(net/core/sock_reuseport.c:596)
报告者Eulgyu Kim

[!WARNING] 这是一个内核压力测试工具。 在存在漏洞的内核上,它会故意 扩大释放后使用竞态窗口;一旦命中可能导致机器崩溃或损坏。 请仅在您拥有或获得明确授权测试的机器上运行 (测试虚拟机、一次性 CI 机器),切勿在生产系统上运行。

一分钟看懂该漏洞

SO_REUSEPORT 允许多个套接字绑定同一个 UDP 端口;对于每个 传入数据包,内核在 reuseport_select_sock()(net/core/sock_reuseport.c)中 从组内选择一个套接字。一个组可以安装一个 选择器程序——通过 setsockopt(SO_ATTACH_REUSEPORT_CBPF) 附加的经典 BPF 程序—— 它按数据包决定组内哪个套接字接收该数据包。该程序在 RX 软中断(网络 接收处理)中、RCU 读侧临界区内执行。

漏洞在于:当程序通过 setsockopt() (reuseport_attach_prog() / reuseport_detach_prog())被替换或分离时,旧的 cBPF 程序 会被 sk_reuseport_prog_free() 立即释放,而没有等待 正在进行的 RCU 读者。仍在遍历已释放程序指令的 CPU 会读取已释放的 vmalloc 内存:

root@kitploit:~
sequenceDiagram
    autonumber
    participant C as CPU0 — churner thread
    participant K as setsockopt() path
    participant R as CPU1 — RX softirq

    R->>R: rcu_read_lock()
    R->>R: prog = rcu_dereference(reuse->prog)
    C->>K: setsockopt(SO_ATTACH_REUSEPORT_CBPF, progB)
    K->>K: swap progA → progB
    K->>K: sk_reuseport_prog_free(progA)
    Note right of K: unfixed kernels: bpf_prog_free()<br/>runs NOW — no RCU grace period
    R->>R: execute progA->insns (run_bpf_filter)
    Note right of R: progA was already freed<br/>KASAN: vmalloc-out-of-bounds
    Note over K: fix: call_rcu(sk_reuseport_prog_free_rcu) —<br/>free deferred by one RCU grace period

eBPF 选择器路径(SO_ATTACH_REUSEPORT_EBPF)不受影响:它 已经通过延迟的 bpf_prog_put() 阶段释放程序。该修复 对 cBPF 路径做了同样处理——在释放旧程序前等待一个 RCU 宽限期。

上游 KASAN 报告(在 7.0 调试内核上):

root@kitploit:~
BUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock+0xedc/0x1220
Read of size 4 at addr ffffc9000051e004 by task slowme/10208
 net/core/sock_reuseport.c:596

本仓库内容

快速开始

在 Linux 测试机上:

root@kitploit:~
$ make
$ sudo ./run_hammer.sh 600        # 10-minute run
...
== result: RC=0 (0 clean / 1 setup / 2 splat / 3 leak / 4 integrity) ==

要求:

  • 一台可以崩溃的 Linux 测试机(虚拟机或裸机)。强烈建议使用启用 KASAN 的内核——没有 KASAN,竞态命中可能完全 不被察觉。
  • gcc 和 bash。
  • 包装脚本的检查需要 root(dmesg、/proc/vmallocinfo、sysctl); hammer 本身以非特权身份运行(上游复现以 UID 1000 运行)。
  • 空闲机器:后台流量和其他 BPF 使用者会给 泄漏检查增加噪声。
  • hammer 从 21000 开始绑定 UDP 端口(每个 reuseport 组一个端口)—— 请确保这些端口空闲。

预期结果:

  • 存在漏洞的内核——dmesg 中出现 KASAN 报错 → RC=2;偶尔 hammer 的完整性检查会先触发 → RC=4。
  • 已修复的内核——干净运行,RC=0,bpf_prog vmalloc 计数稳定。

竞态窗口非常小(释放与正在进行的 RX 执行之间),因此单次 干净运行不能作为结论。真正的测试应运行数小时,例如:

root@kitploit:~
$ sudo ./run_hammer.sh 86400 512 8 16 4 127.0.0.1 0

hammer:reuseport_race_hammer

root@kitploit:~
$ ./reuseport_race_hammer [dur_sec] [insns] [nports] [nsocks] [nsenders] [ip] [ebpf]

每个组运行一个 churner 线程,在紧密循环中通过 setsockopt() 切换和分离 cBPF 选择器,同时 sender 线程向该组洪泛 64 字节 UDP 数据报,接收方统计每个套接字的投递情况。

运行阶段(T = dur_sec):

root@kitploit:~
time ──────────────────────────────────────────────────────────────►
 [0 ──────────── T-15s)   [T-15s ── T-10s)   [T-10s ─────────── T]
       CHURN + FLOOD             SETTLE               MEASURE
 churner swaps/detaches    churn frozen,       deterministic program
 the selector prog at      final program       (selects the LAST
 max rate under full       attached             socket): EVERY packet
 UDP flood — THE           (selects LAST        must land on the LAST
 race window open          socket)              socket; snapshot A →
                                               run → snapshot B

完整性检查: 在测量阶段,最终程序会确定性地 选择组内最后一个套接字。如果该窗口内组接收到的数据包 没有全部落在该套接字上,说明选择出错(即使没有 KASAN, 也可能是 UAF 的影响)→ 退出码 2。

hammer 退出码:0 通过 · 1 设置/运行时错误 · 2 完整性警告。

run_hammer.sh — 单次运行包装脚本

运行 hammer 并添加使单次运行有意义的检查:

  1. 快照 /proc/vmallocinfo 中的 bpf_prog 分配计数;
  2. 提高 net.core.optmem_max,使数 KB 的 cBPF 程序能干净地附加;
  3. 运行 hammer;
  4. 等待 DRAIN(默认 30 秒),让 RCU/workqueue 延迟释放完成;
  5. 扫描 dmesg 中的新报错(BUG:、Oops:、WARNING:、RIP:、 leaked、stuck);
  6. 比较运行前后的 bpf_prog vmalloc 计数(泄漏检查),并 可选扫描 kmemleak(如果 /sys/kernel/debug/kmemleak 存在)。

退出码:0 干净 · 1 设置错误(包括 hammer 设置失败)· 2 观察到内核报错 · 3 可能存在 bpf_prog 泄漏 · 4 hammer 完整性 警告。

livepatch_cycle.sh — livepatch 生命周期测试

该修复从 call_rcu() 回调中释放旧的 cBPF 程序。如果您将 该修复作为 livepatch(内核热补丁——将代码补丁到 运行中的内核)发布,回调函数本身位于补丁模块中:在回调仍 待处理时回退/卸载,会在回调脚下释放模块代码。此脚本在 hammer 保持竞态窗口活跃的同时执行应用/回退循环,并监视 /sys/kernel/livepatch/*/transition 和 dmesg。

root@kitploit:~
$ MODE=rcu ./livepatch_cycle.sh 20 120    # 20 cycles × 120s hammer each
模式行为
cycle(默认)应用 → 回退,两者都在持续 hammer 负载下进行
rcu在最大切换压力下立即回退——上述危险场景
safe

退出码:0 干净 · 1 命令失败 · 2 报错或转换卡住 · 4 hammer 完整性警告。

CI

CI 使用两组编译标志构建 hammer,并对脚本运行 shellcheck。 内核运行时测试有意不在共享 CI runner 上运行:复现器需要 控制 runner 的内核版本(而且在存在漏洞的内核上可能导致 runner oops)。请在真实测试机上运行这些测试。

参考资料

  • NVD 记录:https://nvd.nist.gov/vuln/detail/CVE-2026-52910
  • 修复:bpf: Free reuseport cBPF prog after RCU grace period — stable 回移: 08264d5bba0b, 18fc650ccd7d, 298db6167f81, 87dfb977bdb6, 90e47dc5c572, c3e3fddda6b5, f8b8f1d4bb76, fec41484e7c2
  • Red Hat 跟踪:https://bugzilla.redhat.com/show_bug.cgi?id=2490779

许可证

GPL-2.0-only — 见 LICENSE。

下载工具
文件用途
reuseport_race_hammer.c复现器:多线程 hammer,在满 UDP 负载下不断切换 cBPF 选择器,然后验证投递完整性。
run_hammer.sh单次运行包装脚本:提高 net.core.optmem_max,运行 hammer,然后检查 dmesg 中的报错、/proc/vmallocinfo 中泄漏的 bpf_prog 分配,并可选检查 kmemleak。
livepatch_cycle.sh在 hammer 运行期间应用/回退携带修复的 livepatch——用于搜寻基于 call_rcu() 的修复在 livepatch 生命周期中的隐患。
Makefile构建 hammer。
.github/workflows/ci.ymlCI:构建 + shellcheck(不进行运行时内核测试;见 CI)。
参数默认值含义
dur_sec300(最小 45)总运行秒数
insns256被切换的 cBPF 程序中的填充指令数;程序越大,被命中的已释放区域越大。如果附加失败并返回 ENOMEM,请提高 net.core.optmem_max(包装脚本会为您处理)。
nports4(最大 64)reuseport 组数(每组一个 UDP 端口,从 21000 开始)
nsocks8(最大 512)每组套接字数
nsenders4(最大 32)每组 UDP 发送线程数
ip127.0.0.1目标地址;使用物理网卡 IP 可将 RX 软中断分散到多个 CPU(RSS)
ebpf01 = 同时切换 SO_ATTACH_REUSEPORT_EBPF 的附加/分离(需要 CAP_BPF/CAP_NET_ADMIN);该路径不存在漏洞,此选项用于对比/覆盖
环境变量默认值含义
HAMMER./reuseport_race_hammerhammer 二进制文件
DRAIN30运行后检查前等待的秒数
OPTMEM_MAX131072net.core.optmem_max 的值;0 = 不修改
停止 hammer → 休眠 GRACE(默认 30 秒,一个宽限期)→ 回退
环境变量默认值含义
APPLY_CMD / REVERT_CMDkpatch load $PATCH / kpatch unload $PATCHlivepatch 命令
PATCH./livepatch-reuseport.ko补丁模块
HAMMER./reuseport_race_hammerhammer 二进制文件
HAMMER_ARGS256 4 8 4 127.0.0.1 0hammer 参数
TRANSITION_TIMEOUT60等待 livepatch 转换的最长秒数
GRACE30MODE=safe 的宽限期休眠秒数
FORCE01 = 即使未检测到 livepatch 转换也运行