LinuxのLinux Kernelにおける不特定の脆弱性
タイトル LinuxのLinux Kernelにおける不特定の脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。drm/amdkfd の debug address watch v2 における watch_id の範囲チェックが改善されました。アドレスウォッチのクリアコードは watch_id を符号なし値(u32)として受け取りますが、一部の補助関数が符号付き int を使用し、watch_id のシフトによるビットチェックを行っていました。非常に大きな watch_id がユーザースペースから渡された場合、それが負の値に変換され、不正なシフトが発生し、watch_points 配列の範囲外メモリにアクセスする可能性がありました。修正内容としては、watch_id を使用する前に MAX_WATCH_ADDRESSES 内にあることをチェックし、ビットのテストとクリアには BIT(watch_id) を用いて安全に処理するようにしました。これにより、有効な watch ID では動作が変更されず、不正な ID に対する未定義動作を回避できます。問題の修正対象は、drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debug.c の kfd_dbg_trap_clear_dev_address_watch() 関数(448行目)で発生していたバッファオーバーフローです。kfd_dbg_owns_dev_watch_id() は負の値をチェックしなかったため、watch_id が INT_MAX を超えるとバッファオーバーフローが発生しました(負のシフトは未定義動作となります)。v2 では Jonathan Kim による修正として、セットパスに早期の watch_id = MAX_WATCH_ADDRESSES バリデーションを追加し、クリアパスと一致させました。また、kfd_dbg_owns_dev_watch_id() 内の冗長な範囲チェックを削除しました。

想定される影響 ・当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 ・当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 ・当該ソフトウェアが完全に停止する可能性があります。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年5月27日0:00
登録日 2026年6月26日12:00
最終更新日 2026年6月26日12:00
CVSS3.0 : 重要
スコア 7.8
ベクター CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
影響を受けるシステム
Linux
Linux Kernel 6.13 以上 6.18.14 未満
Linux Kernel 6.19 以上 6.19.4 未満
Linux Kernel 6.5 以上 6.6.128 未満
Linux Kernel 6.7 以上 6.12.75 未満
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年06月26日]
  掲載
2026年6月26日12:00

NVD脆弱性情報
CVE-2026-45878
概要

In the Linux kernel, the following vulnerability has been resolved:

drm/amdkfd: Fix watch_id bounds checking in debug address watch v2

The address watch clear code receives watch_id as an unsigned value
(u32), but some helper functions were using a signed int and checked
bits by shifting with watch_id.

If a very large watch_id is passed from userspace, it can be converted
to a negative value. This can cause invalid shifts and may access
memory outside the watch_points array.

drm/amdkfd: Fix watch_id bounds checking in debug address watch v2

Fix this by checking that watch_id is within MAX_WATCH_ADDRESSES before
using it. Also use BIT(watch_id) to test and clear bits safely.

This keeps the behavior unchanged for valid watch IDs and avoids
undefined behavior for invalid ones.

Fixes the below:
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debug.c:448
kfd_dbg_trap_clear_dev_address_watch() error: buffer overflow
'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() doesn't check for negative values so if
watch_id is larger than INT_MAX it leads to a buffer overflow.
(Negative shifts are undefined).

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: (as per, Jonathan Kim)
- Add early watch_id >= MAX_WATCH_ADDRESSES validation in the set path to
match the clear path.
- Drop the redundant bounds check in kfd_dbg_owns_dev_watch_id().

公表日 2026年5月27日23:17
登録日 2026年5月28日4:11
最終更新日 2026年5月30日20:17
関連情報、対策とツール
共通脆弱性一覧