{"id":6745,"date":"2026-09-04T18:49:15","date_gmt":"2026-09-04T10:49:15","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72046"},"modified":"2026-09-04T18:49:15","modified_gmt":"2026-09-04T10:49:15","slug":"cve-2026-72046","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-72046","title":{"rendered":"CVE-2026-72046 [CRITICAL] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\ngve: fix header buffe"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>gve: fix header buffer corruption with header-split and HW-GRO<\/p>\n<p>The DQO RX datapath programs a per-buffer-queue-descriptor<br \/>\nheader_buf_addr at post time and reads the split header back at<br \/>\ncompletion time. Both the post and the read currently index the<br \/>\nheader buffer by queue position rather than by the buffer&#8217;s identity:<\/p>\n<p>  &#8211; post (gve_rx_post_buffers_dqo): header_buf_addr is computed from<br \/>\n    bufq-&gt;tail<br \/>\n  &#8211; read (gve_rx_dqo): the header is read from desc_idx (the completion<br \/>\n    queue head index)<\/p>\n<p>This relies on the buffer-queue index and the completion-queue index<br \/>\nbeing equal for the start of every packet, i.e. on the device consuming<br \/>\nposted buffers and returning completions in the exact same order. That<br \/>\nassumption does not hold once HW-GRO is enabled with multiple<br \/>\nflows: coalesced segments are accepted and completed in an order that<br \/>\nmay differ from the order buffers were posted, and segments from<br \/>\ndifferent flows may interleave.<\/p>\n<p>That results in two problems:<\/p>\n<p>1. Wrong header slot on read. Because the read offset is derived from<br \/>\n   the completion index (desc_idx) while the device wrote the header to<br \/>\n   the address programmed for the buffer&#8217;s buf_id, the driver can copy<br \/>\n   a header belonging to a different packet. This shows up as<br \/>\n   throughput drop (about 30% drop and large numbers of TCP<br \/>\n   retransmissions) with header-split and HW-GRO both enabled and many<br \/>\n   streams.<\/p>\n<p>2. Header buffer reused while still owned by the device. The driver<br \/>\n   advances bufq-&gt;head by one per completion and re-posts buffers based<br \/>\n   on that. Arrival of N RX completions only guarantees that at least N<br \/>\n   RX buffer descriptors have been read by the device. It does not<br \/>\n   guarantee that the device has relinquished the ownership of all the<br \/>\n   buffers corresponding to those N descriptors. With out-of-order<br \/>\n   completions (e.g. the completion for a packet copied into buffer N<br \/>\n   arrives before the completion for a packet copied into buffer N-1),<br \/>\n   the driver can re-post and overwrite a header buffer that the device<br \/>\n   is still going to write into, corrupting the header of a packet<br \/>\n   whose completion has not yet been processed.<\/p>\n<p>Fix both issues by indexing the header buffer by buf_id on both the post<br \/>\nand read paths. Reading from buf_id&#8217;s slot is therefore always correct<br \/>\nregardless of completion ordering (fixes problem 1).<\/p>\n<p>Indexing by buf_id also ties each header slot to the lifetime of its<br \/>\nbuffer state. A buffer state is only returned to the free\/recycle lists<br \/>\nwhen its own completion (buf_id) is processed, so its header slot can<br \/>\nonly be re-posted after the device is done with it. This makes header<br \/>\nslot reuse safe under out-of-order completions (fixes problem 2).<\/p>\n<p>Allocate (gve_rx_alloc_hdr_bufs) and free (gve_rx_free_hdr_bufs) the<br \/>\nheader buffers based on num_buf_states to match the buf_id indexing.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>gve: fix header buffer corruption with header-split and HW-GRO<\/p>\n<p>The DQO RX datapath programs a per-buffer-queue-descriptor<br \/>\nheader_b<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-6745","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/6745","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=6745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}