{"id":25823,"date":"2026-09-18T04:31:56","date_gmt":"2026-09-17T20:31:56","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90414"},"modified":"2026-09-18T04:31:56","modified_gmt":"2026-09-17T20:31:56","slug":"cve-2026-90414","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90414","title":{"rendered":"CVE-2026-90414 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nIB\/isert: reject PDUs"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>IB\/isert: reject PDUs declaring more data than was received<\/p>\n<p>isert_recv_done() hands each received PDU to the opcode handlers without<br \/>\never looking at wc-&gt;byte_len, the number of bytes the HCA actually placed<br \/>\nin the receive descriptor. The handlers then copy that many bytes &#8211; the<br \/>\ndata-segment length the initiator declared in the BHS<br \/>\n(ntoh24(hdr-&gt;dlength), via the derived unsol_data_len \/ imm_data_len) &#8211;<br \/>\nout of the fixed-size descriptor:<\/p>\n<p>  isert_handle_iscsi_dataout():<br \/>\n        sg_copy_from_buffer(sg_start, sg_nents, isert_get_data(rx_desc),<br \/>\n                            unsol_data_len);<br \/>\n  isert_handle_scsi_cmd():<br \/>\n        sg_copy_from_buffer(cmd-&gt;se_cmd.t_data_sg, sg_nents,<br \/>\n                            isert_get_data(rx_desc), imm_data_len);<\/p>\n<p>Because the declared length is never checked against wc-&gt;byte_len, an<br \/>\ninitiator can declare a data segment larger than the bytes it actually<br \/>\nsent (and larger than the descriptor) and cause an out-of-bounds read of<br \/>\nthe receive buffer.<\/p>\n<p>Nothing upstream of isert closes this door:<\/p>\n<p>  &#8211; __iscsit_check_dataout_hdr() bounds the inbound payload against<br \/>\n    conn_ops-&gt;MaxXmitDataSegmentLength (MXDSL) &#8211; a transmit parameter,<br \/>\n    used here for the inbound check.<br \/>\n  &#8211; iscsi_set_connection_parameters() sets<br \/>\n    ops-&gt;MaxXmitDataSegmentLength = ops-&gt;TargetRecvDataSegmentLength;<br \/>\n    and TARGETRECVDATASEGMENTLENGTH is absent from the min()-clamp list in<br \/>\n    iscsi_check_acceptor_state(), so the value the initiator declares is<br \/>\n    adopted verbatim (type range 512..16777215). The initiator effectively<br \/>\n    raises its own ceiling.<br \/>\n  &#8211; isert never clamps the negotiated value to its own fixed receive<br \/>\n    descriptor (ISER_RX_SIZE, 9216 bytes), so the target core&#8217;s bound and<br \/>\n    the descriptor size are unrelated.<\/p>\n<p>The imm_data_len == data_len path is more than an over-read: it aliases<br \/>\nthe receive descriptor via sg_set_buf() and passes it to the backend as<br \/>\nthe data source for the SCSI WRITE, so an over-declared length causes heap<br \/>\ncontents past the descriptor to be written through the backend to the<br \/>\nbacking store. The backend is the victim of the oversized scatterlist<br \/>\nisert hands it, not the cause; no read-back of the written bytes was<br \/>\ndemonstrated.<\/p>\n<p>Trigger: after login completes (full feature phase), an initiator that has<br \/>\ndeclared a large TargetRecvDataSegmentLength and a FirstBurstLength that<br \/>\npermits unsolicited\/immediate data sends a PDU whose declared data-segment<br \/>\nlength exceeds what was received. With KASAN:<\/p>\n<p>  BUG: KASAN: slab-out-of-bounds in sg_copy_buffer+0x150\/0x1c0<br \/>\n  Read of size 4096 at addr ffff888109720800 by task kworker\/1:0H\/25<br \/>\n  Workqueue: ib-comp-wq ib_cq_poll_work<br \/>\n  Call Trace:<br \/>\n   sg_copy_buffer+0x150\/0x1c0<br \/>\n   isert_recv_done+0xba6\/0x2390<br \/>\n   __ib_process_cq+0xe1\/0x390<br \/>\n   ib_cq_poll_work+0x46\/0x150<\/p>\n<p>isert_recv_done+0xba6 resolves to isert_handle_iscsi_dataout()<br \/>\n(ib_isert.c:1160), inlined through isert_rx_opcode().<\/p>\n<p>Validate wc-&gt;byte_len against the framing in isert_recv_done() before the<br \/>\nPDU reaches any handler, and reinstate the connection if it is short.<br \/>\nBecause the test compares without subtracting the header length, it also<br \/>\nrejects PDUs shorter than the iSER and iSCSI headers, which would otherwise<br \/>\nbe parsed out of stale descriptor contents. The login handler rejects PDUs<br \/>\nshorter than ISER_HEADERS_LEN (commit 29e7b925ae6d (&#8220;IB\/isert: Reject login<br \/>\nPDUs shorter than ISER_HEADERS_LEN&#8221;)) but does not bound the declared<br \/>\nlength either; that is fixed in the next patch. The data handlers had no<br \/>\nlength check at all.<\/p>\n<p>isert reads the data segment from a fixed offset: isert_get_data()<br \/>\nreturns the iSER header plus ISER_HEADERS_LEN and makes no adjustment for<br \/>\nan AHS.  The bytes the handlers touch are therefore exactly<br \/>\n[ISER_HEADERS_LEN, ISER_HEADERS_LEN + dlength), and comparing that sum<br \/>\nagainst wc-&gt;byte_len bounds precisely the region that is read.  An AHS<br \/>\nterm would only make the test stricter without bounding anything furth<br \/>\n&#8212;truncated&#8212;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>IB\/isert: reject PDUs declaring more data than was received<\/p>\n<p>isert_recv_done() hands each received PDU to the opcode handlers witho<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25823","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25823","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}