CVE-2026-64583 in Linuxinformação

Sumário

de VulDB • 06/08/2026

No kernel do Linux, a seguinte vulnerabilidade foi resolvida:

usb: gadget: udc: bdc: liberar IRQ e drenar func_wake_notify antes da desmontagem (teardown)

O driver Broadcom BDC UDC registra seu manipulador de interrupção (IRQ handler) com devm_request_irq() em bdc_udc_init(), portanto, a IRQ é liberada pelo mecanismo devm apenas após o retorno de bdc_remove(). O devm libera recursos na ordem LIFO inversa, mas bdc_remove() executa manualmente bdc_udc_exit() e bdc_hw_exit() -> bdc_mem_free() antes de retornar: bdc_udc_exit() desmonta os objetos individuais dos endpoints via bdc_free_ep(), enquanto bdc_hw_exit() -> bdc_mem_free() libera e define como NULL o anel de relatório de status coerente com DMA (bdc->srr.sr_bds) e executa kfree() em bdc->bdc_ep_array. Ambos ocorrem enquanto o manipulador de IRQ (bdc_udc_interrupt, solicitado com IRQF_SHARED) permanece entregável na janela até a liberação posterior da devm free_irq().

No recebimento de uma interrupção compartilhada nessa janela, bdc_udc_interrupt() desreferencia bdc->srr.sr_bds[bdc->srr.dqp_index] (NULL ou DMA liberado) e encaminha callbacks sr_handler que indexam em bdc_ep_array, causando um NULL-deref ou use-after-free.

A mesma janela afeta o delayed_work bdc->func_wake_notify, que é ativado a partir do manipulador de IRQ via bdc_sr_uspc() -> handle_link_state_change() -> schedule_delayed_work() e pode se reativar automaticamente a partir de seu próprio callback bdc_func_wake_timer(). Não existe nenhum cancelamento em qualquer lugar no driver, portanto, um item de trabalho enfileirado que seja executado após o retorno de bdc_remove() e a liberação da estrutura bdc pela devm desreferencia memória já liberada.

Substitua devm_request_irq() por request_irq() e adicione uma free_irq(bdc->irq, bdc) explícita em bdc_remove(). Limpe BDC_GIE antes de free_irq() para impedir que o dispositivo asserte interrupções; em seguida, free_irq() drena qualquer manipulador em trânsito (in-flight handler); por fim, cancel_delayed_work_sync() drena o delayed work func_wake_notify. Essa ordem garante que o manipulador de IRQ e o trabalho atrasado não possam interferir na subsequente desmontagem dos endpoints e do DMA em bdc_udc_exit() e bdc_hw_exit(). Conecte a free_irq() correspondente ao caminho de erro em bdc_udc_init() para que a IRQ seja liberada em caso de falha no probe, e direcione a falha de bdc_init_ep() através de err0 em vez de retornar diretamente.

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

If you want to get best quality of vulnerability data, you may have to visit VulDB.

Responsável

Linux

Reservar

19/07/2026

Divulgação

06/08/2026

Moderação

aceite

Entrada

VDB-386495

CPE

pronto

EPSS

0.00156

KEV

não

Atividades

baixo

Fontes

Do you want to use VulDB in your project?

Use the official API to access entries easily!