PT-2026-121926

CVE-2026-98954

·

تاريخ النشر

2026-10-23

·

تاريخ التحديث

2026-10-23

الوصف من

الدرجة
N/A
غير متوفر

لا تتوفر حاليًا تقييمات أو مقاييس للخطورة. سنحدّث المعلومات المقابلة في الصفحة فور توفرها.

In the Linux kernel, the following vulnerability has been resolved:
net: always dissect GSO packets in virtio net hdr to skb()
Commit 9e8db5913264 ("net: avoid false positives in untrusted gso validation") added a '&& skb->network header' check before flow-dissecting GSO packets without VIRTIO NET HDR F NEEDS CSUM in virtio net hdr to skb(), because some callers (such as tun get user(), tun xdp one(), virtnet receive done(), and raw verify header()) called virtio net hdr * to skb() before initializing skb->network header and skb->dev.
Because alloc skb() and build skb around() zero-initialize skb->network header to 0 (unlike mac header and transport header which are initialized to ~0U), those four callers always had skb->network header == 0 and bypassed flow dissection in virtio net hdr to skb(). More generally, skb->network header is an offset from skb->head (where 0 is also a valid offset whenever skb headroom(skb) is 0), not a boolean flag.
Whenever the 'if (gso type && skb->network header)' branch was skipped, the fallback 'else if (gso type)' only pulled nh min len + thlen (40 bytes for TCPv4) without dissecting the packet, without validating ip proto or n proto, and without setting skb->transport header.
If the packet has a malformed network header, it is not rejected and a subsequent skb probe transport header() also fails, leaving skb->transport header at ~0U (0xffff). Similarly, if an IPv4 packet carries IP options (ihl > 5) or an IPv6 packet carries extension headers, pulling only nh min len + thlen can leave the TCP header outside skb->head. In both cases, tcp hdrlen(skb) in skb gso transport seglen() reads out-of-bounds:
BUG: KASAN: slab-out-of-bounds in skb gso transport seglen Read of size 2 by task poc/133 skb gso transport seglen (net/core/gso.c:155) skb gso validate mac len (net/core/gso.c:270) tbf enqueue (net/sched/sch tbf.c:260) dev qdisc enqueue (net/core/dev.c:4227) dev queue xmit (net/core/dev.c:4884)
In addition, checking virtio net hdr match proto() only inside 'if (!skb->protocol)' before flow dissection both skipped validation when skb->protocol was pre-set by the caller and rejected VLAN-tagged frames whose outer L2 protocol is ETH P 8021Q or ETH P 8021AD.
Fix this by:
  1. Initializing skb->dev and skb->network header (plus skb->protocol for IFF TUN) before virtio net hdr * to skb() in tun get user(), tun xdp one(), virtnet receive done(), and raw verify header(). In tun get user(), drop the redundant skb reset mac header(skb) in the IFF TUN case since virtio net hdr to skb() unconditionally resets mac header.
  2. Removing '&& skb->network header' and the unvalidated 'else if (gso type)' fallback in virtio net hdr to skb() so all GSO packets without VIRTIO NET HDR F NEEDS CSUM are flow-dissected, have their transport header pulled into linear data, and have skb->transport header set.
  3. Moving the virtio net hdr match proto() check to after skb flow dissect flow keys basic(), validating keys.basic.n proto against hdr gso type.
المورّدون
المنتجات المتأثرة
المعرّفات ذات الصلة
وجدت خطأً في الوصف؟ لديك ما تضيفه؟ لا تتردد في مراسلتنا 👾