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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-38352-PoC — CVE-2025-38352のトリガーを支援するPoCおよびGDBスクリプト | Kitploit
ツール/GitHubGitHub/longwasu/cve-2025-38352-poc
メモリフォレンジック脆弱性分析エクスプロイトリバースエンジニアリングデバッガ論文と研究学習と教育バイナリエクスプロイト
GitHublongwasu/cve-2025-38352-poc

CVE-2025-38352-PoC

CVE-2025-38352のトリガーを支援するPoCおよびGDBスクリプト

リポジトリを見る
7時間7分前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2025-38352: Linux カーネル POSIX CPU タイマー TOCTOU 競合状態と UAF

CVE-2025-38352 の再現可能な概念実証 (PoC) および自動化された GDB オーケストレーションスクリプトです。これは Linux カーネルの POSIX CPU タイマーサブシステム (kernel/time/posix-cpu-timers.c) における Time-of-Check to Time-of-Use (TOCTOU) 競合状態であり、Use-After-Free (UAF) を引き起こします。

免責事項: 本プロジェクトは教育、防御、およびセキュリティ研究のみを目的としています。すべてのテストと再現は、隔離された ARM64 QEMU 仮想マシン内で実施されました。


🧠 バグの仕組み

  1. プロセス A が子プロセス B を生成します。

  2. プロセス B は CPU タイマーを作成し、終了を開始してゾンビ状態に入ります。B が終了しようとしているまさにその時、その CPU コアにタイマー割り込みが到着します。カーネルはタイマーを処理するために割り込みコンテキストに入りますが、デッドロックを避けるために一時的にロックを解放します (unlock_task_sighand)。

  3. まったく同じ時刻に別のコアで、プロセス A が終了中の B を回収 (reap) し、そのシグナルハンドラをクリーンアップ (sighand = NULL) して PID をアンハッシュします。

  4. B の別のスレッドがタイマー削除 (posix_cpu_timer_del) を呼び出します。そのスレッドは PID を介してタスクを検索し、シグナルハンドラを確認しようとしますが、それらはすでにクリーンアップされている / NULL であることを発見します。タスクが完全に死んでおり、タイマーが発火する可能性はないと誤解し、安全であると仮定してメモリからタイマーを解放します。

  5. その間、最初のコアのタイマー割り込みハンドラが再開し、期限切れのタイマーを発火させます。ステップ 4 でタイマーがちょうど解放されたため、それにアクセスすると Use-After-Free が発生し、カーネルがクラッシュします。


🔬 同期戦略 (poc_gdb_script.py)

QEMU の GDB スタブは set non-stop on をサポートしていないため (1 つの vCPU を停止するとすべての vCPU が停止します)、標準的なマルチスレッド同期を単純なブレークポイントで実現することはできません。

本リポジトリは インメモリ命令パッチング によってこの問題を解決します:

  1. ステージ 1 (CPU バリア):

    • 4 つの重要なカーネル関数にブレークポイントを配置します:
      • exit_notify (CPU 2)
      • kernel_wait4 (CPU 0)
      • __arm64_sys_timer_delete (CPU 1)
      • handle_posix_cpu_timers (CPU 2)
    • 各 vCPU がランデブーポイントに到達すると、GDB はその $pc を ARM64 の自己分岐オペコード 0x14000000 (b . 無限ループ) でパッチし、実行を再開します。
    • 4 つの vCPU すべてが正確な位置で固定されると、GDB は元の命令を復元し、実行をステージ 2 に引き渡します。
  2. ステージ 2 (順次オーケストレーション):

    • GDB はスケジューラをロックし (set scheduler-locking on)、各 vCPU を順番に前進させます:
      • ステップ 1 (CPU 2): handle_posix_cpu_timers を unlock_task_sighand() の先へ進めます。
      • ステップ 2 (CPU 0): kernel_wait4 を の先へ進めます。

🚀 再現方法

1. ターゲットカーネルソースのダウンロード

コミット 1bf1aa362e6b9573a310fcd14f35bc875b42ba83 の Android Common Kernel ソースツリーをダウンロードまたはクローンします:

root@kitploit:~
# Option A: Download tarball directly
curl -LO https://android.googlesource.com/kernel/common/+archive/1bf1aa362e6b9573a310fcd14f35bc875b42ba83.tar.gz
mkdir -p kernel-cve && tar -xzf 1bf1aa362e6b9573a310fcd14f35bc875b42ba83.tar.gz -C kernel-cve
cd kernel-cve

# Option B: Clone repository
git clone https://android.googlesource.com/kernel/common
cd common
git checkout 1bf1aa362e6b9573a310fcd14f35bc875b42ba83

2. run_posix_cpu_timers() のパッチを元に戻す

kernel/time/posix-cpu-timers.c を開き、関数 run_posix_cpu_timers() (およそ 1435~1448 行目) を探し、パッチ行をコメントアウトします:

root@kitploit:~
void run_posix_cpu_timers(void)
{
    struct task_struct *tsk = current;

    lockdep_assert_irqs_disabled();

    /*
     * Ensure that release_task(tsk) can't happen while
     * handle_posix_cpu_timers() is running. Otherwise, a concurrent
     * posix_cpu_timer_del() may fail to lock_task_sighand(tsk) and
     * miss timer->it.cpu.firing != 0.
     */
//  if (tsk->exit_state)
//      return;

3. CONFIG_POSIX_CPU_TIMERS_TASK_WORK を無効化する

注記: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y の場合、CPU タイマーはタイマー IRQ ではなく task_work コンテキストから実行されるため、この競合状態を回避します。したがって、脆弱性を再現するにはこれを無効にする必要があります。

CONFIG_POSIX_CPU_TIMERS_TASK_WORK は上流の Kconfig にプロンプト文字列がないため、デフォルトで y になり、menuconfig で直接切り替えることができません。次のようにして公開できます:

  1. kernel/time/Kconfig (およそ 56 行目) で、プロンプト文字列を追加し、デフォルトを変更します:
    root@kitploit:~
    config POSIX_CPU_TIMERS_TASK_WORK
        bool "POSIX CPU timers task work"
        default n
    
  2. デフォルト設定を生成し、オプションを無効化します:
    root@kitploit:~
    ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig
    scripts/config --disable POSIX_CPU_TIMERS_TASK_WORK
    ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make olddefconfig
    
  3. .config で無効になっていることを確認します:
    root@kitploit:~
    grep POSIX_CPU_TIMERS_TASK_WORK .config
    # Expected output: # CONFIG_POSIX_CPU_TIMERS_TASK_WORK is not set
    

4. カーネルのビルド

ARM64 カーネルイメージをコンパイルします:

root@kitploit:~
time ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j$(nproc) Image

5. ユーザ空間 PoC のコンパイル

poc.c をクロスコンパイルします:

root@kitploit:~
aarch64-linux-gnu-gcc -ggdb3 ./poc.c -o poc

6. GDB スタブ付きで QEMU を起動

4 つの vCPU (-smp 4) で QEMU 仮想マシンを起動し、GDB スタブ (-s フラグ、ポート 1234) を有効にします:

root@kitploit:~
qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57 \
    -smp 4 \
    -m 2G \
    -kernel arch/arm64/boot/Image \
    -append "console=ttyAMA0 root=/dev/vda oops=panic panic_on_warn=1" \
    ... \
    -s

7. GDB をアタッチしてスクリプトを実行

ホストのターミナルから、GDB を QEMU にアタッチし、オーケストレーションスクリプトをロードします:

root@kitploit:~
gdb-multiarch vmlinux
pwndbg> target remote :1234
pwndbg> source poc_gdb_script.py
pwndbg> continue

8. 脆弱性のトリガー

QEMU ゲストのシェル内で、コンパイル済みバイナリを実行します:

root@kitploit:~
./poc

[!TIP] タイミングとトラブルシューティング:
対象スレッドがゾンビ状態に到達する前にタイマーが早まって発火した場合、GDB は次のようにログ出力します:

root@kitploit:~
[!] ERROR: handle_posix_cpu_timers fired before exit_state == EXIT_ZOMBIE
  • オプション 1: 単に ./poc を再実行し、GDB スクリプトを数回 source してください。
  • オプション 2: poc.c の TIMER_FIRE_MS を増やし (例: #define TIMER_FIRE_MS 10 から 20 へ)、poc.c を再コンパイルして再度実行してください。これにより、タイマーが期限切れになる前にスレッドが exit_notify() に到達し EXIT_ZOMBIE へ遷移するための追加時間が与えられます。

9. デモ

https://github.com/user-attachments/assets/11481b5c-25f8-46c3-be3a-7b79a06a4948


📚 参考文献

  • Race Against Time in the Kernel Clockwork by StreyPaws
  • CVE-2025-38352 Root Cause Analysis by Faith
ツールをダウンロード
tsk->sighand = NULL
  • ステップ 3 (CPU 1): timer_delete を進めて release_posix_timer() を呼び出させます (sigq を解放)。
  • ステップ 4 (CPU 2): スケジューラロックを解除し、CPU 2 が解放されたタイマーを発火できるようにします $\rightarrow$ クラッシュ!