CVE-2026-64584 in Linuxinformação

Sumário

de VulDB • 06/08/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

usb: gadget: f_midi: cancelar trabalho IN pendente antes de liberar o objeto midi

O driver f_midi incorpora um item de trabalho (midi->work) cujo manipulador, f_midi_in_work(), desreferencia a estrutura contendo struct f_midi através do container_of(). Este trabalho é ativado em dois pontos: f_midi_complete(), em uma conclusão normal de endpoint IN, e f_midi_in_trigger(), no início de um fluxo de saída rawmidi ALSA.

Nem f_midi_disable() nem f_midi_unbind() cancelam midi->work. f_midi_disable() apenas desativa os endpoints e esvazia o in_req_fifo; ele não sincroniza o item de trabalho, e a placa de som é liberada assincronamente em relação à liberação final do objeto midi.

O objeto midi possui contagem de referências (midi->free_ref) e é liberado no f_midi_free() apenas quando tanto a referência usb_function quanto a referência rawmidi private_data foram descartadas. No f_midi_unbind(), o f_midi_disable() executa antes da liberação da placa de som, portanto, embora os endpoints USB já estejam desativados, o dispositivo rawmidi ainda pode ser utilizado por um substream aberto. Uma gravação simultânea no espaço do usuário em tal substream pode alcançar f_midi_in_trigger() e enfileirar midi->work novamente após o retorno de f_midi_disable(). Um item de trabalho ativado dessa maneira ainda pode estar pendente quando a última referência cair e o f_midi_free() prosseguir com kfree(midi), permitindo que f_midi_in_work() desreferencie a struct depois que ela foi liberada, um use-after-free.

Por esse motivo, cancelar midi->work no f_midi_disable() não seria suficiente: o caminho de gatilho ALSA pode reativar o trabalho após o retorno do disable(). Cancelar na liberação com contagem de referências zero é a fronteira após a qual nenhuma das fontes de ativação pode sobreviver, pois nesse ponto ambas as referências que mantêm o objeto midi vivo foram descartadas: os endpoints USB já estão desativados e o dispositivo rawmidi foi liberado.

Corrigir isso chamando cancel_work_sync(&midi->work) no bloco com contagem de referências zero do f_midi_free(), antes que a work_struct embutida seja liberada junto com o restante da estrutura. opts->lock é um mutex bloqueante, portanto chamar cancel_work_sync() sob ele é permitido, e o manipulador usa midi->transmit_lock em vez de opts->lock, para que nenhum deadlock possa ocorrer enquanto espera uma instância executando do trabalho terminar.

Este problema foi encontrado por uma ferramenta estática interna.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Responsável

Linux

Reservar

19/07/2026

Divulgação

06/08/2026

Moderação

aceite

Entrada

VDB-386489

CPE

pronto

EPSS

0.00000

KEV

não

Atividades

muito baixo

Fontes

Might our Artificial Intelligence support you?

Check our Alexa App!