CVE-2026-74682 in Linux
Résumé
par VulDB • 22/08/2026
Dans le noyau Linux, la vulnérabilité suivante a été corrigée :
ALSA: usb-audio : correction d'une écriture hors limites (OOB) sur les URB entrants de type II
La fonction `data_ep_set_params()` dimensionne chaque tampon de transfert URB avant d'ajouter le délimiteur de transfert de Format Type II :
u->packets = urb_packs; u->buffer_size = maxsize * u->packets;
if (fmt->fmt_type == UAC_FORMAT_TYPE_II) u->packets++; /* pour le délimiteur de transfert */ u->urb = usb_alloc_urb(u->packets, GFP_KERNEL);
La taille du tampon (`buffer_size`) est calculée à partir du nombre de paquets avant l'incrémentation et n'est jamais recalculée. Par conséquent, pour un endpoint de type II, le tampon manque d'un paquet par rapport au nombre de paquets avec lequel l'URB est construit.
La fonction `prepare_inbound_urb()` dispose ensuite une trame ISO par paquet sans jamais consulter la taille du tamfon (`buffer_size`) :
offs = 0; for (i = 0; i < urb_ctx->packets; i++) {
urb->iso_frame_desc[i].offset = offs;
urb->iso_frame_desc[i].length = ep->curpacksize;
offs += ep->curpacksize; }
urb->transfer_buffer_length = offs; urb->number_of_packets = urb_ctx->packets;
Le dernier descripteur pointe donc un paquet au-delà de la fin du tampon de transfert, là où le contrôleur d'hôte écrit les données périphériques lors de chaque transfert entrant. Les fonctions `prepare_silent_urb()` et `prepare_playback_urb()` limitent leurs boucles de remplissage par `ctx->buffer_size`, donc seule la capture est affectée.
Le type de format (`fmt_type`) provient des descripteurs de flux audio du périphérique, tout appareil annonçant un format de capture Type II déclenche ce problème une fois que l'espace utilisateur définit les paramètres matériels (hw_params) sur le flux.
KASAN sur la version 7.2.0-rc5 (arm64) avec un dispositif dummy_hcd/raw-gadget, un rapport par transfert entrant :
BUG: KASAN: slab-out-of-bounds in dummy_timer Write of size 64 at addr ffff0000186171c0 by task cons02/166 __asan_memcpy dummy_timer hrtimer_run_softirq Allocated by task 166: usb_alloc_coherent snd_usb_endpoint_set_params The buggy address is located 0 bytes to the right of allocated 64-byte region [ffff000018617180, ffff0000186171c0)
Calculer `buffer_size` après que le paquet délimiteur a été pris en compte, et limiter la boucle de remplissage par `buffer_size`, comme le fait déjà `prepare_silent_urb()` du côté sortant. Cela augmente chaque allocation d'URB Type II d'un paquet de taille maximale (`maxsize`).
Découvert par XBOW, trié par Baul Lee <[email protected]>
If you want to get best quality of vulnerability data, you may have to visit VulDB.