CVE-2026-74682: ALSA: usb-audio: fix OOB write on Type II inbound URBs
In the Linux kernel, the following vulnerability has been resolved:
ALSA: usb-audio: fix OOB write on Type II inbound URBs
dataepsetparams() sizes each URB transfer buffer before it adds the Format Type II transfer delimiter:
u->packets = urbpacks; u->buffersize = maxsize u->packets;
if (fmt->fmttype == UACFORMATTYPEII) u->packets++; / for transfer delimiter / u->urb = usballocurb(u->packets, GFPKERNEL);
buffersize is computed from the pre-increment packet count and never recomputed, so for a Type II endpoint the buffer is one packet short of the packet count the URB is built with.
prepareinboundurb() then lays out one iso frame per packet and never consults buffersize:
offs = 0; for (i = 0; i < urbctx->packets; i++) { urb->isoframedesc[i].offset = offs; urb->isoframedesc[i].length = ep->curpacksize; offs += ep->curpacksize; }
urb->transferbufferlength = offs; urb->numberofpackets = urbctx->packets;
The last descriptor therefore points one packet past the end of the transfer buffer, where the host controller writes device data on every inbound transfer. preparesilenturb() and prepareplaybackurb() bound their fill loops by ctx->buffersize, so only capture is affected.
fmttype comes from the device's audio streaming descriptors, so any device advertising a Type II capture format hits this once userspace sets hwparams on the stream.
KASAN on 7.2.0-rc5 (arm64) with a dummyhcd/raw-gadget device, one report per inbound transfer:
BUG: KASAN: slab-out-of-bounds in dummytimer Write of size 64 at addr ffff0000186171c0 by task cons02/166 asanmemcpy dummytimer hrtimerrunsoftirq Allocated by task 166: usballoccoherent sndusbendpointsetparams The buggy address is located 0 bytes to the right of allocated 64-byte region [ffff000018617180, ffff0000186171c0)
Compute buffersize after the delimiter packet has been accounted for, and bound the fill loop by buffersize, as preparesilenturb() already does on the outbound side. This grows every Type II URB allocation by one maxsize packet.
Discovered by XBOW, triaged by Baul Lee <baul.lee@xbow.com>