{"id":33340,"date":"2026-10-06T20:31:48","date_gmt":"2026-10-06T12:31:48","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98271"},"modified":"2026-10-06T20:31:48","modified_gmt":"2026-10-06T12:31:48","slug":"cve-2026-98271","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98271","title":{"rendered":"CVE-2026-98271 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nnet: skbuff: do not l"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net: skbuff: do not leave stale header offsets after pskb_carve()<\/p>\n<p>pskb_carve_inside_header() and pskb_carve_inside_nonlinear() remove<br \/>\nthe first bytes of a packet and reallocate skb-&gt;head.<\/p>\n<p>All the headers that were present before the operation are gone,<br \/>\nbut both functions call skb_headers_offset_update(skb, 0), which<br \/>\nis a no-op : skb-&gt;mac_header, skb-&gt;network_header,<br \/>\nskb-&gt;transport_header and skb-&gt;csum_start keep their old values and<br \/>\nnow describe bytes which are no longer there.<\/p>\n<p>Both helpers size the new head from the old skb_end_offset(), so the<br \/>\nstale offsets still land inside the new allocation. They point past<br \/>\nskb_tail_pointer() though, to bytes that were never initialized.<\/p>\n<p>pskb_carve_inside_nonlinear() is the worst case, because it leaves a<br \/>\nzombie skb with an empty linear part (skb-&gt;data ==<br \/>\nskb_tail_pointer(skb), skb_headlen(skb) == 0), while<br \/>\nskb_mac_header_was_set() is still true and skb-&gt;mac_header is way<br \/>\nahead of skb-&gt;data.<\/p>\n<p>The only user of pskb_extract() is rds_tcp_data_recv(), and the<br \/>\ncarved skb is queued on tinc-&gt;ti_skb_list. When the RDS incoming<br \/>\nmessage is released, rds_tcp_inc_free() calls skb_queue_purge(),<br \/>\nwhich frees the skbs with SKB_DROP_REASON_QUEUE_PURGE. This is<br \/>\nvisible from drop_monitor, which then tries to pull back to the<br \/>\n(bogus) mac header :<\/p>\n<p>skbuff: __skb_pull(len=234)<br \/>\nskb len=6968 data_len=6968 headroom=0 headlen=0 tailroom=0<br \/>\nend-tail=384 mac=(234,14) mac_len=14 net=(248,40) trans=288<br \/>\nshinfo(txflags=0 nr_frags=1 gso(size=1428 type=16 segs=5))<br \/>\ncsum(0x100120 start=288 offset=16 ip_summed=3 complete_sw=0 valid=1 level=0)<br \/>\nhash(0x7b446c6c sw=0 l4=1) proto=0x86dd pkttype=0 iif=60<br \/>\nkernel BUG at .\/include\/linux\/skbuff.h:2847!<\/p>\n<p>Add skb_carve_reset_headers() to mark the mac and transport headers<br \/>\nas not set, reset the network header, clear skb-&gt;mac_len, and drop<br \/>\na now meaningless CHECKSUM_PARTIAL (csum_start no longer describes<br \/>\nanything).<\/p>\n<p>Invalidate the inner offsets as well. Unlike mac_header and<br \/>\ntransport_header they have no &#8220;unset&#8221; sentinel, so a leftover<br \/>\nnon-zero value still looks like a real header. Zero<br \/>\nskb-&gt;inner_mac_header, skb-&gt;inner_network_header,<br \/>\nskb-&gt;inner_transport_header, skb-&gt;inner_protocol and<br \/>\nskb-&gt;encapsulation, so that all the header state is invalidated in<br \/>\none place.<\/p>\n<p>v2: fixed an inaccurate changelog. The stale offsets stay inside the<br \/>\n    new skb-&gt;head, which is never smaller than the old one, they<br \/>\n    simply point past skb_tail_pointer() to bytes that are gone.<br \/>\n    Thanks to Xuanqiang Luo for insisting on this.<br \/>\n    Also invalidate the inner header state, as suggested by the<br \/>\n    netdev AI review :<br \/>\n    https:\/\/netdev-ai.bots.linux.dev\/sashiko\/#\/patchset\/20260911114922.621937-1-edumazet%40google.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>net: skbuff: do not leave stale header offsets after pskb_carve()<\/p>\n<p>pskb_carve_inside_header() and pskb_carve_inside_nonlinear() rem<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-33340","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/33340","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=33340"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33340"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33340"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}