CVE Catalog

CVE-2026-90136

Unknown
Published: Translated: NVD NIST

Summary

In the Linux kernel, the hsmp_hwmon_write() function in the platform/x86/amd/hsmp driver takes a user-supplied hwmon value as a signed long and assigns the result of division by MICROWATT_PER_MILLIWATT to a __u32 field. A negative value (e.g. echo -1 > power1_cap) is first converted to a huge unsigned value and then stored into the u32, causing a nonsensical multi-gigawatt socket power limit to be sent to the SMU instead of rejecting the write.

Risk Assessment

An unprivileged or erroneous negative power cap write can cause an invalid multi-gigawatt limit to be sent to the SMU, potentially leading to instability or unpredictable power management behavior on AMD platforms.

Recommendation

Update the Linux kernel to a version containing the fix that rejects negative values with -EINVAL before conversion. Until patched, restrict access to hwmon power1_cap files to trusted users only.

Other vulnerabilities in Linux kernel

See all
Original NVD description (English source)

In the Linux kernel, the following vulnerability has been resolved: platform/x86/amd/hsmp: Reject negative power cap writes in hwmon hsmp_hwmon_write() takes the user-supplied hwmon value as a signed long and assigns "val / MICROWATT_PER_MILLIWATT" to msg.args[0], which is a __u32. MICROWATT_PER_MILLIWATT is an unsigned long, so a negative write to power1_cap (e.g. "echo -1 > power1_cap") is first converted to a huge unsigned value by the division and then stored into the u32 argument. As a result a nonsensical, multi-gigawatt socket power limit is sent to the SMU via HSMP_SET_SOCKET_POWER_LIMIT instead of the write being rejected. Reject negative values with -EINVAL before the conversion. Tested with HSMP enabled: CAP=$(dirname $(grep -l amd_hsmp_hwmon \ /sys/class/hwmon/hwmon*/name | head -1))/power1_cap # negative write echo -1000000 > $CAP ; echo "ret=$?" # valid positive write must still work echo 400000000 > $CAP ; echo "ret=$?" Before: # echo -1000000 > $CAP ; echo "ret=$?" ret=0 <- accepted; bogus limit sent to SMU # echo 400000000 > $CAP ; echo "ret=$?" ret=0 After: # echo -1000000 > $CAP ; echo "ret=$?" bash: echo: write error: Invalid argument ret=1 <- rejected with -EINVAL # echo 400000000 > $CAP ; echo "ret=$?" ret=0 <- valid write still works

Vulnerability data from NVD (NIST) · CISA KEV · EPSS