CVE-2025-39932CVE-2025-39932是Linux内核SMB(Server Message Block)客户端模块中的一个中等严重性漏洞,CVSS评分为5.5。该漏洞位于SMB Direct(SMBD)传输驱动中,具体涉及`smbd_destroy()`函数在销毁内存资源时未正确同步等待`post_send_credits_work`工作队列完成,导致出现竞争条件(race condition)。当SMBD连接被销毁时,如果`post_send_credits_work`工作项仍在挂起状态或即将被调度执行,该工作项可能会访问已被释放的内存区域,从而触发释放后使用(Use-After-Free)漏洞。该漏洞在使用RDMA over Converged Ethernet(RoCE)的RXE驱动时已被实际触发,系统日志中出现了`rxe_post_recv`在`rdma_destroy_qp()`之后被调用的警告信息,表明队列对(QP)已被销毁后仍有代码尝试向其提交接收缓冲区请求。此漏洞可能导致内核崩溃(kernel panic)、系统不稳定或潜在的权限提升,具体影响取决于攻击者对本地系统的访问权限和利用时机。
该漏洞的根本原因在于`smbd_destroy()`函数在销毁SMBD连接相关内存之前,未调用`disable_work_sync(&info->post_send_credits_work)`来确保`post_send_credits_work`工作项已完全停止。具体技术细节如下:
1. **竞争条件触发路径**:当SMBD连接被关闭时,`smbd_destroy()`被调用以释放相关资源。在销毁过程中,`ib_drain_qp()`被调用以排空RDMA队列对中的请求。
2. **问题触发**:`ib_drain_qp()`会触发`put_receive_buffer()`,该函数进而调用`queue_work(info->workqueue, &info->post_send_credits_work)`,将`post_send_credits_work`加入工作队列。
3. **内存释放时序问题**:`smbd_destroy()`在`ib_drain_qp()`返回后继续执行并释放内存,但此时`post_send_credits_work`可能尚未执行或正在执行。当工作项最终执行时,它会调用`smbd_post_send_credits()`,进而调用`smbd_post_recv()`,最终调用`rxe_post_recv()`,但此时RDMA队列对已被销毁。
4. **实际触发场景**:在使用RXE(软件RDMA)驱动时,系统日志显示警告信息`WARNING: CPU: 0 PID: 138 at drivers/infiniband/sw/rxe/rxe_verbs.c:1032 rxe_post_recv+0x1ee/0x480 [rdma_rxe]`,表明在`rdma_destroy_qp()`之后仍有代码尝试调用`rxe_post_recv()`。
5. **修复方案**:在`smbd_destroy()`中调用`disable_work_sync(&info->post_send_credits_work)`,确保工作项不再被调度且已停止执行,然后再释放相关内存资源。