Cloudanix VulnDB

CVE-2026-46304

High · 7.5

CVSS

7.5

EPSS

0.3%

Published

Jun 8, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A flaw in Linux storage networking can let someone disrupt affected storage servers by triggering a kernel hang during connection cleanup.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Low
Impact
Denial Of Service
Component
OS kernel
Class
Denial of service
Remediation
Patch
Effort
Medium
Patch risk
Medium

What it actually does

This flaw affects the Linux kernel NVMe target over TCP code path. During NVMe/TCP queue teardown, nvmet_tcp_release_queue_work can run on the nvmet-wq workqueue and drop the final controller reference. That can invoke nvmet_ctrl_free(), which attempts to flush ctrl->async_event_work on the same nvmet-wq. Flushing work from the same workqueue can create a recursive workqueue dependency and potential deadlock. The practical technical impact is loss of availability of the affected NVMe target path, potentially causing hung kernel worker threads, stalled NVMe target cleanup, degraded storage service behavior, or system instability under trigger conditions involving NVMe/TCP connection creation and teardown.

Why it matters to the business

Systems acting as Linux NVMe-over-TCP storage targets may become unstable or unavailable if the vulnerable teardown path is triggered. For organizations using NVMe/TCP for storage services, this can disrupt storage access, cause application outages, require node reboots, and affect service-level commitments. The issue is not currently listed in CISA KEV, is not known to be used in ransomware campaigns, has low EPSS, and has no public exploit maturity reported, but the CVSS availability impact is high and exposed NVMe/TCP targets should still be prioritized because storage-plane outages can have broad operational consequences.

How an attack unfolds

An attacker who can reach an exposed NVMe/TCP target service would attempt to trigger repeated NVMe/TCP controller, discovery, or queue setup and teardown activity. By causing a queue release while asynchronous controller event work is pending on the same nvmet workqueue, the attacker may cause the kernel to enter the vulnerable teardown sequence where nvmet_ctrl_free() flushes work already associated with nvmet-wq. On vulnerable kernels, this can lead to a recursive workqueue dependency and potential deadlock, resulting in denial of service for the NVMe/TCP target path or broader kernel instability. No confirmed in-the-wild exploitation or named threat actor activity is provided for this vulnerability.

How to fix it

Apply a Linux kernel update that includes the upstream fix for the NVMe target change described as avoiding recursive nvmet-wq flush in nvmet_ctrl_free. Because no affected product list or exact fixed versions were provided, use the patched kernel packages supplied by the relevant Linux distribution, appliance vendor, cloud image provider, or kernel maintainer. Prioritize systems that load or use nvmet and nvmet_tcp modules or expose NVMe/TCP target services. If immediate patching is not possible, reduce exposure by disabling NVMe/TCP target functionality where not required, unloading nvmet_tcp if safe to do so, restricting access to NVMe/TCP ports to trusted initiators only, and applying firewall or network ACL controls around TCP port 4420 and any custom NVMe/TCP service ports. Avoid exposing NVMe/TCP target services directly to untrusted networks.

How to confirm the fix worked

Confirm the running kernel includes the vendor fix by checking the installed kernel package changelog, vendor advisory, or upstream commit history for the nvmet fix that avoids recursive nvmet-wq flush in nvmet_ctrl_free. Verify that hosts using NVMe/TCP have been rebooted into the fixed kernel, not merely had packages installed. Check whether nvmet_tcp is loaded with lsmod or equivalent tooling, and verify active NVMe/TCP listeners with ss, netstat, or service configuration review. For exposure validation, confirm TCP port 4420 or any configured NVMe/TCP target port is not reachable from untrusted networks. In test environments, controlled NVMe/TCP connect/disconnect regression testing should no longer produce kernel lockdep warnings mentioning recursive locking, nvmet-wq, or nvmet_tcp_release_queue_work.

Typical attack path

  1. Identify a Linux host exposing NVMe/TCP target functionality, commonly on TCP port 4420 or another configured NVMe/TCP port.
  2. Connect to the NVMe/TCP discovery or target service and initiate controller/session activity.
  3. Trigger rapid or repeated disconnects, queue teardown, or controller removal conditions.
  4. Attempt to align teardown with pending asynchronous NVMe target event work on the nvmet-wq workqueue.
  5. Cause the vulnerable recursive workqueue flush condition, potentially hanging kernel workqueue processing or degrading NVMe/TCP target availability.
  6. Repeat the activity to sustain or amplify storage service disruption.

How to detect it

Look for evidence of exploitation or attempted triggering in kernel logs, system journals, storage service telemetry, and network logs around NVMe/TCP activity. Useful sources include dmesg, /var/log/kern.log, /var/log/messages, journalctl -k, audit logs for kernel module loading, firewall logs, and network telemetry for TCP connections to NVMe/TCP ports such as 4420. Focus on bursts of NVMe/TCP discovery, controller creation, controller removal, disconnects, and repeated connections from the same source followed by kernel warnings, workqueue stalls, blocked tasks, or storage target unavailability. Because no public exploit-specific payload or actor tooling is provided, detection should rely on behavioral correlation: remote NVMe/TCP connection churn plus kernel messages referencing nvmet-wq, nvmet_tcp_release_queue_work, recursive locking, deadlock, or blocked kworkers. Review logs for the period since publication and especially around any storage outage or unexplained reboot.

  • WARNING: possible recursive locking detected
  • *** DEADLOCK ***
  • (wq_completion)nvmet-wq
  • Workqueue: nvmet-wq nvmet_tcp_release_queue_work
  • nvmet_tcp_release_queue_work
  • nvmet_ctrl_free
  • flush_work(&ctrl->async_event_work)
  • nvmet_add_async_event
  • queue_work(nvmet_wq, &ctrl->async_event_work)
  • nvmet_tcp: enabling port
  • nvmet: Created discovery controller
  • Removing ctrl: NQN
  • nqn.2014-08.org.nvmexpress.discovery
  • TCP/4420

What your security team should do

  • Inventory Linux systems that provide NVMe-over-TCP target services or have nvmet/nvmet_tcp modules enabled.
  • Patch and reboot exposed NVMe/TCP target systems to a kernel version containing the fix from the operating system or appliance vendor.
  • Restrict NVMe/TCP access to trusted initiator networks only; block TCP port 4420 and custom NVMe/TCP ports from untrusted networks.
  • Review kernel logs for historical signs of recursive locking, nvmet-wq deadlocks, or NVMe/TCP controller teardown instability.
  • Increase monitoring on storage target nodes for kernel worker hangs, blocked tasks, NVMe/TCP disconnect storms, and storage latency or availability degradation.
  • If patching must be delayed, disable NVMe/TCP target functionality where business operations permit.
  • Track vendor advisories because exact fixed package versions vary by distribution and kernel branch.

The record

In the Linux kernel, the following vulnerability has been resolved: nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free nvmet_tcp_release_queue_work() runs on nvmet-wq and can drop the final controller reference through nvmet_cq_put(). If that triggers nvmet_ctrl_free(), the teardown path flushes ctrl->async_event_work on the same nvmet-wq. Call chain: nvmet_tcp_schedule_release_queue() kref_put(&queue->kref, nvmet_tcp_release_queue) nvmet_tcp_release_queue() queue_work(nvmet_wq, &queue->release_work) <--- nvmet_wq process_one_work() nvmet_tcp_release_queue_work() nvmet_cq_put(&queue->nvme_cq) nvmet_cq_destroy() nvmet_ctrl_put(cq->ctrl) nvmet_ctrl_free() flush_work(&ctrl->async_event_work) <--- nvmet_wq Previously Scheduled by :- nvmet_add_async_event queue_work(nvmet_wq, &ctrl->async_event_work); This trips lockdep with a possible recursive locking warning. [ 5223.015876] run blktests nvme/003 at 2026-04-07 20:53:55 [ 5223.061801] loop0: detected capacity change from 0 to 2097152 [ 5223.072206] nvmet: adding nsid 1 to subsystem blktests-subsystem-1 [ 5223.088368] nvmet_tcp: enabling port 0 (127.0.0.1:4420) [ 5223.126086] nvmet: Created discovery controller 1 for subsystem nqn.2014-08.org.nvmexpress.discovery for NQN nqn.2014-08.org.nvmexpress:uuid:0f01fb42-9f7f-4856-b0b3-51e60b8de349. [ 5223.128453] nvme nvme1: new ctrl: NQN "nqn.2014-08.org.nvmexpress.discovery", addr 127.0.0.1:4420, hostnqn: nqn.2014-08.org.nvmexpress:uuid:0f01fb42-9f7f-4856-b0b3-51e60b8de349 [ 5233.199447] nvme nvme1: Removing ctrl: NQN "nqn.2014-08.org.nvmexpress.discovery" [ 5233.227718] ============================================ [ 5233.231283] WARNING: possible recursive locking detected [ 5233.234696] 7.0.0-rc3nvme+ #20 Tainted: G O N [ 5233.238434] -------------------------------------------- [ 5233.241852] kworker/u192:6/2413 is trying to acquire lock: [ 5233.245429] ffff888111632548 ((wq_completion)nvmet-wq){+.+.}-{0:0}, at: touch_wq_lockdep_map+0x26/0x90 [ 5233.251438] but task is already holding lock: [ 5233.255254] ffff888111632548 ((wq_completion)nvmet-wq){+.+.}-{0:0}, at: process_one_work+0x5cc/0x6e0 [ 5233.261125] other info that might help us debug this: [ 5233.265333] Possible unsafe locking scenario: [ 5233.269217] CPU0 [ 5233.270795] ---- [ 5233.272436] lock((wq_completion)nvmet-wq); [ 5233.275241] lock((wq_completion)nvmet-wq); [ 5233.278020] *** DEADLOCK *** [ 5233.281793] May be due to missing lock nesting notation [ 5233.286195] 3 locks held by kworker/u192:6/2413: [ 5233.289192] #0: ffff888111632548 ((wq_completion)nvmet-wq){+.+.}-{0:0}, at: process_one_work+0x5cc/0x6e0 [ 5233.294569] #1: ffffc9000e2a7e40 ((work_completion)(&queue->release_work)){+.+.}-{0:0}, at: process_one_work+0x1c5/0x6e0 [ 5233.300128] #2: ffffffff82d7dc40 (rcu_read_lock){....}-{1:3}, at: __flush_work+0x62/0x530 [ 5233.304290] stack backtrace: [ 5233.306520] CPU: 4 UID: 0 PID: 2413 Comm: kworker/u192:6 Tainted: G O N 7.0.0-rc3nvme+ #20 PREEMPT(full) [ 5233.306524] Tainted: [O]=OOT_MODULE, [N]=TEST [ 5233.306525] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 [ 5233.306527] Workqueue: nvmet-wq nvmet_tcp_release_queue_work [nvmet_tcp] [ 5233.306532] Call Trace: [ 5233.306534] <TASK> [ 5233.306536] dump_stack_lvl+0x73/0xb0 [ 5233.306552] print_deadlock_bug+0x225/0x2f0 [ 5233.306556] __lock_acquire+0x13f0/0x2290 [ 5233.306563] lock_acquire+0xd0/0x300 [ 5233.306565] ? touch_wq_lockdep_map+0x26/0x90 [ 5233.306571] ? __flush_work+0x20b/0x530 [ 5233.306573] ? touch_wq_lockdep_map+0x26/0x90 [ 5233.306577] touch_wq_lockdep_map+0x3b/0x90 [ 5233.306580] ? touch_wq_lockdep_map+0x26/0x90 [ 52 ---truncated---

Affected packages

Ecosystem Package Introduced Fixed
openSUSE:Tumbleweed kernel-source 0 7.0.12-1.1

Related vulnerabilities