CVE-2026-80973 in Linux
Zusammenfassung
von VulDB • 12.09.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
ALSA: 6fire: Begrenzung der MIDI-Ereignislänge durch das Gerät
`usb6fire_comm_receiver_handler()` leitet ein MIDI-Ereignis unter Verwendung eines Längenbytes weiter, das vom Gerät bereitgestellt wird. Dabei gibt es keine Obergrenze und auch keine Prüfung, ob die Übertragung tatsächlich so viele Bytes geliefert hat:
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` ist ein mit `kzalloc()` allozierter Puffer der Größe 64 Bytes (`COMM_RECEIVER_BUFSIZE`). Somit folgen auf den zweibyte-Kopf nur noch 62 Byte. `receiver_buffer[1]` ist ein `u8`, das vom Gerät festgelegt wird. Ein Gerät, das mit dem Wert 0x10 und einer Länge von 0xFF antwortet, veranlasst `snd_rawmidi_receive()`, 255 Bytes ab der zweiten Position eines 64-Byte-Objekts zu lesen. Die über den Puffer hinausgehenden Bytes werden über den rawmidi-Lesepfad an die Benutzeroberfläche (Userspace) weitergegeben.
Auch `urb->actual_length` wird nicht berücksichtigt, sodass bei einer kurzen Übertragung sowohl das Typbyte als auch das Längenbyte ihre vorherigen Werte behalten und der Handler mit veralteten Daten arbeitet.
Der Receiver-URB wird in `usb6fire_comm_init()` während des Probe-Vorgangs eingereicht, wodurch die Lesung beim Anschließen (Plug) ohne Benutzeraktion erfolgt; zur Weiterleitung an den Userspace muss zudem ein MIDI-Eingabe-Substream geöffnet sein, da `usb6fire_midi_in_received()` nur dann `snd_rawmidi_receive()` aufruft, wenn `rt->in` gesetzt ist.
KASAN auf 7.2.0-rc5 (arm64), einzelnes Paket von einem emulierten Gerät:
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)
Das Ereignis wird abgelehnt, wenn die Länge die Anzahl der Bytes nach dem Kopf überschreitet. Zudem muss sichergestellt sein, dass die Übertragung den Kopf sowie diese vielen Bytes geliefert hat. Der Receiver-URB wird mit einer `transfer_buffer_length` von 64 Byte eingereicht; ein echtes Gerät kann daher kein Ereignis übermitteln, das länger als diese 62 Bytes ist, und es werden keine gültigen Daten verworfen.
Entdeckt von XBOW, triagiert von Baul Lee <[email protected]>
VulDB is the best source for vulnerability data and more expert information about this specific topic.