data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-93224 in the interactive tracker

CVE-2026-93224

svcrdma: Fix unmatched rn_unregister on failed accept

8.1 EPSS 0.5% AV:N

Published 2026-09-24 (24 days ago) by the Linux kernel CNA. Subsystem net/sunrpc. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-93224 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormnot affected6.1.190-1Nothing to do. bookworm never shipped the vulnerable code.
Debian 13trixiefixedDSA-6528-1 · 2026-09-29 · text6.12.111-1Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian 12bookworm · linux-6.12fixedDLA-4817-1 · 2026-10-04 · text6.12.111-1~deb12u1Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

When svc_rdma_accept() takes the errout path before rpcrdma_rn_register() has succeeded, the existing cleanup block calls rpcrdma_rn_unregister(dev, &newxprt->sc_rn) unconditionally. svcxprt_rdma is kzalloc'd, so on that path sc_rn.rn_index is 0 and sc_rn.rn_done is NULL; the unregister therefore xa_erase()s another caller's slot 0 and performs an unmatched kref_put() on the rpcrdma_device's rd_kref. The same errout also brackets the cleanup with svc_xprt_get()/ svc_xprt_put() around the kref_init() birth reference. The kref goes 1 -> 2 -> 1 and never reaches 0, so the svcxprt_rdma (and the net/ns_tracker it pinned) is leaked on every failed accept. rpcrdma_rn_register() writes rn->rn_done last, only after xa_alloc() and kref_get() have both succeeded, so rn_done == NULL is a natural "never registered" sentinel. Guard rpcrdma_rn_unregister() with an early return when rn_done is NULL, and clear rn_done before the matching xa_erase() so a repeated unregister is also a no-op. With that guard in place, the accept errout drops the kref_init() birth reference via svc_xprt_put(), which dispatches svc_rdma_free(). Teardown of sc_qp, sc_sq_cq, sc_rq_cq, and sc_pd runs under existing IS_ERR/NULL guards in svc_rdma_free(); sc_rn is covered by the new rn_done sentinel; sc_cm_id is non-NULL on every errout path because svc_rdma_accept() dereferences it above the first goto errout. svc_xprt_free() drops the module reference associated with the freed transport, and svc_handle_xprt() drops its pre-acquired reference when ->xpo_accept() returns NULL. Take a replacement module reference before svc_xprt_put() so the two module_put()s remain balanced. The rn_done guard also covers svc_rdma_free()'s non-listener call to rpcrdma_rn_unregister() for transports whose register attempt failed or never ran.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

net/sunrpc/xprtrdma/ib_client.c
net/sunrpc/xprtrdma/svc_rdma_transport.c

What this is
KERNEL NFSD, SUNRPC, AND LOCKD SERVERSMAINTAINERS section matched on net/sunrpc/ · linux-nfs@vger.kernel.org · Supported
Kernel module
rpcrdma

Check it on the machine

grep -wE 'CONFIG_SUNRPC|CONFIG_SUNRPC_XPRT_RDMA' /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w rpcrdma

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this as a loadable module. Every release below compiles it as a module on every flavour, so whether the code is in the running kernel depends on whether that module is loaded.

  • bookworm, trixie, forky, sid, bookworm · linux-6.12m
m
a loadable module on every flavour - check lsmod, can be blacklisted
Build switches
CONFIG_SUNRPC, CONFIG_SUNRPC_XPRT_RDMA
Reads as
all on means the file is compiled; any one off means it is not.

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-24 (24 days ago)source
CVSS
8.1 high
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
network (AV:N)source
EPSS
0.45%, higher than 37.9% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
net/sunrpc

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
6.12.356.12.1090335800071a6
6.166.18.505aabe070c00e
6.167.2.445a444a17240
6.167.326190394c64c
6.15.400

Debian advisories

AdvisoryDateShipped toDebian
DLA-4817-12026-10-04bookworm 6.12.111-1~deb12u1tracker
DSA-6528-12026-09-29trixie 6.12.111-1tracker

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:NAttack vector, network
svcrdma is nfsd's RPC-over-RDMA server; a remote peer over routable RoCEv2 or iWARP sends RDMA_CM CONNECT_REQUEST to svc_rdma_listen_handler/handle_connect_req, which queues newxprt so svc_handle_xprt calls svc_rdma_accept, whose errout invokes the unguarded rpcrdma_rn_unregister.
AC:HAttack complexity, high
The unmatched rpcrdma_rn_unregister in svc_rdma_accept errout runs only if rpcrdma_rn_register failed (RPCRDMA_RD_F_REMOVING or xa_alloc ENOMEM); a remote peer can send CONNECT_REQUEST but cannot unbind the IB device or force that GFP_KERNEL failure, and the UAF needs that in-progress rpcrdma_remove_one.
PR:NPrivileges required, none
RDMA_CM CONNECT_REQUEST handling in svc_rdma_listen_handler, handle_connect_req, and svc_rdma_accept runs before svc_process/svc_authenticate; the CM handshake has no RPC or NFS credential check, so an unauthenticated peer can drive the failed-accept errout.
UI:NUser interaction, none
Sending CONNECT_REQUEST to an NFS/RDMA listener already created via nfsd portlist is enough to reach svc_rdma_accept; racing ib_unregister_device is attack complexity, not a victim mount, click, or other user action.
S:UScope, unchanged
The wrong-slot rd_xa erase, unmatched rd_kref put, and any use-after-free of rpcrdma_device or the victim svcxprt_rdma's IB objects stay in the host kernel that runs nfsd/svcrdma; this is not a VM, IOMMU, or sandbox escape.
C:HConfidentiality impact, high
On pre-register errout, rpcrdma_rn_unregister xa_erase()s rd_xa index 0 (kzalloc'd sc_rn.rn_index) of another transport and kref_put()s rd_kref while rpcrdma_remove_one may walk the same xarray; that transport's sc_cm_id/QP and the kfree'd rpcrdma_device become reclaimable slab UAF reads.
I:HIntegrity impact, high
The extra kref_put can make rpcrdma_remove_one's refcount_dec_and_test skip wait_for_completion and kfree(rd) while a live transport later xa_erase/kref_put or QP/CM ops write through the freed rpcrdma_device or un-notified IB objects, a UAF write primitive.
A:HAvailability impact, high
A concurrent rpcrdma_remove_one that proceeds after the unmatched kref_put, or later QP/CM use of a transport whose slot-0 notification was erased, dereferences freed IB or rpcrdma_device memory and oopses or panics; any UAF is availability High per kernel CVSS guidance.