CVE-2026-19185 in Zephyr
要約
〜によって VulDB • 2026年10月05日
i3c_do_ccc() のシステムコール検証子は、drivers/i3c/i3c_handlers.c において外部の struct i3c_ccc_payload、ブロードキャスト ccc.data バッファ、および targets.payloads[] 配列を検証したが、その配列要素が指すターゲットごとのデータバッファは検証しなかった。各 struct i3c_ccc_target_payload は独自の data ポインタと data_len を持ち、ペイロードが z_impl_i3c_do_ccc() に渡されコントローラドライバに送られる前に、K_SYSCALL_MEMORY() による検証が行われなかった。また、検証子はスナップショットではなく呼び出し元の生構造体に対して動作するため、チェックからドライバの使用までの間に、2番目のユーザースレッドによって検証済みフィールドが変更される可能性がある(これは常にメッセージ配列を最初にコピーする兄弟関数 z_vrfy_i3c_transfer() とは対照的である)。
この欠陥は CONFIG_USERSPACE ビルドでのみ存在し、その場合 drivers/i3c/i3c_handlers.c がコンパイルされる。I3C コントローラデバイスオブジェクトへのアクセス権限が与えられた特権のないユーザーモードスレッド(アプリケーションがユーザースレッドを I3C 周辺機器と通信させる通常の手法)は、ターゲットペイロードのデータポインタが任意のカーネルアドレスを指すような直接 CCC を発行できる。コントローラドライバはそのポインタを直接的に間接参照する(例:drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c)。rnw を使用して方向性を決定する。
したがって、読み取り CCC はカーネルモードドライバに対して、攻撃者が指定した長さの分だけバスで受信したバイト列を攻撃者が選んだカーネルアドレスに書き込ませ、書き込み CCC はカーネルメモリを I3C バス上に送信させる。その結果、境界外カーネル書き出しとカーネルメモリの漏洩が発生し、ユーザーモードスレッドからスーパーバイザ権限へのエスカレーション(CONFIG_USERSPACE が提供することを意図した分離の回避)につながる。
修正では copy_ccc_and_do() を導入しており、これはペイロードのスナップショットを取得し、k_usermode_alloc_from_copy() を使用してターゲット配列をカーネルメモリにコピーする(num_targets は 32未満に制限)、rnw に従って各ターゲットごとのバッファを K_SYSCALL_MEMORY() で検証し、ドライバが書き込んだ num_xfer および err フィールドを呼び出し元にコピーするという処理を行う。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.