
CVE-2025-38352 に対する Android カーネルエクスプロイト。以前、実環境(in-the-wild)での悪用が確認されています。脆弱な x86_64 Linux カーネル v5.10.x を標的とします。
Chronomaly は、CVE-2025-38352 を利用した Android / Linux カーネル向けのカーネルエクスプロイトです。このエクスプロイトは Linux カーネル v5.10.157 専用に作成されましたが、特定のカーネルテキストオフセットを必要としないため、影響を受けるすべての v5.10.x カーネルに対して動作するはずです。
この脆弱性については、PoC からエクスプロイトに至るまで、3 部構成のブログ連載で詳しく解説しています。

このエクスプロイトは、QEMU で動作する x86_64 Linux カーネル v5.10.157 でのみテストされています。友人に Pixel 6a のカーネル設定を送ってもらい、それをベースにカーネル設定を作成しました。このエクスプロイトに重要な設定オプションは以下のとおりです(kernelCTF の設定をベースにしています)。
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=nCONFIG_PREEMPT=y (完全プリエンプション、RT なし)CONFIG_SLAB_MERGE_DEFAULT=nDEBUG_LIST=nBUG_ON_DATA_CORRUPTION=nLIST_HARDENED=nCONFIG_POSIX_CPU_TIMERS_TASK_WORK を無効にするには、最初のブログ記事 こちら で説明している手順に従ってください。
QEMU の実行スクリプトについては、qemu.sh ファイルを参照してください。テストには 4 コアと 3 GB の RAM を使用しました。
このエクスプロイトは CPU タイマーに依存しているため、環境に合わせて変更が必要なパラメータが 2 つあります。
CPU_USAGE_THRESHOLDこのパラメータは、race_func() 内で CPU 時間を消費してタイマーを発火させる際に使用されます。次の条件を満たすように設定する必要があります。
CPU_USAGE_THRESHOLD が高すぎると、race_func() スレッドが終了する前にタイマーが発火してしまうため)。タイマーが発火しているかどうかを確認するには、free_func() 内の SIGUSR1 ポーリングコードに printf() ステートメントを挿入します。メッセージが出力されれば、タイマーが発火したことを意味します。
正しく設定されている場合、ターミナルに "Parent raced too late / too early" というメッセージが表示され始めます。
PARENT_SETTIME_DELAY_USPARENT_SETTIME_DELAY_US。このパラメータは、親プロセスが子プロセスと同時に send_sigqueue() 内の 2 番目のレースウィンドウを狙うために使用されます。エクスプロイトを実行して観察し、次のように変更してください。
理想的には、"raced too late" と "raced too early" の両方が出力されるのを確認でき、エクスプロイトは 1 分以内に動作します。どちらか一方が多く発生する場合は、それに応じて調整してください。
クロスキャッシュ実装では、カーネルがそれほどビジーではなく、struct sigqueue の割り当てがそれほど多くないことを前提としていました。これを改善するために必要なことは、sigqueue_crosscache_preallocs() 内のコメントに記載しています。
カーネルが非常にビジーである場合、または per-cpu / per-node のパーシャルリストに struct sigqueue のスラブページが既にいくつか存在する場合、exploit.c の現在のクロスキャッシュ実装は失敗し、uaf_sigqueue / realloc_sigqueue がパイプバッファデータページとして再割り当てされません。
ビジーなカーネルではクロスキャッシュが機能しないように意図的に設計しました。エクスプロイトが悪用されないようにするためです :)
ご質問がある場合は、X / Twitter でお問い合わせください。