製品・ソフトウェアに関する情報
LinuxのLinux Kernelにおける整数アンダーフローの脆弱性
Title LinuxのLinux Kernelにおける整数アンダーフローの脆弱性
Summary

Linuxカーネルのdrm/i915/gtコンポーネントにおいて、intel_engine_park_heartbeat関数で参照カウントのアンダーフローが発生する脆弱性が修正されました。heartbeatワーカーとintel_engine_park_heartbeat関数が同じengine-heartbeat.systoleリクエストの解放を競合する場面で、use-after-freeおよび参照カウントアンダーフローの可能性が存在します。具体的には、heartbeatワーカーがsystoleポインタを読み込み処理を開始し、リクエスト完了時にi915_request_put()を呼び出しますが、ポインタのクリアは非アトミックに別段階で実施されます。一方、別CPUのリクエスト退職処理によりengineのwakerefが0になった際にintel_engine_park_heartbeat()が呼び出され、heartbeatタイマーが保留中である場合はcancel_delayed_work()がtrueを返し、古い非NULLのsystoleポインタを読み取って再度i915_request_put()を呼び出すため、参照カウントがアンダーフローします。この問題を解決するために、非アトミックなポインタ読み込みとクリアの処理をxchg()による原子操作に置き換え、競合状況でも正しく片方のみがポインタを取得するようにしました。

Possible impacts 当該ソフトウェアが扱う全ての情報が外部に漏れる可能性があります。 また、当該ソフトウェアが扱う全ての情報が書き換えられる可能性があります。 さらに、当該ソフトウェアが完全に停止する可能性があります。 そして、この脆弱性を悪用した攻撃の影響は、他のソフトウェアには及びません。 
Solution

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

Publication Date April 24, 2026, midnight
Registration Date April 30, 2026, 12:32 p.m.
Last Update April 30, 2026, 12:32 p.m.
CVSS3.0 : 重要
Score 7.8
Vector CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Affected System
Linux
Linux Kernel 5.16 以上 6.1.169 未満
Linux Kernel 5.5
Linux Kernel 5.5.1 以上 5.15.203 未満
Linux Kernel 6.13 以上 6.18.23 未満
Linux Kernel 6.19 以上 6.19.13 未満
Linux Kernel 6.2 以上 6.6.135 未満
Linux Kernel 6.7 以上 6.12.82 未満
Linux Kernel 7.0
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
Change Log
No Changed Details Date of change
1 [2026年04月30日]
  掲載
April 30, 2026, 12:32 p.m.

NVD Vulnerability Information
CVE-2026-31656
Summary

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

drm/i915/gt: fix refcount underflow in intel_engine_park_heartbeat

A use-after-free / refcount underflow is possible when the heartbeat
worker and intel_engine_park_heartbeat() race to release the same
engine->heartbeat.systole request.

The heartbeat worker reads engine->heartbeat.systole and calls
i915_request_put() on it when the request is complete, but clears
the pointer in a separate, non-atomic step. Concurrently, a request
retirement on another CPU can drop the engine wakeref to zero, triggering
__engine_park() -> intel_engine_park_heartbeat(). If the heartbeat
timer is pending at that point, cancel_delayed_work() returns true and
intel_engine_park_heartbeat() reads the stale non-NULL systole pointer
and calls i915_request_put() on it again, causing a refcount underflow:

```
<4> [487.221889] Workqueue: i915-unordered engine_retire [i915]
<4> [487.222640] RIP: 0010:refcount_warn_saturate+0x68/0xb0
...
<4> [487.222707] Call Trace:
<4> [487.222711] <TASK>
<4> [487.222716] intel_engine_park_heartbeat.part.0+0x6f/0x80 [i915]
<4> [487.223115] intel_engine_park_heartbeat+0x25/0x40 [i915]
<4> [487.223566] __engine_park+0xb9/0x650 [i915]
<4> [487.223973] ____intel_wakeref_put_last+0x2e/0xb0 [i915]
<4> [487.224408] __intel_wakeref_put_last+0x72/0x90 [i915]
<4> [487.224797] intel_context_exit_engine+0x7c/0x80 [i915]
<4> [487.225238] intel_context_exit+0xf1/0x1b0 [i915]
<4> [487.225695] i915_request_retire.part.0+0x1b9/0x530 [i915]
<4> [487.226178] i915_request_retire+0x1c/0x40 [i915]
<4> [487.226625] engine_retire+0x122/0x180 [i915]
<4> [487.227037] process_one_work+0x239/0x760
<4> [487.227060] worker_thread+0x200/0x3f0
<4> [487.227068] ? __pfx_worker_thread+0x10/0x10
<4> [487.227075] kthread+0x10d/0x150
<4> [487.227083] ? __pfx_kthread+0x10/0x10
<4> [487.227092] ret_from_fork+0x3d4/0x480
<4> [487.227099] ? __pfx_kthread+0x10/0x10
<4> [487.227107] ret_from_fork_asm+0x1a/0x30
<4> [487.227141] </TASK>
```

Fix this by replacing the non-atomic pointer read + separate clear with
xchg() in both racing paths. xchg() is a single indivisible hardware
instruction that atomically reads the old pointer and writes NULL. This
guarantees only one of the two concurrent callers obtains the non-NULL
pointer and performs the put, the other gets NULL and skips it.

(cherry picked from commit 13238dc0ee4f9ab8dafa2cca7295736191ae2f42)

Publication Date April 25, 2026, 12:16 a.m.
Registration Date April 25, 2026, 4:08 a.m.
Last Update April 28, 2026, 12:16 a.m.
Related information, measures and tools
Common Vulnerabilities List