CVE-2026-31478Linux内核中的ksmbd模块存在一处严重的缓冲区处理漏洞。该漏洞发生在计算最大输出缓冲区长度时,由于部分代码使用了硬编码数值而非正确的结构体偏移量offsetof(),导致在处理SMB2复合请求时缓冲区长度计算错误。未经身份验证的攻击者可通过网络发送特制的SMB数据包触发此漏洞,导致内核内存越界访问,进而可能实现远程代码执行或造成系统拒绝服务。
该漏洞技术细节涉及Linux内核ksmbd子系统的响应缓冲区管理机制。在引入对SMB2读取复合请求的支持后,代码重构为使用动态iov数组来管理响应缓冲区。在此设计中,函数`smb2_calc_max_out_buf_len()`要求传入的`hdr2_len`参数必须是响应结构体中`->Buffer`字段相对于结构体起始位置的偏移量(即通过`offsetof()`宏获取)。然而,在修复前的版本中,部分调用站点错误地传递了硬编码的魔术数字。这种不匹配导致函数在计算最大缓冲区长度时产生错误值。当攻击者发送精心构造的SMB2网络数据包时,服务器会根据错误的长度值进行内存操作,从而引发堆缓冲区溢出或越界读写。考虑到ksmbd以root权限运行且无需用户交互即可通过网络访问,该漏洞极易被用于在目标服务器上执行任意代码,获取最高系统权限。