CVE-2026-31706Linux内核中的ksmbd模块在处理SMB协议的ACL继承时存在安全漏洞。smb_inherit_dacl()函数直接信任父目录扩展属性中的num_aces值进行堆内存分配,未验证其与实际数据大小的一致性。攻击者可通过篡改父目录的security.NTACL属性,构造恶意的ACE数量,触发巨大的内存分配或整数溢出。这可能导致内核内存耗尽引发拒绝服务,或因未初始化内存访问导致信息泄露。
该漏洞源于Linux内核ksmbd子系统的smb_inherit_dacl()函数。该函数在继承父目录DACL(自由访问控制列表)时,直接从磁盘xattr读取num_aces(u16类型),并使用kmalloc(sizeof(struct smb_ace) * num_aces * 2)分配堆内存。由于缺少对num_aces与pdacl_size一致性的校验,本地或经过认证的攻击者可利用并发路径或离线篡改,将num_aces设为65535,而实际ACE数据很少。这会导致尝试分配约8MB内存(未初始化),在32位系统上可能导致size_t乘法溢出,进而引发内核崩溃或越界读写。此外,ACE遍历循环的边界检查较弱,未能拒绝尺寸过小的ACE条目。