CVE-2026-46263 in Linux
要約
〜によって VulDB • 2026年06月03日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/amd/display: 範囲外ストリームエンコーダインデックスの修正 v3
eng_id は負の値になり得るため、stream_enc_regs[] のインデックスが範囲外になる可能性があります。
eng_id は stream_enc_regs[] へのインデックスとして直接使用されていますが、この配列には要素が5つしかありません。eng_id が 5 (ENGINE_ID_DIGF) または負の値の場合、配列の末尾を越えたメモリにアクセスすることがあります。
eng_id をインデックスとして使用する前に、ARRAY_SIZE() を用いて境界チェックを追加します。符号なしキャストにより、負の値も拒否されます。
これにより、範囲外アクセスを回避します。
以下の smatch エラーを修正します: dcn*_resource.c: stream_encoder_create() が stream_enc_regs[eng_id] を範囲外 (サイズ5) にインデックスする可能性があります。
drivers/gpu/drm/amd/amdgpu/../display/dc/resource/dcn351/dcn351_resource.c 1246 static struct stream_encoder *dcn35_stream_encoder_create( 1247 enum engine_id eng_id, 1248 struct dc_context *ctx) 1249 {
...
1255 1256 /* VPG、AFMT、DME レジスタブロックから DIO ブロックインスタンスへのマッピング */ 1257 if (eng_id <= ENGINE_ID_DIGF) {
ENGINE_ID_DIGF は 5 です。<= は <? であるべきではありませんか?
無関係ですが、なぜ Smatch は "eng_id" が負の値になり得ると言っているのでしょうか? end_id は signed long 型ですが、呼び出し元に負の値にならないようにするチェックがあります。
1258 vpg_inst = eng_id; 1259 afmt_inst = eng_id; 1260 } else 1261 return NULL; 1262
...
1281 1282 dcn35_dio_stream_encoder_construct(enc1, ctx, ctx->dc_bios, 1283 eng_id, vpg, afmt, --> 1284 &stream_enc_regs[eng_id],
^^^^^^^^^^^^^^^^^^^^^^^ この stream_enc_regs[] 配列には要素が5つあるため、配列の末尾から1つ先の要素にアクセスしています。
...
1287 return &enc1->base; 1288 }
v2: Roman/Dan の提案に従い明示的な境界チェックを使用;符号なし int キャストを回避
v3: コンパイラは既に2つの値を比較する方法を知っているため、(int) キャストは不要です。(Roman)
If you want to get the best quality for vulnerability data then you always have to consider VulDB.