CRITICAL
isert LoginPDU Underflow
CVE-2026-53176
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
KernelScan AI8.6HIGH
01Description
In the Linux kernel, the following vulnerability has been resolved: IB/isert: Reject login PDUs shorter than ISER_HEADERS_LEN In drivers/infiniband/ulp/isert/ib_isert.c, isert_login_recv_done() computes the login request payload length as wc->byte_len minus ISER_HEADERS_LEN with no lower bound, and login_req_len is a signed int. A remote iSER initiator can post a login Send work request carrying fewer than ISER_HEADERS_LEN (76) bytes, so the subtraction underflows and login_req_len becomes negative. isert_rx_login_req() then reads that negative length back into a signed int, takes size = min(rx_buflen, MAX_KEY_VALUE_PAIRS), and because the min() is signed it keeps the negative value; the value is then passed as the memcpy() length and sign-extended to a multi-gigabyte size_t. The copy into the 8192-byte login->req_buf runs far out of bounds and faults, crashing the target node. The login phase precedes iSCSI authentication, so no credentials are required to reach this path. Reject any login PDU shorter than ISER_HEADERS_LEN before the subtraction, mirroring the existing early return on a failed work completion, so login_req_len can never go negative. The upper bound was already safe: a posted login buffer cannot deliver more than ISER_RX_PAYLOAD_SIZE, so the difference stays at or below MAX_KEY_VALUE_PAIRS and the existing min() clamps it; only the missing lower bound needs to be added.
02KernelScan AI Analysis
Risk summary
A remote attacker with no credentials can crash an iSCSI/iSER target node by sending a login PDU shorter than 76 bytes before any authentication occurs. The integer underflow causes a massive out-of-bounds memcpy that faults the kernel. No privileges or prior authentication are required to trigger this denial of service.
Vulnerability analysis
In isert_login_recv_done(), the login request payload length is computed as wc->byte_len minus ISER_HEADERS_LEN (76) with no lower-bound check. Because login_req_len is a signed int, a remote initiator sending fewer than 76 bytes causes the subtraction to produce a negative value. This negative value is later passed to isert_rx_login_req(), where min(rx_buflen, MAX_KEY_VALUE_PAIRS) is evaluated as a signed comparison and retains the negative value. When passed to memcpy() as the length argument, the negative int is sign-extended to a multi-gigabyte size_t, causing an out-of-bounds copy into the 8192-byte login->req_buf that faults and crashes the target. The fix adds an early return rejecting any PDU with wc->byte_len < ISER_HEADERS_LEN before the subtraction, preventing login_req_len from ever going negative. The attack surface is fully pre-authentication (the login phase precedes iSCSI authentication), so any network-reachable iSER target is vulnerable without credentials.
03Fix Versions
| Branch | Fixed in | Patch commit |
|---|---|---|
| 5.10 | 5.10.259 | 75ee6e4aa096 |
| 5.15 | 5.15.210 | e8a013c0c3ca |
| 6.1 | 6.1.176 | bd22740d7f14 |
| 6.12 | 6.12.94 | c5584e089b5a |
| 6.18 | 6.18.36 | df422fd273c9 |
| 6.6 | 6.6.143 | c1234229399f |
| 7.0 | 7.0.13 | 1ca40b243277 |
| mainline | 7.1 | 29e7b925ae6d |