Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-31429-POC — # CVE-2026-31429(Linux Kernel >= 6.3 < 6.12.82 Slab Cross-Cache Confusion)のPoC - Antonius - w1sdom - bluedragonsec.com によって発見された脆弱性 | Kitploit
ツール/GitHubGitHub/bluedragonsecurity/cve-2026-31429-poc
脆弱性分析エクスプロイト学習と教育バイナリエクスプロイト
GitHubbluedragonsecurity/cve-2026-31429-poc

CVE-2026-31429-POC

# CVE-2026-31429(Linux Kernel >= 6.3 < 6.12.82 Slab Cross-Cache Confusion)のPoC - 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の無効化
  • カーネルルートキットの埋め込み
  • コンテナの脱出
  • サービス拒否

概要

このリポジトリには、Linuxカーネルのネットワークスタックにおけるスラブクロスキャッシュ混乱バグであるCVE-2026-31429の概念実証(動作するエクスプロイトではなく、POCのみ)が含まれています。このバグは、KFENCEが有効で、呼び出し元(具体的にはの)がと偶然等しいサイズでを介してSKBヘッドバッファを割り当てたときに発生します。KFENCEの正確なサイズ報告セマンティクスにより、カーネルの関数は、オブジェクトを元のキャッシュではなくに誤って解放し、スラブメタデータを破壊します。

net/bpf/test_run.c
bpf_test_init
SKB_SMALL_HEAD_CACHE_SIZE
kzalloc()
skb_kfree_head()
kmalloc-1k
skb_small_head_cache

影響を受けるバージョン

ステータス範囲
影響ありLinux >= 6.3 (bf9f1baa279fで導入)
影響なし< 6.3
修正済み>= 6.12.82
修正済み>= 6.18.23
修正済み>= 6.19.13
修正済み>= 7.0 (mainline、コミット0f42e3f4fe2a)

この脆弱性は、skb_small_head_cacheとskb_kfree_head()の条件付き解放ロジックを追加したコミットbf9f1baa279f("net: add dedicated kmem_cache for typical/small skb->head")によって導入されました。


根本原因分析

背景: skb_small_head_cacheの設計意図

SKB_SMALL_HEAD_CACHE_SIZEは、一般的なkmallocバケットサイズ(常に2のべき乗: 512、1024、...)との衝突を避けるために、意図的に2のべき乗ではない値(例: x86_64では704バイト)に設定されています。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()

このヒューリスティックは、ksize()がバケットサイズ(704バイトの要求に対して1024)を返す通常のスラブセマンティクス下でのみ有効であり、これはSKB_SMALL_HEAD_CACHE_SIZEと等しくなることはありません。

KFENCEの例外

KFENCE(Kernel Electric-Fence)は、カーネル割り当ての一部をインターセプトし、ガードページ付きメモリから提供します。その重要な動作の違い: kfence_ksize()は正確な要求サイズを返し、スラブバケットサイズではありません。

脆弱な呼び出しチェーン

root@kitploit:~
BPF_PROG_TEST_RUN  (syscall 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()は、スラブページの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

WARNINGカスケードは、トリガーごとに4つの個別のスプラットを生成します:

  1. warn_free_bad_obj — 主要なクロスキャッシュ解放検出 (mm/slub.c:6258)
  2. depot_fetch_stack — Allocated追跡でスタックデポプールインデックスが範囲外 (lib/stackdepot.c:506)
  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バイトの入力データは、要求されたバッファサイズがSKB_SMALL_HEAD_CACHE_SIZEと等しくなるようにbpf_test_initの割り当てパスを実行し、確率的にKFENCEインターセプトウィンドウにヒットします。


修正コミット

コミットツリーマージ者日付
0f42e3f4fe2amainlineJakub 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
Reported-byクレジット: 全4コミットでAntonius <[email protected]>
導入コミット: bf9f1baa279f ("net: add dedicated kmem_cache for typical/small skb->head")


参考文献

  • NVD / CVEエントリ: https://www.cve.org/CVERecord?id=CVE-2026-31429
  • アップストリームパッチ (mainline): 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                       — 再現成功時の生のカーネルスプラット

開示タイムライン

日付イベント
~2026年初頭Linux 7.0-rc5でのSyzkallerファジングによりバグを発見
2026-04-03Jiayuan Chenがパッチを作成、Reported-byクレジットはAntonius
2026-04-06Jakub Kicinskiがmainlineコミット0f42e3f4fe2aをマージ
2026-04-18Greg Kroah-Hartmanがstableバックポートをマージ (6.12.x、6.18.x、6.19.x)
2026-04-20CVE-2026-31429公開

著者

Antonius (ニックネーム: w1sdom)
創設者 & シニアリサーチャー — Blue Dragon Security
インドネシア
[email protected]


法的免責事項

このPoCは、アップストリームパッチが利用可能になった後に教育および研究目的で公開されています。所有していないシステム、または明示的なテスト許可がないシステムでは使用しないでください。著者は誤用に対する責任を負いません。

ツールをダウンロード