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

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

CVE-2026-90423

RDMA/rxe: Fix UAF in ODP init error-handling path

7.8 EPSS 0.2% AV:L

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem drivers/infiniband. Debian urgency: unimportant.

What to do, per Debian release

Debian's own status for CVE-2026-90423 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 13trixienot affected6.12.113-1Nothing to do. trixie never shipped the vulnerable code.
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.

The vulnerability

What the bug is

rxe_odp_mr_init_user() stores &umem_odp->umem in mr->umem before calling rxe_odp_init_pages(). If rxe_odp_init_pages() fails, rxe_odp_mr_init_user() releases umem_odp and returns an error. rxe_reg_user_mr() then unwinds the error through rxe_cleanup(), rxe_mr_cleanup(), ib_umem_release(mr->umem). There is an IS_ERR_OR_NULL(umem) check at the start of ib_umem_release(). But since mr->umem is NOT reset to NULL in the error handling path of rxe_odp_mr_init_user(), the check passes and it reads already-freed fields like umem->is_dmabuf, causing UAF. Fix the UAF by clearing mr->umem after releasing the failed ODP umem so the MR cleanup path does not release it again.

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.

drivers/infiniband/sw/rxe/rxe_odp.c

What this is
SOFT-ROCE DRIVER (rxe)MAINTAINERS section matched on drivers/infiniband/sw/rxe/ · linux-rdma@vger.kernel.org · Supported
Kernel module
rdma_rxe

Check it on the machine

grep -wE 'CONFIG_INFINIBAND|CONFIG_INFINIBAND_ON_DEMAND_PAGING|CONFIG_RDMA_RXE' /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 rdma_rxe

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, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed. The build rule could not be established for 2 releases, so nothing is claimed about those.

  • bookworm, trixie?
  • forky, sidMnot built on amd64/cloud-amd64, arm64/cloud-arm64, armhf/armmp, armhf/armmp-lpae
?
not established - no Makefile entry for the affected file
M
a module where it is built at all; some flavours do not build it

Where a release above reads "not established", no build rule for the affected file was found in that release's kernel tree. That is a gap in this lookup, not a finding that the code is absent.

Build switches
CONFIG_INFINIBAND, CONFIG_INFINIBAND_ON_DEMAND_PAGING, CONFIG_RDMA_RXE
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-17 (31 days ago)source
CVSS
7.8 high
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.17%, higher than 6.3% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
unimportantsource
Subsystem
drivers/infiniband

Upstream fixes

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

IntroducedFixed inCommit
6.156.18.525f1933163327
6.157.2.64cfb448705da
6.157.351f2c8d2c99f

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:LAttack vector, local
The attacker-controlled bytes are cmd.access_flags (IB_ACCESS_ON_DEMAND), cmd.start and cmd.length from IB_USER_VERBS_CMD_REG_MR written to /dev/infiniband/uverbsN; ib_uverbs_write→ib_uverbs_reg_mr→rxe_reg_user_mr→rxe_odp_mr_init_user. Soft-RoCE packet receive never supplies that REG_MR command.
AC:LAttack complexity, low
rxe_odp_init_pages() fails when ib_umem_odp_map_dma_and_lock() returns an error from hmm_range_fault(); a second thread in the same process can munmap the REG_MR VA so rxe_ib_invalidate_range() keeps invalidating the mmu_interval until HMM_RANGE_DEFAULT_TIMEOUT (1000ms) expires with -EBUSY. The UAF on that error path is then deterministic.
PR:LPrivileges required, low
uverbs_devnode() publishes /dev/infiniband/uverbs* as 0666; ib_uverbs_open, ib_uverbs_get_context, ib_uverbs_alloc_pd and ib_uverbs_reg_mr have no capability checks, and rxe_init_device_param sets IBK_ON_DEMAND_PAGING so ib_check_mr_access() accepts IB_ACCESS_ON_DEMAND.
UI:NUser interaction, none
The attacker opens uverbs, allocates a PD, and issues REG_MR with IB_ACCESS_ON_DEMAND against a VA range they own; no other user must mount, open, or confirm anything.
S:UScope, unchanged
rxe_mr_cleanup() calls ib_umem_release() on the dangling mr->umem inside the same host kernel; this does not cross a KVM, Xen, or IOMMU boundary.
C:HConfidentiality impact, high
After ib_umem_odp_release() kfree's umem_odp, ib_umem_release(mr->umem) reads the freed umem->is_dmabuf and umem->is_odp; slab reuse lets the attacker control those flags and later pointers such as ibdev and owning_mm.
I:HIntegrity impact, high
The dangling mr->umem still has is_odp set, so ib_umem_release() calls ib_umem_odp_release() again and kfree's the already-freed umem_odp, a heap double-free write primitive.
A:HAvailability impact, high
The UAF load of umem->is_dmabuf in ib_umem_release() and the second free of umem_odp oops or KASAN-crash the kernel.