PT-2026-86711 · Azure Linux · Kernel
Published
2026-08-28
·
Updated
2026-08-28
None
No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.
In the Linux kernel, the following vulnerability has been resolved:
inet: frags: strip GSO state from fragments before reassembly
A virtio net hdr (tun/tap, or AF PACKET with PACKET VNET HDR) can mark
an IPv4 or IPv6 fragment as GSO; nothing relates gso type to frag off.
inet frag reasm prepare()/inet frag reasm finish() keep the first
fragment's skb as the head of the reassembled datagram, including its
shinfo->gso size/gso type/gso segs, and chain the remaining fragments
on frag list with whatever linear/paged layout they arrived with.
After ip defrag() (ip local deliver(), nf defrag ipv4, ...) the
reassembled skb therefore still claims to be GSO (SKB GSO DODGY), and
the next software segmentation point - udp rcv segment() on local
delivery, validate xmit skb(), or the ip finish output gso() slow
path - hands it to skb segment(). skb segment()'s frag list walk
assumes GRO-shaped input and hits one of its BUG ON()s. Two writes to
a tap by an unprivileged user in its own userns are enough:
kernel BUG at net/core/skbuff.c:4899!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
CPU: 0 UID: 1000 PID: 82 Comm: poc Not tainted 7.2.0-pentest+ #2
RIP: 0010:skb segment+0x20ca/0x48b0
Call Trace:
udp gso segment+0x29a/0x27d0
udp4 ufo fragment+0x458/0x6c0
inet gso segment+0x429/0x1340
skb mac gso segment+0x233/0x4f0
skb gso segment+0x308/0x660
udp queue rcv skb+0x440/0xad0
udp unicast rcv skb+0xc7/0x2c0
udp rcv+0x16ce/0x2260
ip protocol deliver rcu+0x197/0x2d0
ip local deliver+0x430/0x690
ip rcv+0x16f/0x1f0
netif receive skb one core+0x15e/0x1c0
netif receive skb+0x1e/0x110
netif receive skb+0xf6/0x5c0
tun rx batched.isra.0+0x3ab/0x790
tun get user+0x17c3/0x3550
tun chr write iter+0xba/0x1b0
vfs write+0x646/0x1130
Kernel panic - not syncing: Fatal exception in interrupt
This runs with BH disabled, so it is a panic rather than an oops. The
same is reachable with CAP NET RAW in a netns where a defrag point
precedes a GSO point, and from a guest whose VMM forwards
virtio net hdr to a tap. The SKB GSO DODGY frag list checks added by
commit 3dcbdb134f32 ("net: gso: Fix skb segment splat when splitting
gso size mangled skb having linear-headed frag list") and by
commit 9e4b7a99a03a ("net: gso: fix panic on frag list with mixed head
alloc types") do not cover it: page-backed heads skip them, and kmalloc
heads skip them when gso size == skb headlen(head), which the sender
controls.
An skb entering a frag queue is an IP fragment by definition and
cannot legitimately carry GSO state: GRO does not merge fragments and
the stack segments before it fragments, so only untrusted sources are
affected. This has been reachable since
commit f43798c27684 ("tun: Allow GSO using virtio net hdr"), the first
path that let userspace attach GSO metadata to an IP fragment. Reset
the GSO fields of every fragment as it is queued, in
inet frag queue insert(), which IPv4, IPv6, nf conntrack reasm and
6lowpan reassembly share; then neither the head nor the frag list
members of the reassembled skb carry them (the members matter too:
the ip do fragment()/ip6 fragment() fast paths send them out as they
are). The head may remain CHECKSUM PARTIAL; that is already accepted
on receive and resolved by skb checksum help() in
ip do fragment()/ip6 fragment() on forward.
Tested on top of net.git (dc4b95b8fee9), x86 64: the tap reproducer
above, two further IPv4 frag list geometries that reach
BUG ON(i >= nfrags) and BUG ON(!list skb->head frag), and an IPv6
fragment-header variant (udp6 ufo fragment()) each panic the unpatched
kernel; with this patch all four datagrams are delivered intact and
nothing is logged.
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Kernel