CVE-2026-89471

CVE-2026-89471

High · published September 12, 2026

CVSS v3.1
8.4
EPSS
0%
Percentile
3.2
In the wild
Unconfirmed
What it is

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

power: supply: cros_usbpd-charger: bound the EC-reported port count

cros_usbpd_charger_probe() reads two port counts from the EC and uses

one of them, num_charger_ports, as the loop bound when populating a

fixed-size array:

struct port_data *ports[EC_USB_PD_MAX_PORTS]; /* 8 entries */

...

for (i = 0; i < charger->num_charger_ports; i++)

charger->ports[charger->num_registered_psy++] = port;

Both num_usbpd_ports (from EC_CMD_USB_PD_PORTS) and num_charger_ports

(from EC_CMD_CHARGE_PORT_COUNT) are u8 values reported by the EC. The

only validation is a sanity check that compares the two EC-reported

values against each other:

if (num_charger_ports < num_usbpd_ports ||

num_charger_ports > num_usbpd_ports + 1)

return -EPROTO;

It never checks either count against EC_USB_PD_MAX_PORTS, the size of

the ports[] array. A malfunctioning, malicious or compromised EC that

reports num_usbpd_ports == num_charger_ports == N for any N > 8 (for

example both 255) passes this check, and the loop then writes N pointers

into the 8-entry ports[] array embedded in the devm_kzalloc()'d

charger_data, overflowing it by up to 255 - 8 = 247 entries (~1976

bytes): a slab out-of-bounds write.

Reject a port count larger than the ports[] array can hold.

The record
Technical detail
CVSS v3.1
8.4 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00142 · 3.2th percentile
Published
2026-09-12T00:19Z
References (8)
EPSS history
Timeline
  • 13 SEP 03:23Z
    EPSS moved — → 0%
    epss
  • 11 SEP 19:43Z
    power: supply: cros_usbpd-charger: bound the EC-reported port count
    cvelistv5