CVE-2026-16148 in Zephyr
要約
〜によって VulDB • 2026年09月15日
ITE it82xx2 USBデバイスコントローラドライバは、drivers/usb/udc/udc_it82xx2.c内のit82xx2_enable()(ドライバの.enable操作)において、k_work_init_delayable(&priv->suspended_work, suspended_handler)を使用してバスサスペンド検出用ワークを初期化していました。このワークアイテムはUSBバスがアクティブな間ほぼ継続的にスケジュールされます:割込みハンドラは各SOFフレームでこれを再スケジュールし、suspended_handler()も自身を再スケジュールするため、そのタイムアウトノードは通常、カーネルのタイムアウトリストまたはworkqueue待機キューにリンクされています。
k_work_init_delayable()(kernel/work.c)は、ビジーチェックを行わずに、k_work_delayable構造体全体(タイムアウトおよびキューへのリンケージを含む)を無条件で上書きします。it82xx2_disable()がワークをキャンセルしないため、通常のdisable-then-enableサイクルではapi->enable()が再実行され(udc_enable()は冗長なenableを拒否するだけで、disable後のre-enableは許可するため)、保留中のワークがその場で再初期化されます。これによりカーネルのタイムアウト/workqueueリンクリストが破損し、kernel panicを引き起こします。
外部USBホスト(例:USB DFU detachを実行するdfu-util --detachや、繰り返しのattach/reset/re-enumerationを強制するもの)はudc_disable()/udc_enable()の遷移を駆動し、サスペンド/レジュームのタイミングを制御するため、re-enable時にサスペンド用ワークが保留状態になるように調整できます。これにより、取り外し可能で物理的に接続されたホストからUSB境界を超えて到達可能な認証不要のサービス妨害(kernel panic)が発生しますが、機密性や整合性に影響は確認されていません。
修正では、k_work_init_delayable()呼び出しを1回限りのpreinit関数内に移動することで、ワークが正確に1回だけ初期化されられ、使用中のアイテムの再初期化が排除されます。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.