CVE-2026-31535Linux内核SMB客户端组件中存在一个竞态条件漏洞。该漏洞源于管理接收信用额度的逻辑存在缺陷,系统通过计算已发布的recv_io和授予的信用额度来进行管理。然而,由于对端可能已经消耗了信用额度,但在硬件接收传入数据与处理完成之间存在时间窗口,导致系统可能授予并不存在的信用额度。这可能导致系统资源耗尽或服务异常。
该漏洞位于Linux内核的SMB客户端(特别是涉及SMB Direct的部分)中。问题出在接收信用额度的管理逻辑上。原有的实现通过统计已发布的接收I/O请求和授予的信用额度来管理资源,这在多线程或异步处理环境下存在竞态条件。具体而言,当对端已经消耗了一个信用额度时,本地硬件可能刚刚接收到传入数据,但在内核调用`recv_done`函数处理该完成事件之间,存在一个时间窗口。在这个窗口期间,内核可能会错误地授予新的信用额度,而这些信用额度实际上已经被消耗或并不存在。这种逻辑错误会导致信用额度计数不准确,可能引发缓冲区溢出、空指针引用或内存耗尽,进而导致系统崩溃或拒绝服务。修复方案引入了一个专用的计数器来准确跟踪可用信用额度,仅在发布新的接收缓冲区时增加,在授予对端信用额度时减少,从而避免了竞态。