CVE-2026-31607
Severity CVSS v4.0:
Pending analysis
Type:
CWE-787
Out-of-bounds Write
Publication date:
24/04/2026
Last modified:
28/04/2026
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
usbip: validate number_of_packets in usbip_pack_ret_submit()<br />
<br />
When a USB/IP client receives a RET_SUBMIT response,<br />
usbip_pack_ret_submit() unconditionally overwrites<br />
urb->number_of_packets from the network PDU. This value is<br />
subsequently used as the loop bound in usbip_recv_iso() and<br />
usbip_pad_iso() to iterate over urb->iso_frame_desc[], a flexible<br />
array whose size was fixed at URB allocation time based on the<br />
*original* number_of_packets from the CMD_SUBMIT.<br />
<br />
A malicious USB/IP server can set number_of_packets in the response<br />
to a value larger than what was originally submitted, causing a heap<br />
out-of-bounds write when usbip_recv_iso() writes to<br />
urb->iso_frame_desc[i] beyond the allocated region.<br />
<br />
KASAN confirmed this with kernel 7.0.0-rc5:<br />
<br />
BUG: KASAN: slab-out-of-bounds in usbip_recv_iso+0x46a/0x640<br />
Write of size 4 at addr ffff888106351d40 by task vhci_rx/69<br />
<br />
The buggy address is located 0 bytes to the right of<br />
allocated 320-byte region [ffff888106351c00, ffff888106351d40)<br />
<br />
The server side (stub_rx.c) and gadget side (vudc_rx.c) already<br />
validate number_of_packets in the CMD_SUBMIT path since commits<br />
c6688ef9f297 ("usbip: fix stub_rx: harden CMD_SUBMIT path to handle<br />
malicious input") and b78d830f0049 ("usbip: fix vudc_rx: harden<br />
CMD_SUBMIT path to handle malicious input"). The server side validates<br />
against USBIP_MAX_ISO_PACKETS because no URB exists yet at that point.<br />
On the client side we have the original URB, so we can use the tighter<br />
bound: the response must not exceed the original number_of_packets.<br />
<br />
This mirrors the existing validation of actual_length against<br />
transfer_buffer_length in usbip_recv_xbuff(), which checks the<br />
response value against the original allocation size.<br />
<br />
Kelvin Mbogo&#39;s series ("usb: usbip: fix integer overflow in<br />
usbip_recv_iso()", v2) hardens the receive-side functions themselves;<br />
this patch complements that work by catching the bad value at its<br />
source -- in usbip_pack_ret_submit() before the overwrite -- and<br />
using the tighter per-URB allocation bound rather than the global<br />
USBIP_MAX_ISO_PACKETS limit.<br />
<br />
Fix this by checking rpdu->number_of_packets against<br />
urb->number_of_packets in usbip_pack_ret_submit() before the<br />
overwrite. On violation, clamp to zero so that usbip_recv_iso() and<br />
usbip_pad_iso() safely return early.
Impact
Base Score 3.x
9.80
Severity 3.x
CRITICAL
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 2.6.39 (including) | 6.6.136 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.12.83 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.13 (including) | 6.18.24 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.19 (including) | 6.19.14 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 7.0 (including) | 7.0.1 (excluding) |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/2ab833a16a825373aad2ba7d54b572b277e95b71
- https://git.kernel.org/stable/c/5e1c4ece08ccdc197177631f111845a2c68eede3
- https://git.kernel.org/stable/c/885c8591784da6314f9aa82fa460ac69f9f79e5f
- https://git.kernel.org/stable/c/8d155e2d1c4102f74f82a2bf9c016164bb0f7384
- https://git.kernel.org/stable/c/906f16a836de13fe61f49cdce2f66f2dbd14caf4
- https://git.kernel.org/stable/c/ef8ebb1c637b4cfb61a9dd2e013376774ee2033b



