{"id":25822,"date":"2026-09-18T04:31:56","date_gmt":"2026-09-17T20:31:56","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90413"},"modified":"2026-09-18T04:31:56","modified_gmt":"2026-09-17T20:31:56","slug":"cve-2026-90413","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-90413","title":{"rendered":"CVE-2026-90413 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nIB\/isert: reject logi"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>IB\/isert: reject login PDUs declaring more data than was received<\/p>\n<p>isert_login_recv_done() records how many bytes the HCA actually placed in<br \/>\nthe login buffer, but nothing compares that against the length the login<br \/>\nPDU&#8217;s BHS declares.  isert_rx_login_req() copies min(login_req_len,<br \/>\nMAX_KEY_VALUE_PAIRS) bytes into login-&gt;req_buf, and the login code then<br \/>\nreads the declared length back out of that buffer &#8211; for the first PDU in<br \/>\niscsi_target_locate_portal(),<\/p>\n<p>\tpayload_length = ntoh24(login_req-&gt;dlength);<br \/>\n\ttmpbuf = kmemdup_nul(login-&gt;req_buf, payload_length, GFP_KERNEL);<\/p>\n<p>and for the ones after it in iscsi_decode_text_input(), reached from<br \/>\niscsi_target_do_login().<\/p>\n<p>login-&gt;req_buf is a fixed MAX_KEY_VALUE_PAIRS (8192) byte allocation, so<br \/>\nan initiator that declares more than it sends reads off the end of it,<br \/>\nbefore authentication and with the length under its control:<\/p>\n<p>  BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43\/0x80<br \/>\n  Read of size 8193 at addr ffff8881056a8000 by task iscsi_np\/167<br \/>\n   __asan_memcpy+0x23\/0x60<br \/>\n   kmemdup_nul+0x43\/0x80<br \/>\n   iscsi_target_locate_portal+0x48d\/0x1180<br \/>\n   iscsi_target_login_thread+0x19a9\/0x3350<br \/>\n  Allocated by task 167:<br \/>\n   __kmalloc_cache_noprof+0x158\/0x370<br \/>\n   iscsi_target_login_thread+0x971\/0x3350<br \/>\n  which belongs to the cache kmalloc-8k of size 8192<br \/>\n  allocated 8192-byte region<\/p>\n<p>Falsifying the second login PDU instead reaches the other reader, on the<br \/>\nsame buffer:<\/p>\n<p>  BUG: KASAN: slab-out-of-bounds in kmemdup_nul+0x43\/0x80<br \/>\n  Read of size 8193 at addr ffff888104d10000 by task kworker\/1:1\/50<br \/>\n  Workqueue: isert_login_wq iscsi_target_do_login_rx<br \/>\n   __asan_memcpy+0x23\/0x60<br \/>\n   kmemdup_nul+0x43\/0x80<br \/>\n   iscsi_decode_text_input+0xc6\/0x11c0<br \/>\n   iscsi_target_do_login+0x261\/0x1470<br \/>\n   iscsi_target_do_login_rx+0x51d\/0x7d0<\/p>\n<p>iscsit over TCP is not exposed: iscsit_get_login_rx() validates the<br \/>\ndeclared length with iscsi_target_check_login_request() and then reads<br \/>\nexactly that many bytes off the socket, so the declared length governs<br \/>\nhow much arrives rather than how much is copied out of an already-filled<br \/>\nbuffer.  isert does not call iscsi_target_check_login_request() at all.<\/p>\n<p>Reject a login PDU whose declared DataSegmentLength exceeds what was<br \/>\nreceived, in both paths that reach isert_rx_login_req():<br \/>\nisert_get_login_rx() for the first login PDU and isert_login_recv_done()<br \/>\nfor the ones after it.  dlength &lt;= login_req_len is allowed because the<br \/>\nreceived count can include up to three bytes of iSCSI padding.<\/p>\n<p>Once the check is in place the copy out can no longer exceed the copy in:<br \/>\nthe posted login SGE is ISER_RX_PAYLOAD_SIZE, so login_req_len cannot<br \/>\nexceed MAX_KEY_VALUE_PAIRS and the min() in isert_rx_login_req() is<br \/>\nlogin_req_len.<\/p>\n<p>Like the existing short-PDU check added by 29e7b925ae6d, the reject in<br \/>\nisert_login_recv_done() returns without completing login_req_comp, so a<br \/>\nmalformed subsequent PDU leaves the login to be torn down by the login<br \/>\ntimer rather than failing immediately.  The first-PDU path returns an<br \/>\nerror and fails straight away.<\/p>\n<p>Reproduced on 7.2.0-rc4 with soft-RoCE (rdma_rxe) under KASAN, using an<br \/>\ninitiator that sends the real key=value payload while declaring 8193 in<br \/>\nthe BHS, on the first login PDU and on the second in separate runs.  The<br \/>\nreported read size tracks the declared value exactly; 16384 and 61440<br \/>\nbehave the same.  Unpatched 3 of 3 runs report on each of the two paths,<br \/>\npatched 0 of 3 on both, run alternately in a single session, and a normal<br \/>\nlogin still completes on the patched build.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>IB\/isert: reject login PDUs declaring more data than was received<\/p>\n<p>isert_login_recv_done() records how many bytes the HCA actually <\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-25822","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/25822","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=25822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}