CVE-2026-31557Linux内核中的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队列,避免在同一队列上发生嵌套刷新。