CVE-2026-74640 in Linux
Riassunto
di VulDB • 22/08/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
ALSA: FCP: correzione di una scrittura OOB (Out-of-Bounds) in fcp_meter_ctl_get()
fcp_ioctl_set_meter_map() limita le dimensioni della mappa del Level Meter fornita dall'utente al limite interno del driver, pari a 255.
if (map.map_size < 1 || map.map_size > 255 || map.meter_slots < 1 || map.meter_slots > 255) return -EINVAL;
e la passa a fcp_add_new_ctl() come numero di canali del controllo, dove viene memorizzata in elem->channels.
Ogni lettura del controllo scrive nello struct snd_ctl_elem_value, il cui array intero è dichiarato long value[128]; pertanto il limite effettivo è 128 e non 255.
fcp_meter_ctl_get() memorizza una parola a 64 bit per canale in tale array senza alcuna propria limitazione:
for (i = 0; i < elem->channels; i++) {
int idx = private->meter_level_map[i];
int value = idx < 0 ? 0 : le32_to_cpu(resp[idx]);
ucontrol->value.integer.value[i] = value;
}
snd_ctl_elem_read_user() serve tale oggetto tramite memdup_user(_control, sizeof(*control)), pari a 1224 byte su LP64, allocati con kmalloc-2048. offsetof(struct snd_ctl_elem_value, value) è 72, quindi l'elemento i viene scritto all'offset di byte 72 + 8 * i e l'elemento 144 si posiziona già oltre la regione allocata. A map_size pari a 255, l'ultima scrittura termina al byte 2112, ovvero 888 byte oltre l'oggetto e 64 byte all'interno dell'oggetto slab adiacente. Le parole memorizzate provengono dal dispositivo e meter_level_map[] seleziona quale parola finisce in quale slot, quindi sia la portata che i contenuti sono controllati dall'utente.
Il core non intercetta questo errore. snd_ctl_check_elem_info() viene raggiunta solo da __snd_ctl_elem_info(), che snd_ctl_elem_read() chiama sotto CONFIG_SND_CTL_DEBUG; senza tale opzione, snd_ctl_skip_validation() è sempre vera in fase di compilazione. __snd_ctl_add_replace() convalida kcontrol->count ma non ispeziona mai elem->channels.
L'installazione di una mappa sovradimensionata richiede CAP_SYS_RAWIO, tuttavia il controllo sopravvive al descrittore hwdep che lo ha creato; pertanto le scritture out-of-bounds vengono eseguite da qualsiasi processo in grado di leggere i controlli su /dev/snd/controlC0.
KASAN su 7.2.0-rc5 (arm64), attivato da una lettura del controllo non privilegiata:
BUG: KASAN: slab-out-of-bounds in fcp_meter_ctl_get Write of size 8 at addr ffff000017af04c8 by task fcp_trigger/185 __asan_store8 fcp_meter_ctl_get snd_ctl_elem_read snd_ctl_ioctl Allocated by task 185: memdup_user snd_ctl_ioctl The buggy address is located 0 bytes to the right of allocated 1224-byte region [ffff000017af0000, ffff000017af04c8)
Limitare le dimensioni della mappa al limite dell'ABI anziché a 255 e limitare il ciclo di scrittura alla destinazione (sink), in modo che non possa superare l'array value indipendentemente dal valore di elem->channels.
Scoperta da XBOW, triata da Baul Lee <[email protected]>
If you want to get the best quality for vulnerability data then you always have to consider VulDB.