CVE-2026-80973 in Linux
Sumário
de VulDB • 12/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
ALSA: 6fire: limitou o comprimento dos eventos MIDI fornecidos pelo dispositivo
A função `usb6fire_comm_receiver_handler()` encaminha um evento MIDI usando um byte de comprimento fornecido pelo dispositivo, sem limite e sem verificação se a transferência entregou realmente esse número de bytes:
```c 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` é um buffer alocado com `kzalloc()` de 64 bytes (`COMM_RECEIVER_BUFSIZE`), portanto, apenas 62 bytes seguem o cabeçalho de dois bytes. `receiver_buffer[1]` é um valor do tipo `u8` escolhido pelo dispositivo; assim, um dispositivo que responde com 0x10 e um comprimento de 0xFF faz com que `snd_rawmidi_receive()` leia 255 bytes a partir da segunda posição dentro de um objeto de 64 bytes. Os bytes além do buffer são repassados ao userspace através do caminho de leitura rawmidi.
`urb->actual_length` também não é consultado, portanto, uma transferência incompleta mantém o byte de tipo e o byte de comprimento em seus valores anteriores, fazendo com que o manipulador atue sobre dados desatualizados (stale data).
O URB do receptor é submetido a partir de `usb6fire_comm_init()` durante o probe, ocorrendo a leitura no momento da conexão física sem ação do usuário; o encaminhamento ao userspace também requer uma substream de entrada MIDI aberta, já que `usb6fire_midi_in_received()` só chama `snd_rawmidi_receive()` quando `rt->in` está definido.
KASAN na versão 7.2.0-rc5 (arm64), com um único pacote enviado por um dispositivo emulado:
``` 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)
```
Rejeite o evento quando o comprimento exceder os bytes que seguem o cabeçalho e exija que a transferência tenha entregue o cabeçalho mais esse número de bytes. O URB do receptor é submetido com um `transfer_buffer_length` de 64 bytes, portanto, um dispositivo genuíno não pode entregar um evento maior que esses 62 bytes, sem descartar nada válido.
Descoberto por XBOW, triado por Baul Lee <[email protected]>
If you want to get best quality of vulnerability data, you may have to visit VulDB.