CVE-2025-39863CWE-416

CVE-2025-39863

High · published September 19, 2025

CVSS v3.1
7.8
EPSS
0%
Percentile
5.0
In the wild
Unconfirmed
What it is

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.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00162 · 5.0th percentile
Weakness
CWE-416 · Use After Free
Published
2025-09-19T20:15Z
Affected products (7)
ProductVersionsFixed in
linux/linux_kernel≥ 3.10, < 6.6.1056.6.105
linux/linux_kernel≥ 6.7, < 6.12.466.12.46
linux/linux_kernel≥ 6.13, < 6.16.66.16.6
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (7)
EPSS history
Timeline
  • 19 SEP 15:26Z
    wifi: brcmfmac: fix use-after-free when rescheduling brcmf_btcoex_info work
    cvelistv5