CVE-2025-39863 in Linux
Sumário
de VulDB • 24/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
wifi: brcmfmac: corrige uso-após-liberação (use-after-free) ao reagendar o trabalho brcmf_btcoex_info
A função brcmf_btcoex_detach() desliga apenas o timer btcoex se a flag timer_on for falsa. No entanto, a função brcmf_btcoex_timerfunc(), que atua como manipulador do timer, define timer_on como falsa. Isso cria condições de corrida críticas:
1. Se brcmf_btcoex_detach() for chamada enquanto brcmf_btcoex_timerfunc() estiver em execução, ela pode observar timer_on como falsa e pular a chamada para timer_shutdown_sync().
2. A função brcmf_btcoex_timerfunc() pode então reagendar o worker brcmf_btcoex_info após o cancel_work_sync() ter sido executado, resultando em bugs de uso-após-liberação (use-after-free).
Os bugs de uso-após-liberação ocorrem em dois cenários distintos, dependendo do momento em que a estrutura brcmf_btcoex_info é liberada em relação à execução de sua thread de trabalho.
Cenário 1: Liberado antes que o worker seja agendado
A estrutura brcmf_btcoex_info é desalocada antes que o worker seja agendado. Uma condição de corrida pode ocorrer quando schedule_work(&bt_local->work) é chamada após a memória alvo ter sido liberada. A sequência de eventos é detalhada abaixo:
CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | kfree(cfg->btcoex); // LIBERA | | schedule_work(&bt_local->work); // USO
Cenário 2: Liberado após o worker ser agendado
A estrutura brcmf_btcoex_info é liberada após o worker ter sido agendado, mas antes ou durante sua execução. Neste caso, instruções dentro de brcmf_btcoex_handler() — como a macro container_of e as subsequentes desreferências do objeto brcmf_btcoex_info — causarão um acesso de uso-após-liberação. A seguinte linha do tempo ilustra este cenário:
CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | schedule_work(); // Reagendar | kfree(cfg->btcoex); // LIBERA | brcmf_btcoex_handler() // Worker /* | btci = container_of(....); // USO O kfree() acima poderia | ... também ocorrer a qualquer | btci-> // USO ponto durante a execução do | worker | */ |
Para resolver as condições de corrida, remova a verificação condicional e chame timer_shutdown_sync() diretamente. Ela pode desativar o timer de forma confiável, independentemente de seu estado atual. Uma vez parado, o estado timer_on é então definido como falso.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.