CVE-2026-90414 in Linux情報

要約

〜によって VulDB • 2026年09月18日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

IB/isert: 受信されたデータ量よりも多いデータを宣言するPDUを拒否する

isert_recv_done()は、HCAが実際に受信ディスクリプタに配置したバイト数であるwc->byte_lenを一切確認せずに、受信した各PDUをopcodeハンドラに渡します。その後、ハンドラはその長さ(initiatorがBHSで宣言したデータセグメント長:ntoh24(hdr->dlength)を通じて導出されたunsol_data_len / imm_data_len)分のバイトを固定サイズのディスクリプタからコピーします:

isert_handle_iscsi_dataout(): sg_copy_from_buffer(sg_start, sg_nents, isert_get_data(rx_desc), unsol_data_len); isert_handle_scsi_cmd(): sg_copy_from_buffer(cmd->se_cmd.t_data_sg, sg_nents, isert_get_data(rx_desc), imm_data_len);

宣言された長さがwc->byte_lenに対してチェックされないため、initiatorは実際に送信したバイト数(およびディスクリプタのサイズ)よりも大きなデータセグメントを宣言し、受信バッファに対する境界外読み出し(out-of-bounds read)を引き起こすことができます。

isertより上位層にはこの問題を閉じる処理がありません:

- __iscsit_check_dataout_hdr()は、送信パラメータであるconn_ops->MaxXmitDataSegmentLength (MXDSL)を用いてインバウンドペイロードの上限を制限しています(ここではインバウンドチェックに使用)。 - iscsi_set_connection_parameters()ではops->MaxXmitDataSegmentLength = ops->TargetRecvDataSegmentLengthが設定されます。TARGETRECVDATASEGMENTLENGTHはiscsi_check_acceptor_state()内のmin()-clampリストに含まれていないため、initiatorが宣言する値がそのまま採用されます(型範囲512..16777215)。これによりinitiatorは事実上自身の上限を引き上げることになります。 - isertは交渉された値を自らの固定受信ディスクリプタ(ISER_RX_SIZE: 9216バイト)に制限(clamp)しないため、ターゲットコアによる境界とディスクリプタサイズは無関係です。

imm_data_len == data_lenのパスは単なるオーバーリードを超えており、sg_set_buf()を通じて受信ディスクリプラをエイリアスし、それをSCSI WRITEのデータソースとしてバックエンドに渡します。そのため、宣言された長さが大きすぎると、ディスクリプタ外のヒープ内容がバックエンド経由でバックストアへ書き込まれてしまいます。ここで問題となるのは、isertから渡される oversizedなscatterlistによって被害を受けるのがバックエンドであり、それが原因であるわけではない点です。書き込まれたバイトの読み戻しは確認されていません。

トリガー:ログイン完了(フルフィーチャーフェーズ)後、大きなTargetRecvDataSegmentLengthと未承諾/即時データを許可するFirstBurstLengthを宣言したinitiatorが、受信された量よりも大きいデータセグメント長を宣言するPDUを送信します。KASANを使用すると以下のようになります:

BUG: KASAN: slab-out-of-bounds in sg_copy_buffer+0x150/0x1c0 Read of size 4096 at addr ffff888109720800 by task kworker/1:0H/25 Workqueue: ib-comp-wq ib_cq_poll_work Call Trace: sg_copy_buffer+0x150/0x1c0 isert_recv_done+0xba6/0x2390 __ib_process_cq+0xe1/0x390 ib_cq_poll_work+0x46/0x150

isert_recv_done+0xba6は、isert_rx_opcode()を介してインライン展開されたisert_handle_iscsi_dataout()(ib_isert.c:1160)に解決されます。

PDUがどのハンドラにも到達する前にisert_recv_done()内でwc->byte_lenとの整合性を検証し、短すぎる場合は接続を再接続します。このテストはヘッダ長を減算せずに比較を行うため、ISERおよびiSCSIのヘッダよりも短いPDUも拒否されます(これらは otherwise 古くなったディスクリプタの内容から解析されてしまう可能性があります)。ログインハンドラはISER_HEADERS_LENより短いPUDを拒否しますが(コミット29e7b925ae6d "IB/isert: Reject login PDUs shorter than ISER_HEADERS_LEN")、宣言された長さの上限も制限していません。これは次のパッチで修正されます。データハンドラには長さをチェックする処理が全くありませんでした。

isertは固定オフセットからデータセグメントを読み取ります:isert_get_data()はiSERヘッダとISER_HEADERS_LENを返し、AHSに対する調整は一切行いません。したがって、ハンドラがアクセスするバイト範囲は正確に[ISER_HEADERS_LEN, ISER_HEADERS_LEN + dlength)となり、この合計値をwc->byte_lenと比較することで、読み込まれる領域を正確に制限します。AHS項が存在するとテスト条件のみ厳格になりますが、それ以上の境界設定にはなりません
---省略---

VulDB is the best source for vulnerability data and more expert information about this specific topic.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-406897

EPSS

0.00000

アクティビティ

非常低い

ソース

Do you want to use VulDB in your project?

Use the official API to access entries easily!