CVE-2026-80973 in Linux
Resumen
por VulDB • 2026-09-11
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
ALSA: 6fire: acotar la longitud del evento MIDI según lo proporcionado por el dispositivo
`usb6fire_comm_receiver_handler()` reenvía un evento MIDI utilizando un byte de longitud suministrado por el dispositivo, sin ningún límite ni verificación de que la transferencia haya entregado esa cantidad exacta de 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` es un búfer de `kzalloc()` de 64 bytes (`COMM_RECEIVER_BUFSIZE`), por lo que solo hay 62 bytes después del encabezado de dos bytes. `receiver_buffer[1]` es un valor `u8` elegido por el dispositivo, por lo que un dispositivo que responde con 0x10 y una longitud de 0xFF hace que `snd_rawmidi_receive()` lea 255 bytes comenzando dos bytes dentro de un objeto de 64 bytes. Los bytes más allá del búfer se pasan al espacio de usuario a través de la ruta de lectura de rawmidi.
Tampoco se consulta `urb->actual_length`, por lo que una transferencia corta deja tanto el byte de tipo como el de longitud con sus valores anteriores, y el controlador actúa sobre datos obsoletos (stale data).
El URB del receptor se envía desde `usb6fire_comm_init()` durante la fase de probe, por lo que la lectura ocurre al conectar sin intervención del usuario; además, para reenviarlo al espacio de usuario también es necesario tener abierto un substream de entrada MIDI, ya que `usb6fire_midi_in_received()` solo llama a `snd_rawmidi_receive()` cuando `rt->in` está establecido.
KASAN en 7.2.0-rc5 (arm64), paquete único desde un 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)
Rechazar el evento cuando la longitud exceda los bytes que siguen al encabezado, y exigir que la transferencia haya entregado el encabezado más esa cantidad de bytes. El URB del receptor se envía con una `transfer_buffer_length` de 64 bytes, por lo que un dispositivo genuino no puede entregar un evento más largo que esos 62 bytes y no se descartan datos válidos.
Descubierto por XBOW, triado por Baul Lee <[email protected]>
If you want to get best quality of vulnerability data, you may have to visit VulDB.