{"id":17293,"date":"2026-09-05T02:30:57","date_gmt":"2026-09-04T18:30:57","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-80789"},"modified":"2026-09-05T02:30:57","modified_gmt":"2026-09-04T18:30:57","slug":"cve-2026-80789","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-80789","title":{"rendered":"CVE-2026-80789 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnvmet-tcp: bound SGL"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nvmet-tcp: bound SGL data length before allocating command buffers<\/p>\n<p>nvmet_tcp_map_data() reads the host-controlled 32-bit sgl-&gt;length<br \/>\nand, for the in-capsule offset descriptor (type 0x01), checks it<br \/>\nagainst port-&gt;inline_data_size before use. Any other SGL descriptor<br \/>\ntype &#8212; including the non-inline transport SGL data-block descriptor<br \/>\n(type (NVME_TRANSPORT_SGL_DATA_DESC &lt;req.sg = sgl_alloc(len, GFP_KERNEL, &amp;cmd-&gt;req.sg_cnt);<\/p>\n<p>with len taken directly from the wire, unbounded up to 4 GiB.<\/p>\n<p>nvmet_req_init() only parses the command and never inspects<br \/>\nsgl-&gt;length, and nvmet_check_transfer_len() &#8212; the only other place<br \/>\ntransfer_len is validated &#8212; runs later, from req-&gt;execute(), after<br \/>\nthe allocation has already happened. For a write command the target<br \/>\nresponds with an R2T and parks the command waiting for the host to<br \/>\nsend the data; if the host (or an unauthenticated peer that simply<br \/>\nnever follows up) never does, the sgl_alloc() buffer stays resident<br \/>\nfor the life of the command. NVMe\/TCP has no mandatory authentication<br \/>\nin the default configuration, so any peer able to reach the target<br \/>\nportal and complete a Fabrics connect can drive this with a single<br \/>\ncrafted command, repeatable across queues and connections for<br \/>\namplification. This is unbounded kernel memory allocation<br \/>\ntriggered by a remote, effectively unauthenticated peer.<\/p>\n<p>Validate len against the same NVMET_TCP_MAXH2CDATA ceiling this file<br \/>\nalready uses to bound per-PDU H2C data, for every SGL descriptor type,<br \/>\nbefore doing any allocation. This closes the gap for the non-inline<br \/>\ndescriptor while leaving the existing, tighter inline_data_size check<br \/>\nin place for the in-capsule case.<\/p>\n<p>Runtime-verified on a v6.19 KASAN stand: with this bound in place, a<br \/>\ncrafted write command carrying an oversized non-inline SGL length is<br \/>\nrejected before sgl_alloc() runs, where the same request previously<br \/>\ndrove an unbounded ~256 MiB kernel allocation (up to 4 GiB) that<br \/>\nstayed resident pending an R2T the host never satisfies.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>nvmet-tcp: bound SGL data length before allocating command buffers<\/p>\n<p>nvmet_tcp_map_data() reads the host-controlled 32-bit sgl-&gt;leng<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-17293","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/17293","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=17293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}