CVE-2026-31433Linux内核中的ksmbd模块存在一处越界写入漏洞。该漏洞发生在处理包含QUERY_DIRECTORY和QUERY_INFO(FILE_ALL_INFORMATION)的复合请求时。如果第一个命令消耗了几乎所有的max_trans_size,get_file_all_info()函数会在未验证剩余缓冲区大小的情况下,盲目调用smbConvertToUTF16()并使用PATH_MAX长度,导致写入超出响应缓冲区的范围。由于缺少对客户端提供的OutputBufferLength的验证,当文件名长度超过可用缓冲区空间时,可能导致缓冲区溢出或内存损坏,从而严重影响系统的机密性、完整性和可用性。
该漏洞源于Linux内核ksmbd服务器中get_file_all_info()函数的缺陷。在处理SMB2复合请求时,攻击者可以构造特定的请求序列:首先是QUERY_DIRECTORY命令,其设计目的是消耗接近max_trans_size的传输配额;紧接着是QUERY_INFO(FILE_ALL_INFORMATION)命令。在处理第二个命令时,代码需要将文件名复制到响应缓冲区的FileName字段。然而,原实现未计算剩余缓冲区空间,直接使用常量PATH_MAX作为smbConvertToUTF16()的长度参数。由于此时剩余空间极小,该操作会覆盖响应缓冲区之后的内存,造成越界写入。这可能导致内核崩溃(拒绝服务)或潜在的权限提升。修复方案引入了smb2_calc_max_out_buf_len()来动态计算可用空间,并在空间不足时返回错误。