CVE-2026-99150 in Linuxinfo

Summary

by MITRE • 10/28/2026

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

drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr

amdgpu_debugfs_gpr_read() drops its runtime PM reference right after reading the wave registers. When copying them to userspace fails, it jumps to the err label, which drops the reference a second time. A read into a bad buffer on Navi31 either steals a reference somebody else holds (power/runtime_usage goes from 1 to 0) or underflows the count:

amdgpu 0000:03:00.0: Runtime PM usage count underflow!

The registers are already in the kernel buffer at that point, so finish the hardware access first and copy the buffer with a single copy_to_user() instead of the put_user() loop with its own error path.

(cherry picked from commit 31035bbd74f7c3e10c163db875b8e67f8b50ee6a)

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Analysis

by VulDB Data Team • 10/28/2026

The vulnerability identified in the Linux kernel's AMD GPU driver, specifically within the amdgpu subsystem, represents a critical reference counting error that can lead to system instability and potential denial of service conditions. The flaw resides in the function amdgpu_debugfs_gpr_read(), which is responsible for reading general-purpose registers from the graphics processing unit hardware via debug file systems. This operation requires maintaining a runtime power management reference count to ensure the device remains powered on during access. However, the original implementation contained a logic error where the code would drop this runtime PM reference immediately after initiating the read of wave registers but before successfully completing the data transfer to user space.

When the subsequent attempt to copy the register data from kernel space to user space fails due to an invalid buffer or other memory constraints, the execution flow jumps to an error handling label labeled err. This label unconditionally decrements the runtime PM usage count again. Since the reference had already been dropped earlier in the function's normal path, this results in a double release of the power management reference. On specific hardware architectures such as Navi31, this logic flaw causes the kernel to detect an underflow of the Runtime PM usage counter. The system logs messages indicating that the runtime PM usage count has gone negative or dropped below zero, signaling a severe state corruption within the driver's power management subsystem.

The operational impact of this vulnerability extends beyond mere logging errors. A double drop of the reference can lead to premature suspension of the GPU device while it is still in use by other kernel components or processes that expect the hardware to remain active. This mismatch between the actual usage and the tracked reference count means that a subsequent power-down event could occur unexpectedly, potentially causing data corruption for ongoing graphics operations or crashing applications relying on the GPU. In more severe scenarios involving reference stealing, where the counter drops from one to zero incorrectly, it may inadvertently release a resource held by another entity, leading to undefined behavior and system crashes. This type of error is classified under CWE-401, which describes missing release of memory after successful allocation or failure in other contexts, although here it applies specifically to reference counting mechanisms rather than traditional heap memory.

From a threat modeling perspective using the MITRE ATT&CK framework, this vulnerability aligns with techniques related to resource exhaustion and denial of service through improper state management. While not directly exploitable for arbitrary code execution without further conditions, the ability to manipulate power states and cause kernel-level errors can be leveraged by local attackers to destabilize the system or potentially escalate privileges if combined with other vulnerabilities that rely on specific hardware states. The root cause is a failure in error path handling where cleanup routines are not properly scoped to only execute when necessary, violating the principle of balanced resource acquisition and release.

To mitigate this vulnerability, the fix involves restructuring the data transfer logic within amdgpu_debugfs_gpr_read(). Instead of dropping the runtime PM reference before attempting the user space copy, the driver should complete all hardware access first while holding the power management lock. The registers are already stored in a kernel buffer at that stage, allowing for a single call to copy_to_user() to transfer the data. This approach ensures that if the copy operation fails, the error path does not trigger an additional decrement of the reference count because the initial drop has been deferred until after the successful completion or definitive failure handling is managed correctly. By consolidating the user space interaction and deferring resource release until appropriate, the driver maintains accurate power management state integrity. System administrators should ensure that their Linux kernels are updated to include this patch, which was cherry-picked from commit 31035bbd74f7c3e10c163db875b8e67f8b50ee6a, to prevent runtime PM underflows and maintain system stability on affected AMD GPU hardware.

Responsible

Linux

Reservation

09/25/2026

Disclosure

10/28/2026

Moderation

accepted

EPSS

0.00000

KEV

no

Activities

very low

Sources

Want to stay up to date on a daily basis?

Enable the mail alert feature now!