CVE-2026-31412Linux内核中的USB Gadget子系统f_mass_storage驱动程序存在一个整数溢出漏洞。该漏洞源于`check_command_size_in_blocks()`函数在计算数据大小时,未对移位操作进行溢出检查。当恶意USB主机发送请求大量数据的SCSI READ或WRITE命令时,左移操作可能发生回绕,导致数据大小被截断。这使得攻击者能够绕过边界检查,引发内存损坏或越界访问,从而可能影响系统的可用性。
该漏洞位于Linux内核的`drivers/usb/gadget/function/f_mass_storage.c`文件中。`check_command_size_in_blocks()`函数通过将`common->data_size_from_cmnd`左移`common->curlun->blkbits`位来计算以字节为单位的数据长度。由于代码未检查`data_size_from_cmnd`是否过大导致移位超出整数范围,攻击者可发送特制的SCSI命令(如READ/WRITE)触发溢出。例如,如果`data_size_from_cmnd`设置得足够大,左移后的结果会回绕成一个很小的正值。由于后续逻辑依赖此值进行缓冲区分配和边界检查,截断后的值将导致分配的缓冲区小于实际所需的数据量。当主机继续传输数据时,会发生堆或栈的越界写入,导致内存破坏,可能引发内核崩溃(拒绝服务)或在特定条件下实现代码执行。