IPBUF安全漏洞报告
English
CVE-2026-31557 CVSS 7.5 高危

CVE-2026-31557 Linux内核nvmet工作队列死锁漏洞

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

漏洞信息

漏洞编号
CVE-2026-31557
漏洞类型
拒绝服务
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

拒绝服务Linux内核死锁nvmetCVE-2026-31557

漏洞概述

Linux内核中的nvme over fabrics target (nvmet)组件存在一处拒绝服务漏洞。该漏洞源于nvmet_ctrl_free()函数尝试在nvmet-wq工作队列上刷新异步事件工作项时,发生了递归锁定。这一问题主要发生在RDMA连接管理路径中,当工作队列处理释放操作时,尝试重新获取已被持有的锁,导致死锁。成功利用此漏洞的攻击者可导致目标服务器内核工作队列挂起,进而引发系统崩溃或无响应,严重影响服务可用性。

技术细节

该漏洞的核心在于Linux内核nvmet驱动程序中工作队列的处理逻辑错误。在正常的异步事件处理流程中,nvmet_execute_async_event()会将工作加入nvmet-wq队列。当断开连接时,RDMA CM处理路径会调用nvmet_rdma_queue_disconnect(),进而将release_work加入同一nvmet-wq队列。问题出现在process_one_work()处理release_work时,它会调用nvmet_rdma_release_queue_work(),最终触发nvmet_ctrl_put()和nvmet_ctrl_free()。在nvmet_ctrl_free()内部,代码调用了flush_work(&ctrl->async_event_work)。由于async_event_work也挂载在nvmet-wq上,flush操作试图获取当前工作线程已持有的锁,导致死锁。Lockdep检测到了这种可能的递归锁定,警告系统处于不稳定状态。修复方案是将异步事件工作移至专用的nvmet-aen-wq队列,避免在同一队列上发生嵌套刷新。

攻击链分析

STEP 1
1. 建立连接
攻击者通过网络(RDMA)连接到受影响的Linux主机上的NVMe-oF目标服务。
STEP 2
2. 触发异步事件
在连接过程中,诱导系统在nvmet-wq上排队异步事件工作项。
STEP 3
3. 触发断开连接
攻击者发起断开连接请求,触发RDMA CM路径的清理流程。
STEP 4
4. 工作队列处理
nvmet-wq上的工作线程开始处理队列释放工作,调用nvmet_ctrl_free()。
STEP 5
5. 递归锁定
nvmet_ctrl_free()尝试刷新同一nvmet-wq上的异步事件工作,导致工作线程尝试对自己持有的锁加锁,形成死锁。
STEP 6
6. 系统拒绝服务
内核工作队列挂起,导致相关内核功能停止响应,系统可能崩溃或失去响应。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ PoC for CVE-2026-31557 (Conceptual) This script simulates rapid connect/disconnect cycles to an NVMe-oF target over RDMA to trigger the deadlock condition in nvmet_ctrl_free(). Requires nvme-cli and a configured RDMA target. """ import os import time import subprocess TARGET_IP = "192.168.1.100" TARGET_PORT = "4420" def trigger_disconnect(): try: # Connect to the target print("[*] Connecting to target...") connect_cmd = f"nvme connect -t rdma -a {TARGET_IP} -s {TARGET_PORT} -n testnqn" subprocess.run(connect_cmd, shell=True, check=True) # Wait briefly to ensure async events might be queued time.sleep(0.5) # Force disconnect to trigger the release work path print("[*] Triggering disconnect...") disconnect_cmd = "nvme disconnect -d nvme0" subprocess.run(disconnect_cmd, shell=True, check=True) print("[+] Cycle complete. Check kernel logs for deadlock.") except Exception as e: print(f"[-] Error: {e}") if __name__ == "__main__": for i in range(10): trigger_disconnect() time.sleep(0.1)

影响范围

Linux Kernel (Mainline)
Linux Kernel (Stable branches prior to commits 25ceffc1dabec3b93f458b437aae26f4da293f87, 2922e3507f6d5caa7f1d07f145e186fc6f317a4e, etc.)

防御指南

临时缓解措施
建议立即升级Linux内核。如果无法立即升级,应严格限制对NVMe-oF端点的网络访问,仅允许可信的主机网络连接,并监控内核日志中是否存在Lockdep警告。

参考链接

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