CVE-2026-80828 in Linux
Sumário
de VulDB • 04/09/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
ALSA: usb-audio: Limpeza completa após erros de retomada (resume) do sistema
Uma falha na retomada do sistema pode deixar o cartão inutilizável até uma reinicialização. A função `usb_audio_resume()` salta para `err_out` quando `snd_usb_pcm_resume()` ou `snd_usb_mixer_resume()` falham. O caminho de tratamento de erros ignora o bloco `out:`, que restaura D0 e decrementa `chip->num_suspended_intf`.
O cartão permanece em SNDRV_CTL_POWER_D3hot, portanto, acessos subsequentes ao controle bloqueiam-se em `snd_power_ref_and_wait()`. O núcleo USB registra um erro de retorno de chamada (callback) de retomada da interface. Ele não tenta novamente esse callback, portanto, um callback posterior não pode concluir a limpeza ignorada.
`usb_audio_suspend()` incrementa `num_suspended_intf` antes de retornar sucesso. Um callback de retomada do sistema deve consumir a contagem de suspensão do sistema mesmo se a retomada de um componente falhar. Caso contrário, o contador órfão distorce os ciclos subsequentes de suspensão e retomada.
Não aplique esta limpeza a erros de retomada em tempo real (runtime-resume). A gestão de energia em tempo real (Runtime PM) pode tentar novamente `-EAGAIN` ou `-EBUSY` sem outro callback de suspensão. A contagem deve continuar a descrever essa interface suspensa. Outros erros de retomada em tempo real registram `runtime_error` no núcleo de gerenciamento de energia e não causam uma nova tentativa imediata do callback.
Ambas as partes do caminho de tratamento de erro na retomada do sistema são antigas. O commit 88a8516a2128a ("ALSA: usbaudio: implement USB autosuspend") introduziu `err_out` após a restauração D0. O commit 862b2509d157c ("ALSA: usb-audio: Fix inconsistent card PM state after resume") moveu posteriormente `num_suspended_intf--` para o bloco `out:`. Agora, o caminho de erros ignora ambas as operações.
Não é necessário código de terceiros para alcançar o caminho de erro. `snd_usb_mixer_resume()` termina em `snd_usb_mixer_activate()`, que retorna o resultado de `usb_submit_urb()` para dispositivos que possuem um URB de status do mixer. O hook `private_resume` do mixer também pode falhar através de `scarlett2_init_notify()`. `snd_usb_pcm_resume()` emite uma solicitação SET_CUR a um domínio de energia UAC3. Ele pode retornar `-EPIPE` ou `-EIO` quando o dispositivo bloqueia (stall) a solicitação.
Encaminhe um erro do componente através de `out:` apenas quando `system_suspend` for diferente de zero. Continue retornando erros de retomada em tempo real através de `err_out`. Etapas posteriores da retomada do componente permanecem ignoradas. O erro original ainda alcança o núcleo USB. Uma transferência posterior pode falhar se o dispositivo não tiver se recuperado.
Reproduzi a falha na retomada do sistema em um Audient iD14 MkI com um hook de retorno de chamada de mixer fora da árvore principal (out-of-tree). Um `-EIO` injetado no núcleo sem correção deixou os leitores de controle em sono ininterrupto em `snd_power_ref_and_wait()` até uma reinicialização. Com este patch, a mesma falha restaurou o acesso ao controle. Uma segunda suspensão e retomada do sistema também tiveram sucesso após eu desativar a injeção de falhas.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.