Cloudanix VulnDB

CVE-2026-89532

Critical · 9.1

CVSS

9.1

EPSS

0.5%

Published

Sep 11, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A flaw in Linux high-speed network file sharing can let an unauthenticated remote attacker crash the server and possibly read internal memory, taking storage services down until the machine is recovered.

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

What it actually does

An unsigned integer underflow in the Linux kernel NFS/RDMA server (svcrdma) macro pcl_for_each_segment treats a Write or Reply chunk with ch_segcount==0 as an inclusive upper bound of ch_segments[0xFFFFFFFF]. The loop then walks far past the chunk's flex array at sizeof(struct svc_rdma_segment) stride. When Send-With-Invalidate is negotiated, svc_rdma_get_inv_rkey iterates all PCLs and dereferences segment->rs_handle, turning the wrap into an out-of-bounds kernel read and a general protection fault. Confidentiality (kernel memory disclosure) and availability (host oops/panic) are affected; integrity and code execution are not indicated.

Why it matters to the business

Unauthenticated network attackers can crash Linux NFS-over-RDMA servers and may expose kernel memory, taking high-performance storage, HPC, and other NFSoRDMA-backed workloads offline until the host is recovered. CVSS 9.1 with network reachability and no privileges or user interaction means a single crafted RPC/RDMA message can interrupt production file service. The issue has been public for 34 days with no KEV listing, no ransomware use, and no known exploit maturity, but the kernel-level DoS and leak potential still warrant urgent patching wherever svcrdma is enabled.

How an attack unfolds

An attacker who can reach a Linux NFS server with the RDMA transport (svcrdma) enabled establishes an RPC/RDMA session that negotiates Send-With-Invalidate. They send a Write or Reply chunk list that advertises a chunk with zero segments. Kernel XDR checks only reject segment counts above rc_maxpages, so a zero count is accepted; pcl_alloc_write allocates a chunk with ch_segcount still 0 and links it onto rc_write_pcl or rc_reply_pcl before the fill loop (which runs zero times). Later, svc_rdma_get_inv_rkey walks every PCL with pcl_for_each_segment. For the empty chunk the inclusive bound wraps a u32 subtraction to 0xFFFFFFFF, the loop body reads unrelated kernel memory via rs_handle, and the host takes a general protection fault. The attacker obtains a reliable remote crash and, depending on what is read before the fault, may observe leaked kernel contents. No named threat actors or in-the-wild campaigns are associated with this issue.

How to fix it

Apply a Linux kernel update that includes the svcrdma fix: pcl_for_each_segment must use a half-open upper bound based on ch_segcount directly so a zero-segment chunk is a no-op instead of wrapping to 0xFFFFFFFF. Existing call sites in net/sunrpc/xprtrdma/svc_rdma_recvfrom.c and svc_rdma_rw.c do not require separate caller changes. Until the patched kernel is running, disable NFS-over-RDMA / unload svcrdma and xprtrdma if the service is not required, and restrict RDMA and NFS listeners to trusted fabrics. Reboot onto the patched kernel; there is no userspace-only workaround. Exact distro package versions were not supplied—use vendor kernel advisories that reference this svcrdma empty-chunk fix.

How to confirm the fix worked

Confirm the running kernel includes the half-open pcl_for_each_segment bound (ch_segcount used directly; empty chunks skip the loop). Inventory NFSoRDMA exposure: loaded svcrdma/xprtrdma/rpcrdma modules, nfsd RDMA listeners, and kernel config options such as CONFIG_SUNRPC_XPRT_RDMA / NFSD RDMA. After patching, boot the new kernel, verify uname -r against the advisory, and ensure svcrdma is the updated build. Spot-check that RDMA NFS still functions for legitimate clients and that empty or malformed chunk lists no longer oops the host. Hosts without RDMA NFS loaded are not exposed to this path.

Typical attack path

  1. Locate Linux NFS servers exposing the RDMA transport (svcrdma) on the RDMA fabric or related NFS/RDMA listeners.
  2. Complete RPC/RDMA connection setup so Send-With-Invalidate is negotiated.
  3. Deliver a Write or Reply chunk list containing a chunk whose advertised segment count is zero (accepted because checks only cap the maximum, not the minimum).
  4. Cause the server to collect invalidation rkeys, so pcl_for_each_segment walks the empty chunk and underflows its bound.
  5. Trigger an out-of-bounds kernel read of svc_rdma_segment fields (rs_handle), producing a GPF/oops and possible disclosure of adjacent kernel memory, denying NFS/RDMA service.

How to detect it

This bug leaves kernel-crash artifacts rather than a distinct userspace implant. Search dmesg, journalctl -k, /var/log/kern.log, /var/log/messages, kdump/vmcore, and panic console logs for general protection faults or oopses whose RIP or call trace includes svcrdma, especially svc_rdma_get_inv_rkey, pcl iteration, or net/sunrpc/xprtrdma/svc_rdma_recvfrom.c and svc_rdma_rw.c. Correlate timestamps with unexpected RPC/RDMA clients, Send-With-Invalidate sessions, and NFS RDMA traffic. A GPF while walking chunk lists after a zero-segment Write/Reply chunk is consistent with exploitation or accidental trigger; absence of such oopses does not prove the host was never probed, only that a faulting iteration may not have completed. Review NFS/RDMA connection logs and fabric logs for anomalous clients around any svcrdma crash. No named APT tooling is documented for this CVE.

  • svc_rdma_get_inv_rkey
  • svcrdma
  • net/sunrpc/xprtrdma/svc_rdma_recvfrom
  • net/sunrpc/xprtrdma/svc_rdma_rw
  • pcl_for_each_segment
  • general protection fault
  • Call Trace:.*svcrdma
  • RIP:.*svc_rdma
  • xprtrdma
  • Oops:.*svcrdma

What your security team should do

  • Patch and reboot Linux NFS RDMA servers first: CVSS 9.1, unauthenticated remote kernel OOB read and crash, public for 34 days.
  • Inventory every host with svcrdma, xprtrdma, or nfsd RDMA enabled; treat those as in-scope even if not in CISA KEV.
  • If NFSoRDMA is unused, blacklist/unload svcrdma and related RDMA RPC modules to remove the attack surface immediately.
  • Limit RDMA and NFS service reachability to trusted networks/fabrics until kernels are confirmed patched.
  • Watch kernel logs and crash dumps for svcrdma GPFs (especially svc_rdma_get_inv_rkey) as a sign of probing or pre-patch crashes.
  • Track vendor kernel advisories for the exact package that contains this pcl_for_each_segment fix; exploit maturity is currently None, so prioritize patching over emergency hunting unless oops evidence appears.

The record

In the Linux kernel, the following vulnerability has been resolved: svcrdma: Fix pcl_for_each_segment for empty chunks When a parsed chunk list contains a chunk whose ch_segcount is zero, pcl_for_each_segment computes its inclusive upper bound as &chunk->ch_segments[ch_segcount - 1]. ch_segcount is u32, so the subtraction wraps to 0xFFFFFFFF and the bound lands far past the ch_segments flex array. The loop body then walks unrelated memory at sizeof(struct svc_rdma_segment) stride until it faults. A zero-segcount chunk is reachable from the wire: xdr_check_write_chunk() only rejects segcount values greater than rc_maxpages, and pcl_alloc_write() links a freshly allocated chunk onto rc_write_pcl/rc_reply_pcl before its segment-fill loop runs, so a Write or Reply chunk advertising zero segments leaves ch_segcount == 0 on the list. When the transport has negotiated Send-With-Invalidate, svc_rdma_get_inv_rkey() iterates all four PCLs with pcl_for_each_segment and dereferences segment->rs_handle on each iteration, turning the underflow into an out-of-bounds read and a general protection fault. xdr_check_write_list / xdr_check_reply_chunk pcl_alloc_write() chunk = pcl_alloc_chunk(...) /* ch_segcount = 0 */ list_add_tail(&chunk->ch_list, &pcl->cl_chunks) /* fill loop iterates zero times for wire segcount 0 */ svc_rdma_get_inv_rkey() pcl_for_each_chunk(rc_write_pcl) pcl_for_each_segment(segment, chunk) pos <= &ch_segments[0u - 1u] /* 0xFFFFFFFF */ segment->rs_handle /* OOB read -> GPF */ Fix by switching the macro to a half-open upper bound that uses ch_segcount directly. For ch_segcount == 0 the loop start equals the loop end and the body is skipped; for ch_segcount > 0 the iteration range is unchanged. All six existing call sites in net/sunrpc/xprtrdma/svc_rdma_recvfrom.c and net/sunrpc/xprtrdma/svc_rdma_rw.c remain correct under the new bound, so no caller changes are needed.

Affected packages

Ecosystem Package Introduced Fixed