CVE-2025-39943CVE-2025-39943是Linux内核ksmbd(SMB内核服务器)模块中smbdirect组件存在的一个高危安全漏洞。该漏洞源于smb_direct_data_transfer结构体中的data_offset和data_length字段在recv_done回调处理时未进行充分的合法性验证。ksmbd是Linux内核中实现的SMB3服务器协议栈,允许Linux系统作为SMB/CIFS文件共享服务器运行。smbdirect(SMB Direct)是基于RDMA(远程直接内存访问)的高速传输机制,用于在支持RDMA的网络环境中提供高性能的SMB数据传输。当恶意客户端通过SMB Direct连接发送精心构造的数据传输请求时,如果其中的data_offset和data_length字段值无效或超出实际缓冲区边界,内核在处理recv_done回调时将发生越界内存访问,可能导致内核崩溃(可用性丧失)或敏感内核内存数据泄露(机密性泄露)。该漏洞的CVSS评分为7.1,属于高危级别,攻击者需要本地低权限访问权限即可触发,无需用户交互。该漏洞影响了多个Linux内核稳定版本,相关补丁已合并到主线内核及多个stable分支中。
从技术层面分析,该漏洞的根本原因在于ksmbd的smbdirect模块在处理SMB Direct数据传输时,对smb_direct_data_transfer结构体中的关键字段缺乏边界校验。具体而言:
1. **数据结构问题**:smb_direct_data_transfer结构体包含data_offset(数据偏移量)和data_length(数据长度)两个字段,用于描述RDMA传输中实际负载数据的位置和大小。在正常情况下,这些字段的值应当与底层RDMA缓冲区的大小相匹配。
2. **校验缺失**:在recv_done回调函数(即RDMA数据传输完成通知)中,内核代码直接使用data_offset和data_length来定位和读取数据缓冲区内容,而没有验证这两个字段是否在合法范围内。
3. **越界访问**:当攻击者构造恶意的SMB Direct数据包,将data_offset设置为超出实际缓冲区大小的值,或将data_length设置为导致读取超出缓冲区边界的值时,内核将执行越界内存读取操作。
4. **利用方式**:攻击者首先需要与目标系统的ksmbd服务建立SMB Direct(基于RDMA)连接,然后通过该连接发送特制的SMB Direct数据传输请求。由于漏洞为本地攻击向量,攻击者需要拥有目标系统的本地用户账户(低权限即可),但考虑到ksmbd通常用于网络文件共享服务,远程攻击场景也可能存在。
5. **影响后果**:越界读取可能导致内核panic(系统崩溃/可用性丧失),或者泄露相邻内存区域中的敏感信息(如内核凭据、密钥等),造成机密性损害。该漏洞不影响数据完整性。
修复方案是在recv_done函数中添加对data_offset和data_length字段的有效性校验,确保它们不会导致越界访问。