Get a Demo

Let's Patch It!

Book a short call with one our specialists, we'll walk you through how Endor Patches work, and ask you a few questions about your environment (like your primary programming languages and repository management). We'll also send you an email right after you fill out the form, feel free to reply with any questions you have in advance!

CVE

CVE-2026-90413

IB/isert: reject login PDUs declaring more data than was received
Back to all
CVE

CVE-2026-90413

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

In the Linux kernel, the following vulnerability has been resolved:

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

isertloginrecv_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.  isertrxloginreq() copies min(loginreq_len,

MAXKEYVALUEPAIRS) bytes into login->reqbuf, and the login code then

reads the declared length back out of that buffer - for the first PDU in

iscsitargetlocate_portal(),

payloadlength = ntoh24(loginreq->dlength);

tmpbuf = kmemdupnul(login->reqbuf, payloadlength, GFPKERNEL);

and for the ones after it in iscsidecodetext_input(), reached from

iscsitargetdo_login().

login->reqbuf is a fixed MAXKEYVALUEPAIRS (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

   _asanmemcpy+0x23/0x60

   kmemdup_nul+0x43/0x80

   iscsitargetlocate_portal+0x48d/0x1180

   iscsitargetlogin_thread+0x19a9/0x3350

  Allocated by task 167:

   _kmalloccache_noprof+0x158/0x370

   iscsitargetlogin_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: isertloginwq iscsitargetdologinrx

   _asanmemcpy+0x23/0x60

   kmemdup_nul+0x43/0x80

   iscsidecodetext_input+0xc6/0x11c0

   iscsitargetdo_login+0x261/0x1470

   iscsitargetdologinrx+0x51d/0x7d0

iscsit over TCP is not exposed: iscsitgetlogin_rx() validates the

declared length with iscsitargetcheckloginrequest() 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 iscsitargetcheckloginrequest() at all.

Reject a login PDU whose declared DataSegmentLength exceeds what was

received, in both paths that reach isertrxlogin_req():

isertgetloginrx() for the first login PDU and isertloginrecvdone()

for the ones after it.  dlength <= loginreqlen 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 ISERRXPAYLOADSIZE, so loginreq_len cannot

exceed MAXKEYVALUEPAIRS and the min() in isertrxloginreq() is

loginreqlen.

Like the existing short-PDU check added by 29e7b925ae6d, the reject in

isertloginrecvdone() returns without completing loginreq_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.

Package Versions Affected

Package Version
patch Availability
No items found.

Automatically patch vulnerabilities without upgrading

Fix Without Upgrading
Detect compatible fix
Apply safe remediation
Fix with a single pull request

CVSS Version

Severity
Base Score
CVSS Version
Score Vector
C
H
U
9.1
-
3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
C
H
U
0
-
3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
C
H
U
-

Related Resources

No items found.

References

https://git.kernel.org/stable/c/0d9c0586af703890afe1bd0cfe641e3a3af1c32d, https://git.kernel.org/stable/c/228aaa620fe6a7bc8b5b21dd348b4836b1760c61, https://git.kernel.org/stable/c/2488b5b4827e5415768afc8daf097e8eb83c98df, https://git.kernel.org/stable/c/44fe800ec13386c88bd5b32bcd1deaa1e17535d5, https://git.kernel.org/stable/c/48812c8103071d550d9ab4a3431be5bdc52255bc, https://git.kernel.org/stable/c/71ec8bbfa4a183f1e623662f9cfbcd702e433bdb, https://git.kernel.org/stable/c/b1f3313e7b3e396e4985fea5c709477387e0a065, https://git.kernel.org/stable/c/c345d9d0b3eefc990bb90cf565325785aab06aab, https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/90xxx/CVE-2026-90413.json, https://nvd.nist.gov/vuln/detail/CVE-2026-90413, https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Severity

9.1

CVSS Score
0
10

Basic Information

Base CVSS
9.1
EPSS Probability
0.00818%
EPSS Percentile
0.56233%
Introduced Version
b8d26b3be8b33682cf163274ed07479a70554633,3.10.0,5.11.0,5.16.0,6.2.0,6.7.0,6.13.0,6.19.0,0
Fix Available
2488b5b4827e5415768afc8daf097e8eb83c98df,5.10.270,5.15.221,6.1.188,6.6.157,6.12.110,6.18.52,7.2.6,6.12.111-1~deb12u1,6.12.111-1,0:6.12.0-207.111.5.1.el9uek,0:6.12.0-207.111.5.1.el10uek

Fix Critical Vulnerabilities Instantly

Secure your app without upgrading.
Fix Without Upgrading