LinuxカーネルのPOSIX CPUタイマーにおけるUse-After-Free脆弱性のPoCエクスプロイトが公開

LinuxカーネルのPOSIX CPUタイマーに存在する重大な競合状態(レースコンディション)脆弱性が、詳細な概念実証(PoC)によって明らかになりました。これはAndroid端末を標的とするカーネルエクスプロイトの中でも、最も高度なものの一つです。

CVE-2025-38352は、LinuxカーネルのPOSIX CPUタイマー実装におけるuse-after-free(UAF)脆弱性を示します。

この欠陥は以前、現実世界のAndroid環境において、限定的かつ標的型の悪用が行われているとして報告されていました。

今回、セキュリティ研究者が脆弱性の仕組みを示す完全に動作する概念実証を公開しました。

脆弱性は、CPUスケジューラのティック中に発火したタイマーを処理するカーネル関数 handle_posix_cpu_timers() に存在します。

重大な欠陥は、タスクがゾンビ状態へ遷移する際に発生します。ゾンビ状態とは、スレッドが終了した後、親プロセスがその終了ステータスを回収する前に生じるプロセス状態です。

技術的な悪用メカニズム

この攻撃は、2つの重要なカーネル操作間のレースコンディションを悪用します。

handle_posix_cpu_timers() が発火したタイマーを収集した後にロックを解放すると、攻撃者は同時にゾンビタスクを回収してタイマーを削除でき、カーネルがアクセス中であるにもかかわらず、RCU(Read-Copy-Update)機構を介してタイマー構造体を解放してしまいます。これにより典型的なuse-after-freeの状況が生まれます。

悪用には精密なタイミング調整が必要です。子プロセスは、スレッドがゾンビ状態へ遷移した直後に即時発火するよう設定されたPOSIX CPUタイマーを持つ、メインではないスレッドを作成します。

親プロセスはptrace経由で動作し、子プロセスが同時に timer_delete() を呼び出す間に、ゾンビスレッドを回収します。

レースの勝利条件を満たすと、解放済みのタイマーが handle_posix_cpu_timers() 内で参照され、カーネルメモリの破損を引き起こします。

注目すべき点として、この脆弱性は32ビットのAndroid端末のみに影響します。最新の64ビットLinuxカーネルおよびx86アーキテクチャには、悪用を阻止する CONFIG_POSIX_CPU_TIMERS_TASK_WORK 設定オプションが含まれています。

この保護がないのは32ビットARM端末のみであり、エクスプロイトが特定のAndroid実装に限定されている理由が説明できます。

テストには慎重な環境設定が必要です。カーネルバージョン6.12.33(脆弱なLTSの最新)、マルチCPU構成、そしてKASAN検出の無効化が求められます。

研究者は、カーネルアドレスサニタイザの有無の両方で悪用成功を示し、それぞれ異なるクラッシュシグネチャを生成しました。

概念実証(PoC)の詳細

動作するPoCは、ptraceアタッチによる親子プロセスの協調、バリアを用いたマルチスレッド同期、そしてCPUアフィニティの固定を組み合わせています。

このエクスプロイトは、適切に構成されたシステムで約50%の成功率を達成し、レースコンディションのトリガ手法を検証しています。これはセキュリティ研究者Farazにより報告されています。

セキュリティ上の影響は、KASANが検出するslab-use-after-free書き込みや、 send_sigqueue() におけるカーネル警告として現れます。いずれもカーネル構造体内でのメモリ破損が成功していることを示します。

現時点のPoCは概念実証の域を大きく出ないものの、研究者は、クロスキャッシュヒープ悪用技術による権限昇格の可能性を指摘しています。

ただし、割り込みコンテキスト内における限られたレースウィンドウを拡張することには、工学的な課題があります。

Linuxカーネルコミュニティはすでにパッチを展開しており、影響を受けるシステムは緩和済みのカーネルバージョンへの即時更新を最優先すべきです。

翻訳元: https://gbhackers.com/poc-exploit-released-for-use-after-free-vulnerability-in-linux-kernel/

ソース: gbhackers.com