Linux USB
 help / color / mirror / Atom feed
* [PATCH] usb: gadget: composite: fix integer underflow in WebUSB GET_URL handling
@ 2026-05-12  1:43 Jeremy Erazo
  2026-05-12  5:39 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 8+ messages in thread
From: Jeremy Erazo @ 2026-05-12  1:43 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: linux-usb, linux-kernel

The WebUSB GET_URL handler in composite_setup() narrows
landing_page_length to fit the host-supplied wLength using

	landing_page_length = w_length
		- WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + landing_page_offset;

If wLength is smaller than WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH the
unsigned subtraction wraps, and the subsequent

	memcpy(url_descriptor->URL,
	       cdev->landing_page + landing_page_offset,
	       landing_page_length - landing_page_offset);

ends up copying close to UINT_MAX bytes from cdev->landing_page into
cdev->req->buf.  KASAN reports a slab-out-of-bounds in composite_setup
on the kmalloc-2k gadget_info allocation, and FORTIFY_SOURCE traps the
memcpy as a 4294967293-byte field-spanning write into
url_descriptor->URL (size 252).

A USB host can reach this from a single SETUP packet against any
gadget that has webusb/use=1 and a landingPage configured.

Handle the small-wLength case before the math: when the host requested
fewer bytes than the URL descriptor header, only the header is
meaningful and no URL bytes need to be copied.  Setting
landing_page_length to landing_page_offset makes the existing memcpy a
no-op and leaves the descriptor returned to the host unchanged for all
larger wLength values.

Reported-by: Jeremy Erazo <mendozayt13@gmail.com>
Signed-off-by: Jeremy Erazo <mendozayt13@gmail.com>
---
 drivers/usb/gadget/composite.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index a902184bd..dc3664374 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -2172,7 +2172,10 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
 				sizeof(url_descriptor->URL)
 				- WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + landing_page_offset);
 
-			if (w_length < WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + landing_page_length)
+			if (w_length < WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH)
+				landing_page_length = landing_page_offset;
+			else if (w_length <
+				 WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + landing_page_length)
 				landing_page_length = w_length
 				- WEBUSB_URL_DESCRIPTOR_HEADER_LENGTH + landing_page_offset;
 
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-05-12 16:05 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-12  1:43 [PATCH] usb: gadget: composite: fix integer underflow in WebUSB GET_URL handling Jeremy Erazo
2026-05-12  5:39 ` Greg Kroah-Hartman
2026-05-12 11:18   ` Sebastian EM
2026-05-12 13:29     ` Greg Kroah-Hartman
     [not found]       ` <CAD89HyCWaa8esENsCip3foXe7c8x34HRx=37+c4MwnTpCbN1oQ@mail.gmail.com>
2026-05-12 14:32         ` Greg Kroah-Hartman
2026-05-12 15:38           ` [PATCH v2] " Jeremy Erazo
2026-05-12 15:48             ` Greg Kroah-Hartman
2026-05-12 16:05               ` [PATCH v3] " Jeremy Erazo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox