CVE-2025-39863

In the Linux kernel, the following vulnerability has been resolved: wifi: brcmfmac: fix use-after-free when rescheduling brcmf_btcoex_info work The brcmf_btcoex_detach() only shuts down the btcoex timer, if the flag timer_on is false. However, the brcmf_btcoex_timerfunc(), which runs as timer handler, sets timer_on to false. This creates critical race conditions: 1.If brcmf_btcoex_detach() is called while brcmf_btcoex_timerfunc() is executing, it may observe timer_on as false and skip the call to timer_shutdown_sync(). 2.The brcmf_btcoex_timerfunc() may then reschedule the brcmf_btcoex_info worker after the cancel_work_sync() has been executed, resulting in use-after-free bugs. The use-after-free bugs occur in two distinct scenarios, depending on the timing of when the brcmf_btcoex_info struct is freed relative to the execution of its worker thread. Scenario 1: Freed before the worker is scheduled The brcmf_btcoex_info is deallocated before the worker is scheduled. A race condition can occur when schedule_work(&bt_local->work) is called after the target memory has been freed. The sequence of events is detailed below: 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: Freed after the worker is scheduled The brcmf_btcoex_info is freed after the worker has been scheduled but before or during its execution. In this case, statements within the brcmf_btcoex_handler() — such as the container_of macro and subsequent dereferences of the brcmf_btcoex_info object will cause a use-after-free access. The following timeline illustrates this scenario: CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | schedule_work(); // Reschedule | kfree(cfg->btcoex); // FREE | brcmf_btcoex_handler() // Worker /* | btci = container_of(....); // USE The kfree() above could | ... also occur at any point | btci-> // USE during the worker's execution| */ | To resolve the race conditions, drop the conditional check and call timer_shutdown_sync() directly. It can deactivate the timer reliably, regardless of its current state. Once stopped, the timer_on state is then set to false.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.17:rc4:*:*:*:*:*:*

History

19 Oct 2026, 21:10

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta: wifi: brcmfmac: corrige uso después de liberación al reprogramar el trabajo de brcmf_btcoex_info La brcmf_btcoex_detach() solo apaga el temporizador btcoex, si el indicador timer_on es falso. Sin embargo, la brcmf_btcoex_timerfunc(), que se ejecuta como gestor de temporizador, establece timer_on en falso. Esto crea condiciones de carrera críticas: 1.Si se llama a brcmf_btcoex_detach() mientras brcmf_btcoex_timerfunc() se está ejecutando, puede observar timer_on como falso y omitir la llamada a timer_shutdown_sync(). 2.La brcmf_btcoex_timerfunc() puede entonces reprogramar el trabajador de brcmf_btcoex_info después de que se haya ejecutado cancel_work_sync(), resultando en errores de uso después de liberación. Los errores de uso después de liberación ocurren en dos escenarios distintos, dependiendo del momento en que la estructura brcmf_btcoex_info es liberada en relación con la ejecución de su hilo de trabajador. Escenario 1: Liberada antes de que el trabajador sea programado La brcmf_btcoex_info es desasignada antes de que el trabajador sea programado. Una condición de carrera puede ocurrir cuando se llama a schedule_work(&bt_local->work) después de que la memoria objetivo ha sido liberada. La secuencia de eventos se detalla a continuación: CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | kfree(cfg->btcoex); // LIBERAR | | schedule_work(&bt_local->work); // USAR Escenario 2: Liberada después de que el trabajador es programado La brcmf_btcoex_info es liberada después de que el trabajador ha sido programado pero antes o durante su ejecución. En este caso, sentencias dentro del brcmf_btcoex_handler() — como la macro container_of y las desreferencias subsiguientes del objeto brcmf_btcoex_info causarán un acceso de uso después de liberación. La siguiente línea de tiempo ilustra este escenario: CPU0 | CPU1 brcmf_btcoex_detach | brcmf_btcoex_timerfunc | bt_local->timer_on = false; if (cfg->btcoex->timer_on) | ... | cancel_work_sync(); | ... | schedule_work(); // Reprogramar | kfree(cfg->btcoex); // LIBERAR | brcmf_btcoex_handler() // Trabajador /* | btci = container_of(....); // USAR El kfree() anterior también | ... podría ocurrir en cualquier | btci-> // USAR momento durante la ejecución | del trabajador | */ | Para resolver las condiciones de carrera, elimine la comprobación condicional y llame a timer_shutdown_sync() directamente. Puede desactivar el temporizador de forma fiable, independientemente de su estado actual. Una vez detenido, el estado timer_on se establece entonces en falso.

15 Oct 2026, 02:18

Type Values Removed Values Added
References
  • () https://cert-portal.siemens.com/productcert/html/ssa-784472.html -

Information

Published : 2025-09-19 16:15

Updated : 2026-10-19 21:10


NVD link : CVE-2025-39863

Mitre link : CVE-2025-39863

CVE.ORG link : CVE-2025-39863


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-416

Use After Free