PoC Exploit Released for Use-After-Free Vulnerability in Linux Kernel POSIX CPU Timers
2025/12/22 gbhackers — Linux kernel の POSIX CPU Timer におけるコンカレント (並列) 処理に関連する深刻な脆弱性が、詳細な PoC エクスプロイトの公開により明らかになった。この脆弱性は、Android デバイスを標的とする極めて高度かつ洗練されたカーネル・エクスプロイトの一つとして位置付けられる。 CVE-2025-38352 は、Linux kernel の POSIX CPU Timer 実装に存在する解放後メモリ使用 (use-after-free) の欠陥に起因する。この欠陥は以前、実環境において限定的かつ標的型の攻撃インシデントとして報告されていた。現在、セキュリティ研究者は、この脆弱性のメカニズムを実証する完全動作の概念実証を公開している。

この脆弱性は、CPU スケジューラの進行中に期限済みのタイマーを処理する、handle_posix_cpu_timers() カーネル関数に存在する。深刻な問題が発生するのは、タスクがゾンビ状態 (スレッド終了後に、親プロセスが終了ステータスを収集する前に発生するプロセス状態) に移行する際である。
技術的なエクスプロイトメカニズム
この攻撃で悪用されるのは、2つの重要なカーネル操作間に生じる競合状態である。 handle_posix_cpu_timers() が起動中のタイマーを収集した後にロックを解放すると、攻撃者はゾンビタスクの回収とタイマー削除を同時に実行できる。その結果として、カーネルはタイマー構造体へのアクセス中に RCU (Read-Copy-Update) メカニズムを介して該当構造体を解放させ、それが典型的な解放後メモリ使用 (use-after-free) シナリオを引き起こす。
この脆弱性を悪用するには、極めて正確なタイミング調整が必要となる。最初に、子プロセスが生成するのは、POSIX CPU Timer がゾンビ状態に移行した直後に発動する非メインスレッドである。その一方で、ptrace 経由で制御される親プロセスは、子プロセスが timer_delete() を呼び出すのと同時にゾンビスレッドを回収する。 このコンカレント・ウィンドウが成立すると、handle_posix_cpu_timers() 内で既に解放されたタイマー構造体へのアクセスが発生し、カーネル・メモリ破損を引き起こす。
注目すべき点として、この脆弱性は 32 ビット Android デバイスのみに影響する。最新の 64 ビット Linux kernel および x86 アーキテクチャには、エクスプロイトを防止する CONFIG_POSIX_CPU_TIMERS_TASK_WORK 設定オプションが含まれている。前述のとおり、この保護を欠くのは 32 ビット ARM デバイスのみであるため、エクスプロイトの対象は特定の Android 実装に限定される。
このテストで必要となるのは、カーネル・バージョン 6.12.33 (最新の脆弱な LTS)/マルチ CPU 構成/KASAN 検出の無効化といった慎重な環境設定である。研究者たちが確認したのは、KASAN の有無にかかわらずエクスプロイトが成功し、明確なクラッシュ・シグネチャが生成されることである。
PoC エクスプロイトの詳細
現時点の PoC エクスプロイトは、ptrace アタッチによる親子プロセス調整/バリアを用いたマルチスレッド同期/CPU アフィニティ固定を組み合わせて構成されている。このエクスプロイトは、適切に構成されたシステムにおいて約 50% の成功率を達成している。セキュリティ研究者 Faraz は、競合状態を誘発する手法の有効性が実証されたと述べている。
脆弱性の悪用による痕跡は、KASAN が検出したスラブ解放後メモリ使用書き込み、および send_sigqueue() 内で発生するカーネル警告として確認される。いずれもカーネル構造体内部でメモリ破損が生じていることを示すものだ。
現段階の PoC は概念実証レベルに留まるが、クロス・キャッシュ・ヒープ悪用技術により権限昇格へ発展する可能性を、研究者は指摘している。つまり、割り込みコンテキスト内で限定的に発生するコンカレント・ウィンドウの拡張は、防御側にとって大きな技術的課題となる。
すでに Linux kernel コミュニティは、パッチを展開している。影響を受けるシステムの管理者に強く推奨されるのは、緩和策が実装されたカーネル・バージョンへの優先的なアップデートである。
この問題の原因は、プログラムが複数の処理を同時に行う並列処理の途中で、データの管理が追いつかなくなる競合状態の発生にあります。タイマーを処理するカーネルの機能がデータを読み取っている最中に、そのデータが、別の処理によりメモリから削除されてしまうことで、すでに解放されたはずのメモリを無理に Read/Write しようとする状態が生まれてしまいます。特に古い32ビットのAndroidデバイスなどは、最新のカーネルが持っている保護機能が備わっていないため、このタイミングのズレを突かれやすくなっています。よろしければ、Linux Kernel での検索結果も、ご参照ください。
You must be logged in to post a comment.