CVE-2026-64320
Critical · 9.1CVSS
9.1
EPSS
0.7%
Published
Jul 25, 2026
CISA due date
—
Cloudanix analysis
An unauthenticated system that can reach a Linux NVMe storage target may be able to read pieces of kernel memory or crash the storage server.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Exposure
- Component
- OS kernel
- Class
- Information Disclosure
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This is a pre-authentication out-of-bounds heap read in the Linux kernel NVMe-oF target discovery path. The vulnerable Discovery Get Log Page handler accepts a host-controlled 64-bit Log Page Offset and host-controlled transfer length, validates only 4-byte alignment, and then copies from `buffer + offset` back to the remote peer without verifying that the source range is inside the allocated discovery log buffer. A remote peer that can reach an NVMe target over TCP, RDMA, or Fibre Channel can read adjacent kernel heap memory, potentially exposing kernel pointers or sensitive in-kernel data. If the supplied offset points into unmapped kernel memory, the in-kernel copy can fault and crash or panic the target host.
Why it matters to the business
Systems acting as Linux NVMe-oF targets may expose kernel memory to any network or fabric peer that can reach the discovery controller, even before authentication or host authorization. The most likely business impacts are storage service disruption from kernel crashes and increased risk of follow-on exploitation if leaked kernel addresses or memory contents help bypass kernel hardening. The CVSS score is critical at 9.1 because exploitation is network-reachable, unauthenticated, low-complexity, and can affect both confidentiality and availability. EPSS is currently low and there is no known KEV listing or reported ransomware use, but the issue is only 16 days old and affects a high-value infrastructure role, so exposed NVMe-oF targets should still be prioritized.
How an attack unfolds
An attacker first identifies a Linux host exposing an NVMe-oF target discovery service over NVMe/TCP, NVMe/RDMA, or NVMe/FC. Because the discovery subsystem allows access before authentication, the attacker does not need valid credentials or an authorized host identity. The attacker connects as an NVMe host and sends a Discovery Get Log Page command with a Log Page Offset that is aligned but outside the allocated discovery log page buffer, along with a transfer length large enough to copy data beyond the end of that buffer. The kernel target code constructs the discovery log in a small heap allocation and then copies from the attacker-selected out-of-bounds source address into the response SGL, returning adjacent kernel heap contents to the attacker. By varying offsets and lengths, the attacker may collect kernel pointers or other memory fragments. If the attacker chooses an offset that resolves to invalid kernel memory, the copy path can trigger an oops or panic, causing denial of service on the storage target.
How to fix it
Apply the Linux kernel update from the relevant distribution or kernel vendor that includes the fix for the NVMe target Discovery Get Log Page bounds check. Where exact package versions are not available, track vendor advisories for this CVE and update to the first fixed kernel release or later. The corrected implementation should validate the host-supplied offset against the discovery log page size, cap the copy length to available data, and zero-fill any remainder instead of copying from memory beyond the allocated buffer. Until patched, restrict access to NVMe-oF target fabrics: firewall or ACL NVMe/TCP exposure, especially port 4420; isolate RDMA storage networks; enforce Fibre Channel zoning; limit discovery access to trusted initiators; and disable the NVMe target service or discovery subsystem on systems that do not require it. Because exploitation can crash the kernel, schedule remediation with storage failover and maintenance procedures in mind.
How to confirm the fix worked
Confirm exposure by identifying systems with the Linux NVMe target stack enabled, such as loaded `nvmet`, `nvmet_tcp`, `nvmet_rdma`, or `nvmet_fc` modules and configured NVMe target subsystems under configfs. Confirm remediation by checking the installed kernel package against the vendor advisory for this vulnerability, or by verifying that the kernel source for `nvmet_execute_disc_get_log_page()` validates `lpo` against the allocated discovery log size and limits or zero-fills overlong responses. In a non-production lab, a patched target should safely handle an oversized but aligned Discovery Get Log Page offset without returning adjacent heap data and without triggering an oops or panic. For NVMe/TCP, also validate that untrusted networks cannot connect to the target discovery listener, commonly on TCP port 4420.
Typical attack path
- Discover NVMe-oF target exposure over TCP, RDMA, or Fibre Channel; for NVMe/TCP, the default service port is commonly 4420.
- Connect to the NVMe discovery subsystem as an unauthenticated NVMe host.
- Issue a Discovery Get Log Page request with a 4-byte-aligned but out-of-range Log Page Offset.
- Set a response length that causes the target to copy memory beyond the allocated discovery log page buffer.
- Receive leaked kernel heap contents in the Get Log Page response, or intentionally choose invalid offsets to crash the target.
- Use leaked kernel addresses or memory contents to aid further kernel exploitation, or repeat requests to create storage service instability.
How to detect it
Successful memory disclosure may not produce an application-level log entry, so detection should combine exposure review, network/fabric telemetry, and kernel crash analysis. Review kernel logs from `journalctl -k`, `/var/log/kern.log`, `/var/log/messages`, and crash dumps for oops, panic, page fault, or general protection fault traces containing NVMe target functions such as `nvmet_execute_disc_get_log_page` or `nvmet_copy_to_sgl`. For NVMe/TCP, inspect firewall, NetFlow, packet capture, and load balancer records for unexpected connections to the NVMe discovery service, commonly TCP/4420, especially from non-storage networks. For RDMA and Fibre Channel, review fabric controller, switch, zoning, and initiator login records for unfamiliar peers accessing discovery. If protocol-aware telemetry is available, alert on Discovery Get Log Page commands with a nonzero or unusually large Log Page Offset, offsets greater than the expected discovery log size, or repeated discovery log requests with varying offsets and large transfer lengths. Treat unexplained target kernel crashes temporally correlated with NVMe discovery traffic as suspicious. Because leaked data is returned inside normal NVMe command responses, packet captures or NVMe protocol logs are the most reliable way to confirm exploitation when no crash occurred.
- nvmet_execute_disc_get_log_page
- nvmet_copy_to_sgl
- nvmet_tcp
- nvmet_rdma
- nvmet_fc
- Discovery Get Log Page
- Log Page Offset
- Get Log Page
- TCP/4420
- port 4420
- BUG: kernel NULL pointer dereference
- Oops:
- general protection fault
- unable to handle page fault
- kernel panic
- /sys/kernel/config/nvmet
- /sys/kernel/config/nvmet/subsystems/nqn.2014-08.org.nvmexpress.discovery
What your security team should do
- Inventory Linux systems acting as NVMe-oF targets and prioritize any reachable over TCP, RDMA, or Fibre Channel from non-storage or less trusted networks.
- Patch affected Linux kernels as soon as vendor-fixed builds are available; treat internet- or enterprise-network-reachable NVMe/TCP targets as urgent despite currently low EPSS.
- Immediately restrict NVMe-oF discovery access to trusted initiators using firewalls, storage-network segmentation, RDMA isolation, and Fibre Channel zoning.
- Review kernel logs for oops, panic, page fault, or general protection fault events involving `nvmet_execute_disc_get_log_page` or `nvmet_copy_to_sgl`.
- Monitor NVMe/TCP connections, especially to port 4420, for unfamiliar initiator addresses or spikes in discovery commands.
- If suspicious access or crashes are observed, preserve kernel logs, storage fabric logs, packet captures if available, and volatile incident-response data before rebooting where operationally feasible.
- Disable NVMe target functionality on systems that do not explicitly require it.
The record
In the Linux kernel, the following vulnerability has been resolved: nvmet: fix pre-auth out-of-bounds heap read in Discovery Get Log Page nvmet_execute_disc_get_log_page() validates only the dword alignment of the host-supplied Log Page Offset (lpo). The 64-bit offset is then added to a small kzalloc'd buffer that holds the discovery log page and the result is passed straight to nvmet_copy_to_sgl(), which memcpy()s data_len bytes out to the host with no source-side bound check: u64 offset = nvmet_get_log_page_offset(req->cmd); /* 64-bit host */ size_t data_len = nvmet_get_log_page_len(req->cmd); /* 32-bit host */ ... if (offset & 0x3) { ... } /* only check */ ... alloc_len = sizeof(*hdr) + entry_size * discovery_log_entries(req); buffer = kzalloc(alloc_len, GFP_KERNEL); ... status = nvmet_copy_to_sgl(req, 0, buffer + offset, data_len); The Discovery controller is unauthenticated -- nvmet_host_allowed() returns true unconditionally for the discovery subsystem -- so the call is reachable pre-authentication by any TCP/RDMA/FC peer that can reach the nvmet target. With a discovery log page of ~1 KiB, an attacker requesting up to 4 KiB starting at offset == alloc_len reads the next slab page out and gets its content returned over the fabric (an empirical run on a default nvmet-tcp loopback target leaked 81 canonical kernel pointers in one Get Log Page response). Pointing the offset at unmapped kernel memory faults the in-kernel memcpy and crashes (or panics, on panic_on_oops=1) the target host instead. The attacker-controlled source-side offset pattern "nvmet_copy_to_sgl(req, 0, buffer + ATTACKER_OFFSET, ...)" is unique to nvmet_execute_disc_get_log_page in the entire nvmet codebase: every other Get Log Page handler in admin-cmd.c either ignores lpo (and silently starts every response at offset 0) or tracks a local destination offset with a fixed source pointer. Validate the host-supplied offset against the log page size, cap the copy length to what is actually available, and zero-fill any remainder of the host transfer buffer. The zero-fill matches the existing short-response pattern in nvmet_execute_get_log_changed_ns() (admin-cmd.c) and prevents leaking transport SGL contents when the host asks for more bytes than the log page contains.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|