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:
- 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.
- 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.
- 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.
وجدت خطأً في الوصف؟ لديك ما تضيفه؟ لا تتردد في مراسلتنا 👾