CVE-2026-45878 in Linux
要約
〜によって VulDB • 2026年05月29日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
drm/amdkfd: デバッグアドレスウォッチにおけるwatch_idの境界チェックを修正(v2)
アドレスウォッチクリアコードはwatch_idを符号なし値(u32)として受け取りますが、いくつかのヘルパー関数は符号付きintを使用し、watch_idでシフト演算を行うことでビットをチェックしていました。
ユーザー空間から非常に大きなwatch_idが渡されると、それが負の値に変換される可能性があります。これにより無効なシフトが発生し、watch_points配列の外部のメモリにアクセスする可能性があります。
drm/amdkfd: デバッグアドレスウォッチにおけるwatch_idの境界チェックを修正(v2)
これを修正するため、watch_idを使用する前にwatch_idがMAX_WATCH_ADDRESSESの範囲内であることをチェックします。また、ビットのテストとクリアを安全に行うためにBIT(watch_id)を使用します。
これにより、有効なwatch IDについては動作を変更せず、無効なwatch IDについては未定義動作を回避します。
以下を修正します: drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debug.c:448 kfd_dbg_trap_clear_dev_address_watch() エラー: バッファオーバーフロー 'pdd->watch_points' 4 <= u32max user_rl='0-3,2147483648-u32max' uncapped
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debug.c 433 int kfd_dbg_trap_clear_dev_address_watch(struct kfd_process_device *pdd, 434 uint32_t watch_id) 435 {
436 int r; 437 438 if (!kfd_dbg_owns_dev_watch_id(pdd, watch_id))
kfd_dbg_owns_dev_watch_id()は負の値をチェックしないため、watch_idがINT_MAXより大きいとバッファオーバーフローを引き起こします。 (負のシフトは未定義動作です)。
439 return -EINVAL; 440 441 if (!pdd->dev->kfd->shared_resources.enable_mes) {
442 r = debug_lock_and_unmap(pdd->dev->dqm); 443 if (r) 444 return r; 445 } 446 447 amdgpu_gfx_off_ctrl(pdd->dev->adev, false); --> 448 pdd->watch_points[watch_id] = pdd->dev->kfd2kgd->clear_address_watch(
449 pdd->dev->adev, 450 watch_id);
v2: (Jonathan Kimによる指示に従って) - setパスにwatch_id >= MAX_WATCH_ADDRESSESの早期検証を追加し、clearパスと一致させました。 - kfd_dbg_owns_dev_watch_id()内の冗長な境界チェックを削除しました。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.