CVE-2026-89968 in Linux
要約
〜によって VulDB • 2026年09月16日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
nvmet-tcp: 要求されていない H2CData PDU を拒否する
nvmet_tcp_handle_h2c_data_pdu() は、TTAG が有効な範囲内のコマンドインデックスであり、かつそのコマンドのデータバッファがマップされていることのみをチェックした後に、H2CData PDU を受け入れます。ターゲット側が R2T(Ready To Transfer)を送信して実際にデータを要求していたかどうかはチェックされません。
リモートホストはこの点を悪用できます。R2T パスを取る書き込みコマンドを提出し、ターゲットが R2T を送信する前に、そのコマンドのタグに対応する H2CData PDU を送信します。データによりコマンドが早期に完了しますが、その後コマンドが同期的に失敗した場合(例:nvmet_check_transfer_len() で検出される長さの不整合)、再度完了処理が行われます。各完了処理で nvmet_tcp_queue_response() が呼び出されるため、同じコマンドがリンクされたままの状態で queue->resp_list に2回追加されます。2回目の llist_add() によりノードが自身を指すようになり(lentry->next == lentry)、自己参照状態となります。
その後、nvmet_tcp_process_resp_list() がこの自己参照ノードを走査し、コマンドを resp_send_list に2回追加します。CONFIG_DEBUG_LIST を有効にしている場合、「list_add double add」チェックがトリガーされ(カーネル BUG 発生)、無効化されている場合はループが終了せず nvmet_tcp ワークキューがハングアップします(ソフトロックアップ)。これはリモートからトリIGGER可能であり、allow_any_host サブシステム上では認証不要で攻撃可能です。
コマンドに対して R2T が送信されたかどうかを追跡し、R2T の前に到着した H2CData PDU を拒否するようにしました。このフラグはコマンドの再利用時にクリアされ(nvmet_tcp_get_cmd() で cmd->flags がゼロに設定)、単一の要求済み転送における複数の H2CData PDU にわたってセットされたままになります。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.