CVE-2026-99207 in Linux
要約
〜によって VulDB • 2026年10月28日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
scsi: target: delayed_cmd_lock保持中に割り込みを無効化する
target_do_delayed_work()は、plainなspin_lock()を使用してdev->delayed_cmd_lockを取得します。この関数はsystem_percpu_wqから実行されるため、ロックが保持されている間も割り込みが有効になったままになります。そのロックの他のすべての取得箇所(target_core_transport.c内のtarget_handle_task_attr()およびtransport_complete_ordered_sync()、ならびにtarget_core_device.c内のtarget_non_ordered_release())ではspin_lock_irqsave()を使用しています。
この構成は、transport_complete_task_attr()の呼び出し元がすべてプロセスコンテキストで実行されていた間は安全でした:target_completion_wqからのtarget_complete_ok_work()、dev->qf_work_queueからのtransport_complete_qf()、およびsubmit/executeパスからのtransport_generic_request_failure()です。
しかし、コミット06933066d88a(「scsi: target: バックエンドコンテキストからコマンドを完了するサポートを追加」)以降、この状況はもはや真ではありません。fabricでdirect_compl_suppが設定されcomplete_type=1の場合、target_complete()はバックエンドの完了コンテキスト内でinlineにtarget_complete_ok_work()を実行します。これはtarget_complete_cmd_with_sense()によって「割り込みコンテキストから呼び出される可能性がある」と文書化されています。iblockの場合、これはbio end_ioに対応します。
target_complete_ok_work()はtransport_complete_task_attr()で始まり、ここでdelayed_cmd_lockが2つの方法で取得されます:
- 全てのORDEREDコマンドはtarget_handle_task_attr()によってdev->delayed_cmd_listに追加され、そこからtarget_do_delayed_work()によってディスパッチされ、SCF_TASK_ORDERED_SYNCとしてマークされます。したがって、その完了処理はtransport_complete_ordered_sync()を経由します。 - ORDEREDコマンドが保留中である間に完了するSIMPLEコマンドは、殺されたdev->non_orderedへの最後の参照を解放し、percpu_ref_put()によってtarget_non_ordered_release() completing contextで実行されます。
両方ともロックを取得し、待機中のコマンドがある場合はschedule_work(&dev->delayed_cmd_work)を呼び出し、これはsystem_percpu_wq(つまり完了処理を行ったCPU)にキューイングされます。同じキューに対するその後の完了も通常そこに配信されるため、ワークがロックを保持している間に到着した完了は、永遠にロックの待機状態(spin)になります。
この事象が発生するにはcomplete_type=1が必要であり、これはデフォルトではありません(direct_compl_suppを持つ唯一のfabricであるvhost-scsiではTARGET_QUEUE_COMPLがデフォルトです)。また、I/O割り込みコンテキストから完了するバックエンドと、イニシエータからのORDEREDコマンドが必要です。Linux virtio_scsiゲストはVIRTIO_SCSI_S_SIMPLEのみを送信し、順序付けパス(ordered path)を使用しません;vhost-scsiが受け入れるORDEREDタスク属性を使用する任意のゲストはこれを行います。
target_do_delayed_work()はワークアイテムであり、常にプロセスコンテキストで実行されるため、spin_lock_irq()で十分です。
点検により発見されました;ランタイムレポートはありません。単一のORDEREDコマンドが両方のロック取得処理を経由するため、CONFIG_PROVE_LOCKING有効時では、直接完了を通じて完了する最初のロック取得は、delayed_cmd_lockの不整合なロック状態レポート(バックエンドの完了場所に応じてhardirqまたはsoftirq)を生成します。
VulDB is the best source for vulnerability data and more expert information about this specific topic.