Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/yolkfull/cve-2026-52910-poc
防御ツール脆弱性分析エクスプロイトファジング論文と研究バイナリエクスプロイト
GitHubyolkfull/cve-2026-52910-poc

cve-2026-52910-poc

CVE-2026-52910(reuseport cBPFセレクタプログラムにおけるLinuxカーネルのuse-after-free)向けのレース再現およびストレステストツールキット。dmesgとリークチェック機能付き。

リポジトリを見る
113320日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-52910 — reuseport cBPF use-after-free 再現ツール

CI

CVE-2026-52910 のレース再現ツール兼ストレステストツールキットです。これは Linux カーネルの classic BPF (cBPF) reuseport セレクタプログラム の処理における use-after-free (UAF) であり、アップストリームではコミット "bpf: Free reuseport cBPF prog after RCU grace period" で修正されています。

CVECVE-2026-52910
種別Use-after-free / 範囲外読み取り (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); mainline v7.1
アップストリームの splatBUG: KASAN: vmalloc-out-of-bounds in reuseport_select_sock (net/core/sock_reuseport.c:596)
報告者Eulgyu Kim

[!WARNING] これはカーネルストレステストツールです。 脆弱なカーネル上では use-after-free のレースウィンドウを意図的に広げます。ヒットすると マシンがクラッシュしたり破損したりする可能性があります。 自分が所有するマシン、または明示的にテストを許可されたマシン (テスト用 VM、使い捨ての CI マシン) でのみ実行し、本番システムでは 決して実行しないでください。

バグを1分で理解する

SO_REUSEPORT は多数のソケットが同じ UDP ポートにバインドすることを可能にします。受信パケットごとに、カーネルは reuseport_select_sock() (net/core/sock_reuseport.c) でグループ内のソケットを1つ選択します。グループにはセレクタプログラム — setsockopt(SO_ATTACH_REUSEPORT_CBPF) でアタッチされる classic BPF プログラム — をインストールでき、これがパケットごとにグループ内のどのソケットがそれを受け取るかを決定します。このプログラムは RCU 読み取り側クリティカルセクション内の RX softirq (ネットワーク受信処理) で実行されます。

バグ: プログラムが setsockopt() (reuseport_attach_prog() / reuseport_detach_prog()) で置き換えられたりデタッチされたりすると、古い cBPF プログラムは sk_reuseport_prog_free() によって即座に解放され、実行中の RCU リーダーを待ちません。解放されたプログラムの命令をまだ辿っている CPU は、解放済みの vmalloc メモリを読み取ります:

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 パスにも同じ扱いを与えます — 古いプログラムが解放される前に1回の RCU グレースピリオドを置きます。

アップストリームの KASAN レポート (7.0 デバッグカーネル上):

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

このリポジトリの内容

ファイル目的
reuseport_race_hammer.c再現ツール: 完全な UDP 負荷の下で cBPF セレクタを撹拌するマルチスレッドハンマー。その後、配信の完全性を検証します。
run_hammer.sh1回実行用ラッパー: net.core.optmem_max を引き上げ、ハンマーを実行し、dmesg の splat、/proc/vmallocinfo のリークした bpf_prog アロケーション、オプションで kmemleak をチェックします。
livepatch_cycle.shハンマーの実行中に修正を搭載した livepatch を適用/復元します — call_rcu() ベースの修正の livepatch ライフサイクルハザードを追跡します。
Makefileハンマーをビルドします。
.github/workflows/ci.ymlCI: ビルド + shellcheck (カーネルランタイムテストはなし。CI を参照)。

クイックスタート

Linux テストマシン上で:

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

要件:

  • クラッシュさせてもよい Linux テストマシン (VM またはベアメタル)。KASAN 有効なカーネルを強く推奨します — KASAN なしでは、レースヒットが完全に見逃される可能性があります。
  • gcc と bash。
  • ラッパーのチェック (dmesg、/proc/vmallocinfo、sysctl) には root 権限。ハンマー自体は非特権で実行されます (アップストリームの再現は UID 1000 で実行されました)。
  • アイドル状態のマシン: バックグラウンドトラフィックや他の BPF ユーザーはリークチェックにノイズを加えます。
  • ハンマーは 21000 から始まる UDP ポートをバインドします (reuseport グループごとに1ポート) — それらが空いていることを確認してください。

期待される結果:

  • 脆弱なカーネル — dmesg に KASAN splat → RC=2。時折、ハンマーの完全性チェックが先に発火 → RC=4。
  • 修正済みカーネル — クリーンな実行、RC=0、安定した bpf_prog vmalloc カウント。

レースウィンドウは非常に小さい (解放 vs. 実行中の RX 実行) ため、1回のクリーンな実行は結論を出せないものとして扱ってください。実際のテストでは数時間実行します。例:

$ sudo ./run_hammer.sh 86400 512 8 16 4 127.0.0.1 0

ハンマー: reuseport_race_hammer

$ ./reuseport_race_hammer [dur_sec] [insns] [nports] [nsocks] [nsenders] [ip] [ebpf]
引数デフォルト意味
dur_sec300 (最小 45)総実行秒数
insns256撹拌される cBPF プログラム内のフィラー命令。プログラムが大きいほど、ヒットする解放領域が大きくなります。アタッチが ENOMEM で失敗する場合は、net.core.optmem_max を引き上げてください (ラッパーがこれを代行します)。
nports4 (最大 64)reuseport グループ (それぞれ 21000 から1つの UDP ポート)
nsocks8 (最大 512)グループあたりのソケット数
nsenders4 (最大 32)グループあたりの UDP 送信スレッド数
ip127.0.0.1ターゲットアドレス。物理 NIC の IP を使用すると RX softirq を CPU 間に分散できます (RSS)
ebpf01 = SO_ATTACH_REUSEPORT_EBPF のアタッチ/デタッチも撹拌します (CAP_BPF/CAP_NET_ADMIN が必要)。このパスは脆弱ではありません。これは比較/カバレッジ用です

各グループは、タイトループで setsockopt() を介して cBPF セレクタを交換・デタッチする churner スレッドを1つ実行し、sender スレッドがグループに 64 バイトの UDP データグラムをフラッディングし、レシーバーがソケットごとの配信をカウントします。

実行フェーズ (T = dur_sec):

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。

ハンマーの終了コード: 0 PASS · 1 セットアップ/ランタイムエラー · 2 完全性 WARN。

run_hammer.sh — 1回実行用ラッパー

ハンマーを実行し、1回の実行を意味あるものにするチェックを追加します:

  1. /proc/vmallocinfo の bpf_prog アロケーションカウントをスナップショットします。
  2. 数 KB の cBPF プログラムがクリーンにアタッチされるよう net.core.optmem_max を引き上げます。
  3. ハンマーを実行します。
  4. RCU/ワークキューの遅延解放が完了するまで DRAIN (デフォルト 30 秒) 待ちます。
  5. dmesg に新しい splat (BUG:、Oops:、WARNING:、RIP:、leaked、stuck) がないかスキャンします。
  6. bpf_prog vmalloc カウントを前後で比較し (リークチェック)、/sys/kernel/debug/kmemleak が存在する場合はオプションで kmemleak をスキャンします。
環境変数デフォルト意味
HAMMER./reuseport_race_hammerハンマーバイナリ
DRAIN30実行後、チェック前に待機する秒数
OPTMEM_MAX131072net.core.optmem_max の値。0 = 変更しない

終了コード: 0 クリーン · 1 セットアップエラー (ハンマーのセットアップ失敗を含む) · 2 カーネル splat 検出 · 3 bpf_prog リークの可能性 · 4 ハンマー完全性 WARN。

livepatch_cycle.sh — livepatch ライフサイクルテスト

この修正は call_rcu() コールバックから古い cBPF プログラムを解放します。修正を livepatch (カーネルライブパッチ — 実行中のカーネルにコードをパッチする) として配布する場合、コールバック関数自体がパッチモジュール内に存在します。コールバックがまだ保留中の間に復元/アンロードすると、コールバックの足元でモジュールテキストが解放されます。このスクリプトは、ハンマーでレースウィンドウをホットに保ちながら適用/復元サイクルを実行し、/sys/kernel/livepatch/*/transition と dmesg を監視します。

$ MODE=rcu ./livepatch_cycle.sh 20 120    # 20 cycles × 120s hammer each
モード動作
cycle (デフォルト)適用 → 復元、どちらも持続的なハンマー負荷の下で
rcu最大撹拌時に即座に復元 — 上記のハザードケース
safeハンマーを停止 → GRACE スリープ (デフォルト 30 秒、1グレースピリオド) → 復元
環境変数デフォルト意味
APPLY_CMD / REVERT_CMDkpatch load $PATCH / kpatch unload $PATCHlivepatch コマンド
PATCH./livepatch-reuseport.koパッチモジュール
HAMMER./reuseport_race_hammerハンマーバイナリ
HAMMER_ARGS256 4 8 4 127.0.0.1 0ハンマーの引数
TRANSITION_TIMEOUT60livepatch トランジションを待つ最大秒数
GRACE30MODE=safe のグレースピリオドスリープ
FORCE01 = livepatch トランジションが検出されなくても実行

終了コード: 0 クリーン · 1 コマンド失敗 · 2 splat またはスタックしたトランジション · 4 ハンマーからの完全性 WARN。

CI

ツールをダウンロード