From: Tzung-Bi Shih <tzungbi@kernel.org>
To: hexlabsecurity@proton.me
Cc: Benson Leung <bleung@chromium.org>,
Sebastian Reichel <sre@kernel.org>,
linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
Guenter Roeck <groeck@chromium.org>,
chrome-platform@lists.linux.dev
Subject: Re: [PATCH] power: supply: cros_usbpd-charger: bound the EC-reported port count
Date: Tue, 16 Jun 2026 09:42:21 +0000 [thread overview]
Message-ID: <ajEafasi2g-K0ysc@google.com> (raw)
In-Reply-To: <20260615-b4-disp-e0930b21-v1-1-c9ffbac7c9bb@proton.me>
On Mon, Jun 15, 2026 at 04:04:07AM -0500, Bryam Vargas via B4 Relay wrote:
> From: Bryam Vargas <hexlabsecurity@proton.me>
>
> 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.
>
> Fixes: f68b883e8fad ("power: supply: add cros-ec USBPD charger driver.")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
With or without the minor comment:
Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
> diff --git a/drivers/power/supply/cros_usbpd-charger.c b/drivers/power/supply/cros_usbpd-charger.c
> index 7d3e676a951c..d639957f9775 100644
> --- a/drivers/power/supply/cros_usbpd-charger.c
> +++ b/drivers/power/supply/cros_usbpd-charger.c
> @@ -589,10 +589,12 @@ static int cros_usbpd_charger_probe(struct platform_device *pd)
>
> /*
> * Sanity checks on the number of ports:
> - * there should be at most 1 dedicated port
> + * there should be at most 1 dedicated port, and the count is
> + * reported by the EC, so it must not exceed the ports[] array.
> */
Nit: The mention of EC is redundant. I'd suggest:
"...must not exceed the maximum number of supported ports
(EC_USB_PD_MAX_PORTS)"
prev parent reply other threads:[~2026-06-16 9:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-15 9:04 [PATCH] power: supply: cros_usbpd-charger: bound the EC-reported port count Bryam Vargas via B4 Relay
2026-06-15 9:04 ` Bryam Vargas
2026-06-16 9:42 ` Tzung-Bi Shih [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ajEafasi2g-K0ysc@google.com \
--to=tzungbi@kernel.org \
--cc=bleung@chromium.org \
--cc=chrome-platform@lists.linux.dev \
--cc=groeck@chromium.org \
--cc=hexlabsecurity@proton.me \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=sre@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.