CVE-2026-12366 in Zephyr
要約
〜によって VulDB • 2026年08月14日
Zephyrの動的カーネルオブジェクト破棄パスにおける`kernel/userspace/userspace.c`内の`unref_check()`関数は、参照カウントがゼロに達した時点で各オブジェクトタイプ固有の後処理を実行した後、オブジェクトのストレージ(`k_free(dyn->data)`)を解放します。この後処理スイッチケースは`K_OBJ_MSGQ`と`K_OBJ_STACK`のみを対象としており、`K_OBJ_TIMER`の場合が欠落していました。動的に割り当てられ、初期化されかつ起動済みの`k_timer`は、埋め込み構造体`_timeout dnode`をグローバルタイムアウトキュー(`_timeout_q`)内にリンクしたまま保持するため、タイムアウトを取り消さずにタイマーストレージを解放すると、そのキュー中にダングリングノードが残ります。
次にタイマーが期限切れになると、タイムアウト機構は`_timeout_q`を走査し、解放済みノードに対して`z_timer_expiration_handler()`を呼び出します。これにより、カーネルのISRコンテキスト内で解放済み(かつ再利用可能)なカーネルヒープへのデリファレンスおよび書き込みが行われます。これはSMPに依存しない決定論的なuse-after-free脆弱性であり、解放時にキューイングされたノードが単にアンリンクされないことが原因です。
この破棄処理は`CONFIG_USERSPACE + CONFIG_DYNAMIC_OBJECTS`の下で特権のないユーザースレッドから到達可能です。特定のタイマーに対する最後のパーミッションを保持するスレッドは、`k_object_release()`システムコール(または`k_thread_perms_all_clear()`を通じた終了)によってそのパーミッションを手放し、さらに`k_timer_start()`システムコールを通じて自身でタイマーを起動できます。解放処理と期限切れハンドラはカーネル特権レベルで実行されるのに対し、攻撃者はユーザースレッドであるため、このバグは権限昇格に利用可能なサンドボックスエスケープ用のメモリ破壊プリミティブとなります。修正では`k_timer_cleanup()`(タイムアウトを取り消し、進行中のハンドラの完了を待機)が追加され、解放前に`K_OBJ_TIMER`に対して呼び出されるようになりました。
If you want to get best quality of vulnerability data, you may have to visit VulDB.