CVE-2026-31718Linux内核的ksmbd组件中存在一个释放后重用(Use-After-Free)漏洞。当持久文件句柄在会话断开(TCP关闭但未发送SMB2_LOGOFF)后仍然存活时,session_fd_check()会将fp->conn设置为NULL以保留句柄供稍后重连,但并未清理fp->lock_list上的字节范围锁。随后,当持久清理线程超时并调用__ksmbd_close_fd(NULL, fp)时,锁清理循环试图访问fp->conn->llist_lock。由于fp->conn已被置NULL且原始连接对象已被ksmbd_tcp_disconnect()释放,这导致了slab释放后重用漏洞。根本原因在于清理不对称,即fp->conn被置空时,锁条目仍残留在已释放的conn->lock_list上。
该漏洞源于Linux内核ksmbd模块在处理持久化文件句柄时的逻辑缺陷。当SMB会话非正常断开(如TCP连接断开)时,为了支持持久化重连,内核会保留文件句柄,将`fp->conn`指针置空,但忘记清理该文件句柄关联的字节范围锁(`fp->lock_list`)。这些锁仍然链接在旧连接对象的`lock_list`上。随后,持久化清理线程会定期检查这些孤立的句柄。当超时发生时,清理线程调用`__ksmbd_close_fd(NULL, fp)`尝试关闭文件描述符。在遍历锁列表进行清理时,代码尝试获取自旋锁`spin_lock(&fp->conn->llist_lock)`。由于此时`fp->conn`为NULL,且旧连接对象内存已被释放,访问`NULL->llist_lock`或已释放的内存会导致内核崩溃或潜在的任意代码执行。攻击者可通过发送特制的SMB请求,触发会话断开与持久化句柄超时的竞争条件,从而利用该释放后重用漏洞提升权限或导致拒绝服务。