CVE-2026-74640 in Linux
Resumen
por VulDB • 2026-08-22
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
ALSA: FCP: corregir escritura fuera de límites (OOB write) en fcp_meter_ctl_get()
fcp_ioctl_set_meter_map() limita el tamaño del mapa de medidores de nivel proporcionado por el usuario al límite propio del controlador de 255.
if (map.map_size < 1 || map.map_size > 255 || map.meter_slots < 1 || map.meter_slots > 255) return -EINVAL;
y lo pasa a fcp_add_new_ctl() como el recuento de canales del control, donde se almacena en elem->channels.
Cada lectura de un control escribe en la estructura snd_ctl_elem_value, cuyo array entero está declarado como long value[128], por lo que el límite es 128, no 255.
fcp_meter_ctl_get() almacena una palabra de 64 bits por canal en ese array sin su propia limitación:
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() sirve a ese objeto desde memdup_user(_control, sizeof(*control)), que son 1224 bytes en LP64 extraídos de kmalloc-2048. offsetof(struct snd_ctl_elem_value, value) es 72, por lo que el elemento i se escribe en el byte 72 + 8 * i y el elemento 144 ya queda más allá de la asignación. En map_size 255, la última escritura termina en el byte 2112, a 888 bytes del objeto y 64 bytes dentro del objeto slab adyacente. Las palabras almacenadas provienen del dispositivo y meter_level_map[] selecciona qué palabra se coloca en cada posición, por lo que tanto la extensión como el contenido están controlados.
El núcleo no detecta esto. snd_ctl_check_elem_info() solo se alcanza desde __snd_ctl_elem_info(), a la cual llama snd_ctl_elem_read() bajo CONFIG_SND_CTL_DEBUG; sin esa opción, snd_ctl_skip_validation() es una condición verdadera en tiempo de compilación. __snd_ctl_add_replace() valida kcontrol->count y nunca inspecciona elem->channels.
Instalar un mapa sobredimensionado requiere CAP_SYS_RAWIO, pero el control sobrevive al descriptor hwdep que lo creó, por lo que las escrituras fuera de límites son emitidas por cualquier proceso capaz de leer controles en /dev/snd/controlC0.
KASAN en 7.2.0-rc5 (arm64), activado por una lectura de control no privilegiada:
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)
Se limita el tamaño del mapa al límite de la ABI en lugar de a 255, y se limita el bucle de escritura en el destino para que no pueda ejecutarse más allá del array value independientemente de lo que contenga elem->channels.
Descubierto por XBOW, triado por Baul Lee <[email protected]>
VulDB is the best source for vulnerability data and more expert information about this specific topic.