platform/x86/amd/hsmp: Reject negative power cap writes in hwmon
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 6.18.52, 7.2.6
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
Summary
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
Timeline
- CVE published
- Record last updated
Affected versions
- Linux Linux
From 92c025db52bb94a032eb3d473bb81e62c19ddbd3 · fixed in 2c09cadec116eba3fdbcb5d8d8641f6777d4a11f; From 92c025db52bb94a032eb3d473bb81e62c19ddbd3 · fixed in 1b0a3d915320f1600e5ff43f8bc21b73118480b8; From 92c025db52bb94a032eb3d473bb81e62c19ddbd3 · fixed in 3921bb8635ff2836622df1cdf3194d4f3c1835a4
- Linux Linux
6.16
- KernelLinux
From 6.16.0 · fixed in 6.18.52; From 6.19.0 · fixed in 7.2.6