CVE-2025-39945CWE-416

CVE-2025-39945

High · published October 4, 2025

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

In the Linux kernel, the following vulnerability has been resolved:

cnic: Fix use-after-free bugs in cnic_delete_task

The original code uses cancel_delayed_work() in cnic_cm_stop_bnx2x_hw(),

which does not guarantee that the delayed work item 'delete_task' has

fully completed if it was already running. Additionally, the delayed work

item is cyclic, the flush_workqueue() in cnic_cm_stop_bnx2x_hw() only

blocks and waits for work items that were already queued to the

workqueue prior to its invocation. Any work items submitted after

flush_workqueue() is called are not included in the set of tasks that the

flush operation awaits. This means that after the cyclic work items have

finished executing, a delayed work item may still exist in the workqueue.

This leads to use-after-free scenarios where the cnic_dev is deallocated

by cnic_free_dev(), while delete_task remains active and attempt to

dereference cnic_dev in cnic_delete_task().

A typical race condition is illustrated below:

CPU 0 (cleanup) | CPU 1 (delayed work callback)

cnic_netdev_event() |

cnic_stop_hw() | cnic_delete_task()

cnic_cm_stop_bnx2x_hw() | ...

cancel_delayed_work() | /* the queue_delayed_work()

flush_workqueue() | executes after flush_workqueue()*/

| queue_delayed_work()

cnic_free_dev(dev)//free | cnic_delete_task() //new instance

| dev = cp->dev; //use

Replace cancel_delayed_work() with cancel_delayed_work_sync() to ensure

that the cyclic delayed work item is properly canceled and that any

ongoing execution of the work item completes before the cnic_dev is

deallocated. Furthermore, since cancel_delayed_work_sync() uses

__flush_work(work, true) to synchronously wait for any currently

executing instance of the work item to finish, the flush_workqueue()

becomes redundant and should be removed.

This bug was identified through static analysis. To reproduce the issue

and validate the fix, I simulated the cnic PCI device in QEMU and

introduced intentional delays — such as inserting calls to ssleep()

within the cnic_delete_task() function — to increase the likelihood

of triggering the bug.

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.00158 · 4.6th percentile
Weakness
CWE-416 · Use After Free
Published
2025-10-04T12:15Z
Affected products (13)
ProductVersionsFixed in
linux/linux_kernel≥ 2.6.37, < 5.4.3005.4.300
linux/linux_kernel≥ 5.5, < 5.10.2455.10.245
linux/linux_kernel≥ 5.11, < 5.15.1945.15.194
linux/linux_kernel≥ 5.16, < 6.1.1546.1.154
linux/linux_kernel≥ 6.2, < 6.6.1086.6.108
linux/linux_kernel≥ 6.7, < 6.12.496.12.49
linux/linux_kernel≥ 6.13, < 6.16.96.16.9
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (8)
EPSS history
Timeline
  • 04 OCT 07:31Z
    cnic: Fix use-after-free bugs in cnic_delete_task
    cvelistv5