CVE-2025-38211
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
04/07/2025
Last modified:
08/07/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
RDMA/iwcm: Fix use-after-free of work objects after cm_id destruction<br />
<br />
The commit 59c68ac31e15 ("iw_cm: free cm_id resources on the last<br />
deref") simplified cm_id resource management by freeing cm_id once all<br />
references to the cm_id were removed. The references are removed either<br />
upon completion of iw_cm event handlers or when the application destroys<br />
the cm_id. This commit introduced the use-after-free condition where<br />
cm_id_private object could still be in use by event handler works during<br />
the destruction of cm_id. The commit aee2424246f9 ("RDMA/iwcm: Fix a<br />
use-after-free related to destroying CM IDs") addressed this use-after-<br />
free by flushing all pending works at the cm_id destruction.<br />
<br />
However, still another use-after-free possibility remained. It happens<br />
with the work objects allocated for each cm_id_priv within<br />
alloc_work_entries() during cm_id creation, and subsequently freed in<br />
dealloc_work_entries() once all references to the cm_id are removed.<br />
If the cm_id&#39;s last reference is decremented in the event handler work,<br />
the work object for the work itself gets removed, and causes the use-<br />
after-free BUG below:<br />
<br />
BUG: KASAN: slab-use-after-free in __pwq_activate_work+0x1ff/0x250<br />
Read of size 8 at addr ffff88811f9cf800 by task kworker/u16:1/147091<br />
<br />
CPU: 2 UID: 0 PID: 147091 Comm: kworker/u16:1 Not tainted 6.15.0-rc2+ #27 PREEMPT(voluntary)<br />
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-3.fc41 04/01/2014<br />
Workqueue: 0x0 (iw_cm_wq)<br />
Call Trace:<br />
<br />
dump_stack_lvl+0x6a/0x90<br />
print_report+0x174/0x554<br />
? __virt_addr_valid+0x208/0x430<br />
? __pwq_activate_work+0x1ff/0x250<br />
kasan_report+0xae/0x170<br />
? __pwq_activate_work+0x1ff/0x250<br />
__pwq_activate_work+0x1ff/0x250<br />
pwq_dec_nr_in_flight+0x8c5/0xfb0<br />
process_one_work+0xc11/0x1460<br />
? __pfx_process_one_work+0x10/0x10<br />
? assign_work+0x16c/0x240<br />
worker_thread+0x5ef/0xfd0<br />
? __pfx_worker_thread+0x10/0x10<br />
kthread+0x3b0/0x770<br />
? __pfx_kthread+0x10/0x10<br />
? rcu_is_watching+0x11/0xb0<br />
? _raw_spin_unlock_irq+0x24/0x50<br />
? rcu_is_watching+0x11/0xb0<br />
? __pfx_kthread+0x10/0x10<br />
ret_from_fork+0x30/0x70<br />
? __pfx_kthread+0x10/0x10<br />
ret_from_fork_asm+0x1a/0x30<br />
<br />
<br />
Allocated by task 147416:<br />
kasan_save_stack+0x2c/0x50<br />
kasan_save_track+0x10/0x30<br />
__kasan_kmalloc+0xa6/0xb0<br />
alloc_work_entries+0xa9/0x260 [iw_cm]<br />
iw_cm_connect+0x23/0x4a0 [iw_cm]<br />
rdma_connect_locked+0xbfd/0x1920 [rdma_cm]<br />
nvme_rdma_cm_handler+0x8e5/0x1b60 [nvme_rdma]<br />
cma_cm_event_handler+0xae/0x320 [rdma_cm]<br />
cma_work_handler+0x106/0x1b0 [rdma_cm]<br />
process_one_work+0x84f/0x1460<br />
worker_thread+0x5ef/0xfd0<br />
kthread+0x3b0/0x770<br />
ret_from_fork+0x30/0x70<br />
ret_from_fork_asm+0x1a/0x30<br />
<br />
Freed by task 147091:<br />
kasan_save_stack+0x2c/0x50<br />
kasan_save_track+0x10/0x30<br />
kasan_save_free_info+0x37/0x60<br />
__kasan_slab_free+0x4b/0x70<br />
kfree+0x13a/0x4b0<br />
dealloc_work_entries+0x125/0x1f0 [iw_cm]<br />
iwcm_deref_id+0x6f/0xa0 [iw_cm]<br />
cm_work_handler+0x136/0x1ba0 [iw_cm]<br />
process_one_work+0x84f/0x1460<br />
worker_thread+0x5ef/0xfd0<br />
kthread+0x3b0/0x770<br />
ret_from_fork+0x30/0x70<br />
ret_from_fork_asm+0x1a/0x30<br />
<br />
Last potentially related work creation:<br />
kasan_save_stack+0x2c/0x50<br />
kasan_record_aux_stack+0xa3/0xb0<br />
__queue_work+0x2ff/0x1390<br />
queue_work_on+0x67/0xc0<br />
cm_event_handler+0x46a/0x820 [iw_cm]<br />
siw_cm_upcall+0x330/0x650 [siw]<br />
siw_cm_work_handler+0x6b9/0x2b20 [siw]<br />
process_one_work+0x84f/0x1460<br />
worker_thread+0x5ef/0xfd0<br />
kthread+0x3b0/0x770<br />
ret_from_fork+0x30/0x70<br />
ret_from_fork_asm+0x1a/0x30<br />
<br />
This BUG is reproducible by repeating the blktests test case nvme/061<br />
for the rdma transport and the siw driver.<br />
<br />
To avoid the use-after-free of cm_id_private work objects, ensure that<br />
the last reference to the cm_id is decremented not in the event handler<br />
works, but in the cm_id destruction context. For that purpose, mo<br />
---truncated---
Impact
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/23a707bbcbea468eedb398832eeb7e8e0ceafd21
- https://git.kernel.org/stable/c/3b4a50d733acad6831f6bd9288a76a80f70650ac
- https://git.kernel.org/stable/c/6883b680e703c6b2efddb4e7a8d891ce1803d06b
- https://git.kernel.org/stable/c/764c9f69beabef8bdc651a7746c59f7a340d104f
- https://git.kernel.org/stable/c/78381dc8a6b61c9bb9987d37b4d671b99767c4a1
- https://git.kernel.org/stable/c/fd960b5ddf4faf00da43babdd3acda68842e1f6a