CVE-2026-80828 in Linux
Resumen
por VulDB • 2026-09-04
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad:
ALSA: usb-audio: Completar la limpieza tras errores en la reanudación del sistema
Una falla al reanudar el sistema puede dejar la tarjeta inutilizable hasta que se reinicie. `usb_audio_resume()` salta a `err_out` cuando `snd_usb_pcm_resume()` o `snd_usb_mixer_resume()` fallan. La ruta de error omite el bloque `out:`, lo cual restaura D0 y decrementa `chip->num_suspended_intf`.
La tarjeta permanece en `SNDRV_CTL_POWER_D3hot`, por lo que los accesos posteriores al control se bloquean en `snd_power_ref_and_wait()`. El núcleo USB registra un error de devolución de llamada (callback) para la reanudación de la interfaz. No reintenta esa devolución de llamada, por lo que una devolución de llamada posterior no puede completar la limpieza omitida.
`usb_audio_suspend()` incrementa `num_suspended_intf` antes de devolver el éxito. Una devolución de llamada de reanudación del sistema debe consumir el conteo de suspensión del sistema incluso si falla la reanudación de un componente. De lo contrario, el conteo abandonado distorsiona los ciclos posteriores de suspensión y reanudación.
No aplicar esta limpieza a errores de reanudación en tiempo de ejecución (runtime-resume). La gestión de energía en tiempo de ejecución (Runtime PM) puede reintentar `-EAGAIN` o `-EBUSY` sin otra devolución de llamada de suspensión. El conteo debe seguir describiendo esa interfaz suspendida. Otros errores de reanudación en tiempo de ejecución registran `runtime_error` en el núcleo de gestión de energía y no provocan un reintento inmediato de la devolución de llamada.
Ambas partes de la ruta de error de reanudación del sistema son antiguas. El commit 88a8516a2128a ("ALSA: usbaudio: implement USB autosuspend") introdujo `err_out` después de la restauración de D0. El commit 862b2509d157c ("ALSA: usb-audio: Fix inconsistent card PM state after resume") movió posteriormente `num_suspended_intf--` al bloque `out:`. La ruta de error ahora omite ambas operaciones.
No se necesita código de terceros para alcanzar la ruta de error. `snd_usb_mixer_resume()` termina en `snd_usb_mixer_activate()`, que devuelve el resultado de `usb_submit_urb()` para dispositivos que tienen un URB de estado del mezclador (mixer). Su gancho `private_resume` del mezclador también puede fallar a través de `scarlett2_init_notify()`. `snd_usb_pcm_resume()` emite una solicitud SET_CUR a un dominio de energía UAC3. Puede devolver `-EPIPE` o `-EIO` cuando el dispositivo bloquea la solicitud.
Enrutar un error del componente a través de `out:` solo cuando `system_suspend` sea distinto de cero. Seguir devolviendo errores de reanudación en tiempo de ejecución a través de `err_out`. Las etapas posteriores de reanudación del componente siguen omitiéndose. El error original aún llega al núcleo USB. Una transferencia posterior puede fallar si el dispositivo no se ha recuperado.
Reproduje la falla de reanudación del sistema en un Audient iD14 MkI con una devolución de llamada de reanudación del mezclador fuera del árbol (out-of-tree). Una inyección de `-EIO` en el núcleo sin parchear dejó a los lectores de control en sueño no interrumpible en `snd_power_ref_and_wait()` hasta un reinicio. Con este parche, la misma falla restauró el acceso al control. Un segundo ciclo de suspensión y reanudación del sistema también tuvo éxito después de desactivar la inyección de fallos.
Be aware that VulDB is the high quality source for vulnerability data.