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

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

CVE-2026-90413

IB/isert: reject login PDUs declaring more data than was received

9.1 EPSS 0.8% AV:N

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

What to do, per Debian release

Debian's own status for CVE-2026-90413 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 12bookwormfixedDLA-4841-1 · 2026-10-17 · text6.1.190-1Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts.
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

isert_login_recv_done() records how many bytes the HCA actually placed in the login buffer, but nothing compares that against the length the login PDU's BHS declares. isert_rx_login_req() copies min(login_req_len, MAX_KEY_VALUE_PAIRS) bytes into login->req_buf, and the login code then reads the declared length back out of that buffer - for the first PDU in iscsi_target_locate_portal(), payload_length = ntoh24(login_req->dlength); tmpbuf = kmemdup_nul(login->req_buf, payload_length, GFP_KERNEL); and for the ones after it in iscsi_decode_text_input(), reached from iscsi_target_do_login(). login->req_buf is a fixed MAX_KEY_VALUE_PAIRS (8192) byte allocation, so an initiator that declares more than it sends reads off the end of it, before authentication and with the length under its control: BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43/0x80 Read of size 8193 at addr ffff8881056a8000 by task iscsi_np/167 __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_target_locate_portal+0x48d/0x1180 iscsi_target_login_thread+0x19a9/0x3350 Allocated by task 167: __kmalloc_cache_noprof+0x158/0x370 iscsi_target_login_thread+0x971/0x3350 which belongs to the cache kmalloc-8k of size 8192 allocated 8192-byte region Falsifying the second login PDU instead reaches the other reader, on the same buffer: BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43/0x80 Read of size 8193 at addr ffff888104d10000 by task kworker/1:1/50 Workqueue: isert_login_wq iscsi_target_do_login_rx __asan_memcpy+0x23/0x60 kmemdup_nul+0x43/0x80 iscsi_decode_text_input+0xc6/0x11c0 iscsi_target_do_login+0x261/0x1470 iscsi_target_do_login_rx+0x51d/0x7d0 iscsit over TCP is not exposed: iscsit_get_login_rx() validates the declared length with iscsi_target_check_login_request() and then reads exactly that many bytes off the socket, so the declared length governs how much arrives rather than how much is copied out of an already-filled buffer. isert does not call iscsi_target_check_login_request() at all. Reject a login PDU whose declared DataSegmentLength exceeds what was received, in both paths that reach isert_rx_login_req(): isert_get_login_rx() for the first login PDU and isert_login_recv_done() for the ones after it. dlength <= login_req_len is allowed because the received count can include up to three bytes of iSCSI padding. Once the check is in place the copy out can no longer exceed the copy in: the posted login SGE is ISER_RX_PAYLOAD_SIZE, so login_req_len cannot exceed MAX_KEY_VALUE_PAIRS and the min() in isert_rx_login_req() is login_req_len. Like the existing short-PDU check added by 29e7b925ae6d, the reject in isert_login_recv_done() returns without completing login_req_comp, so a malformed subsequent PDU leaves the login to be torn down by the login timer rather than failing immediately. The first-PDU path returns an error and fails straight away. Reproduced on 7.2.0-rc4 with soft-RoCE (rdma_rxe) under KASAN, using an initiator that sends the real key=value payload while declaring 8193 in the BHS, on the first login PDU and on the second in separate runs. The reported read size tracks the declared value exactly; 16384 and 61440 behave the same. Unpatched 3 of 3 runs report on each of the two paths, patched 0 of 3 on both, run alternately in a single session, and a normal login still completes on the patched build.

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/ulp/isert/ib_isert.c

What this is
ISCSI EXTENSIONS FOR RDMA (ISER) TARGETMAINTAINERS section matched on drivers/infiniband/ulp/isert · linux-rdma@vger.kernel.org · Supported
Kernel module
ib_isert

Check it on the machine

grep -wE 'CONFIG_INFINIBAND|CONFIG_INFINIBAND_ISERT' /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 ib_isert

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.

  • bookworm, trixie, forky, sid, bookworm · linux-6.12Mnot built on amd64/cloud-amd64, arm64/cloud-arm64
M
a module where it is built at all; some flavours do not build it
Build switches
CONFIG_INFINIBAND, CONFIG_INFINIBAND_ISERT
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
9.1 critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Hsource recompute it
Attack vector
network (AV:N)source
EPSS
0.82%, higher than 56.4% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
drivers/infiniband

Upstream fixes

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

IntroducedFixed inCommit
3.105.10.270b1f3313e7b3e
3.105.15.221228aaa620fe6
3.106.1.1880d9c0586af70
3.106.6.15744fe800ec133
3.106.12.11071ec8bbfa4a1
3.106.18.52c345d9d0b3ee
3.107.2.648812c810307
3.107.32488b5b4827e

Debian advisories

AdvisoryDateShipped toDebian
DLA-4841-12026-10-17bookworm 6.1.190-1tracker
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
The forged length is the iSCSI Login Request BHS DataSegmentLength (hdr->dlength) delivered in an RDMA Send that completes in isert_login_recv_done(); isert_setup_id() rdma_bind_addr()/rdma_listen()s that portal on an IP sockaddr with RDMA_PS_TCP (RoCEv2/iWARP), so the bytes arrive on a routable IP transport.
AC:LAttack complexity, low
The initiator sets dlength independently of wc->byte_len. isert_rx_login_req() copies only min(login_req_len, MAX_KEY_VALUE_PAIRS) into login->req_buf, then iscsi_target_locate_portal()/iscsi_decode_text_input() pass ntoh24(dlength) to kmemdup_nul(); declared lengths 8193, 16384 and 61440 hit with no race.
PR:NPrivileges required, none
iscsi_target_locate_portal() runs in iscsi_target_login_thread() immediately after isert_get_login_rx() returns the first Login Request, before iscsi_target_start_negotiation() or CHAP; isert_connect_request() accepts the RDMA CM CONNECT_REQUEST whenever np->enabled, with no credentials.
UI:NUser interaction, none
The attacker itself performs the RDMA CM connect and sends the crafted Login Request; no local user action is required once the isert portal is already listening.
S:UScope, unchanged
kmemdup_nul() over-reads the host kernel's login->req_buf in iscsi_target_locate_portal() and iscsi_decode_text_input() on the iSER target; the impact stays in that kernel and does not cross a guest/host or IOMMU boundary.
C:HConfidentiality impact, high
ntoh24(login_req->dlength) is a 24-bit attacker-chosen size passed to kmemdup_nul(login->req_buf, payload_length), which memcpy-reads that many bytes from the 8192-byte req_buf object, an unbounded slab-out-of-bounds read of adjacent kernel memory rather than a few-byte leak.
I:NIntegrity impact, none
kmemdup_nul() writes only into a newly allocated tmpbuf of size payload_length+1, so the bug is a source over-read of req_buf, not a write into neighboring objects; parsing that copy as key=value does not give the initiator an attacker-controlled kernel write.
A:HAvailability impact, high
KASAN reports a slab-out-of-bounds read in kmemdup_nul() from iscsi_target_locate_portal() on the first PDU and from iscsi_decode_text_input() on later PDUs; a declared length of 61440 walks tens of kilobytes past the kmalloc-8k object and faults the target.