CVE-2025-39863 in Linux
Riassunto
di VulDB • 22/06/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
wifi: brcmfmac: correzione del bug use-after-free durante il riprogrammazione dell'attività brcmf_btcoex_info work
La funzione brcmf_btcoex_detach() arresta solo il timer btcoex se il flag timer_on è false. Tuttavia, la funzione brcmf_btcoex_timerfunc(), che viene eseguita come handler del timer, imposta timer_on su false. Ciò crea condizioni di gara critiche:
1. Se brcmf_btcoex_detach() viene chiamata mentre brcmf_btcoex_timerfunc() è in esecuzione, potrebbe rilevare timer_on come false e saltare la chiamata a timer_shutdown_sync().
2. La funzione brcmf_btcoex_timerfunc() potrebbe quindi riprogrammare l'attività worker brcmf_btcoex_info dopo che cancel_work_sync() è stata eseguita, causando bug di tipo use-after-free.
I bug use-after-free si verificano in due scenari distinti, a seconda del momento in cui la struttura brcmf_btcoex_info viene deallocata rispetto all'esecuzione del suo thread worker.
Scenario 1: Deallocazione prima che il worker venga programmato
La struttura brcmf_btcoex_info viene deallocata prima che il worker venga programmato. Può verificarsi una condizione di gara quando schedule_work(&bt_local->work) viene chiamata dopo che la memoria target è stata liberata. La sequenza degli eventi è dettagliata di seguito:
CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | kfree(cfg->btcoex); // FREE | | schedule_work(&bt_local->work); // USE
Scenario 2: Deallocazione dopo che il worker è stato programmato
La struttura brcmf_btcoex_info viene liberata dopo che il worker è stato programmato ma prima o durante la sua esecuzione. In questo caso, le istruzioni all'interno di brcmf_btcoex_handler() — come la macro container_of e i successivi dereferenziamenti dell'oggetto brcmf_btcoex_info — provocheranno un accesso use-after-free. La seguente timeline illustra questo scenario:
CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | schedule_work(); // Riprogrammazione | kfree(cfg->btcoex); // FREE | brcmf_btcoex_handler() // Worker /* | btci = container_of(....); // USE La chiamata kfree() sopra | ... potrebbe verificarsi in | btci-> // USE qualsiasi punto durante | l'esecuzione del worker | */ |
Per risolvere le condizioni di gara, rimuovere il controllo condizionale e chiamare direttamente timer_shutdown_sync(). Questa funzione può disattivare il timer in modo affidabile, indipendentemente dal suo stato corrente. Una volta arrestato, lo stato timer_on viene quindi impostato su false.
Once again VulDB remains the best source for vulnerability data.