PT-2026-90103 · Linux · Linux
CVE-2026-80973
·
Published
2026-09-11
·
Updated
2026-09-11
None
No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
ALSA: 6fire: bound the MIDI event length from the device
usb6fire comm receiver handler() forwards a MIDI event using a length
byte the device supplies, with no bound and no check that the transfer
delivered that many bytes:
if (!urb->status) {
if (rt->receiver buffer[0] == 0x10) /* midi in event */
if (midi rt)
midi rt->in received(midi rt,
rt->receiver buffer + 2,
rt->receiver buffer[1]);
}receiver buffer is a 64-byte kzalloc() buffer (COMM RECEIVER BUFSIZE), so
only 62 bytes follow the two-byte header. receiver buffer[1] is a u8 the
device chooses, so a device that answers with 0x10 and a length of 0xFF
makes snd rawmidi receive() read 255 bytes starting two bytes into a
64-byte object. The bytes past the buffer are handed to userspace
through the rawmidi read path.
urb->actual length is not consulted either, so a short transfer leaves
both the type byte and the length byte at their previous values and the
handler acts on stale data.
The receiver URB is submitted from usb6fire comm init() at probe, so the
read happens on plug with no user action; forwarding to userspace also
needs a MIDI input substream open, since usb6fire midi in received()
only calls snd rawmidi receive() when rt->in is set.
KASAN on 7.2.0-rc5 (arm64), single packet from an emulated device:
BUG: KASAN: slab-out-of-bounds in snd rawmidi receive
Read of size 255 at addr ffff000009f64682 by task bash/183
asan memcpy
snd rawmidi receive
usb6fire midi in received [snd usb 6fire]
usb6fire comm receiver handler [snd usb 6fire]
Allocated by task 11:
usb6fire comm init [snd usb 6fire]
usb6fire chip probe [snd usb 6fire]
The buggy address is located 2 bytes inside of
allocated 64-byte region [ffff000009f64680, ffff000009f646c0)
Reject the event when the length exceeds the bytes that follow the
header, and require the transfer to have delivered the header plus that
many bytes. The receiver URB is submitted with a 64-byte
transfer buffer length, so a genuine device cannot deliver an event
longer than those 62 bytes and nothing valid is dropped.
Discovered by XBOW, triaged by Baul Lee baul.lee@xbow.com
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Linux