CVE-2026-89533 in Linux情報

要約

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

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

svcrdma: read_chunk_rangeにおけるオフセット演算のバグ修正

svc_rdma_read_chunk_range()関数は、Readチャンクのセグメントリストを走査し、Position-ZeroまたはCallチャンクに対して、指定されたバイトオフセットから始まり長さlength分のサブレンジを構築します。この処理には2つの演算上の欠陥があり、不正なDMA長とu32のアンダーフローを引き起こしていました:

pcl_for_each_segment(segment, chunk) {
if (offset > segment->rs_length) {
offset -= segment->rs_length; continue; }

dummy.rs_handle = segment->rs_handle; dummy.rs_length = min_t(u32, length, segment->rs_length) - offset; dummy.rs_offset = segment->rs_offset + offset;

第一に、スキップ条件が'>='の代わりに'>'を使用しています。offsetがセグメントの完全なrs_lengthと等しい場合、そのセグメントは完全に消費されるためスキップされるべきですが、ループ本体へ処理が進んでしまいます。その結果、dummy.rs_lengthは min_t(u32, length, rs_length) - rs_length となり、lengthがrs_lengthより小さい場合はu32のアンダーフローによりUINT_MAXに近い値になり、それ以外の場合は0になります。

第二に、長さの計算式では、min_t()の結果からoffsetを減算していますが、キャップ適用前にsegment->rs_lengthから減算すべきです。offset > 0の場合、セグメントの残量は rs_length - offset であり、rs_lengthではありません。したがって、キャップは残量に対して適用される必要があります。現在の括弧処理では、lengthが rs_length - offset より小さい場合、セグメントごとの長さが length の代わりに length - offset となり、再構築されたチャンクからoffsetバイト分が静かに欠落します。上記の境界ケースと組み合わせることで、u32アンダーフロー経路も有効化され、svc_rdma_build_read_segment()に巨大なnr_bvecを、svc_rdma_get_rw_ctxt()においてマルチMiBサイズのkmalloc_array_node()呼び出しを引き起こします。

さらに、最後のReadチャンクがCallチャンクの末尾と完全に一致する場合、svc_rdma_read_call_chunk()はlength == 0でこの関数を呼び出す可能性があります。修正された'>='条件により、すべてのセグメントがスキップされ、関数は初期の-EINVALを返して有効なリクエストを拒否します。lengthがゼロの場合はすぐに成功を返すようにしてください。また、要求された範囲が完全に消費されるとループから脱し、svc_rdma_build_read_segment()に長さ0のセグメントが渡されないようにします。

修正内容は以下の通りです: - 完全消費されたセグメントをスキップするために'>='を使用する - キャップをセグメントの残長に対して適用するため、'- offset'をmin_t()内部へ移動する - 長さ0のリクエストに対して成功を返す - 要求範囲が消費されるとイテレーションを停止する

If you want to get best quality of vulnerability data, you may have to visit VulDB.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-402840

EPSS

0.00000

アクティビティ

非常低い

ソース

Want to stay up to date on a daily basis?

Enable the mail alert feature now!