CRITICAL Introduced in 3.13
net/ipv6 ChecksumSetup Underflow
CVE-2026-98573
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
01Description
In the Linux kernel, the following vulnerability has been resolved: net: skbuff: fix pull-bound underflow in skb_checksum_setup_ipv6() skb_maybe_pull_tail() subtracts skb_headlen(skb) from the unsigned max argument and passes the result to __pskb_pull_tail() as a signed int. The function does not ensure that max is at least skb_headlen(skb). This can happen while parsing IPv6 extension headers when an skb already has a linear area larger than MAX_IPV6_HDR_LEN. Once the parser needs data beyond the linear area, max - skb_headlen(skb) wraps and is converted to a negative delta. __pskb_pull_tail() then passes that negative length to skb_copy_bits(), where it can become a very large copy length. Pass the requested length itself as the pull bound at the three extension-header call sites, so the delta can no longer go negative.
02KernelScan AI Analysis
Risk summary
Any device with IPv6 enabled is vulnerable to remote kernel memory corruption by receiving a crafted IPv6 packet with extension headers. The bug allows an unauthenticated network attacker to trigger an integer underflow that becomes a massive out-of-bounds copy operation, potentially leading to arbitrary code execution or kernel panic.
Vulnerability analysis
The vulnerability occurs in the IPv6 checksum setup code when parsing extension headers. If an incoming packet's linear data area exceeds 1280 bytes (the IPv6 minimum MTU), a bounds calculation in skb_maybe_pull_tail() subtracts the linear length from a fixed maximum value, causing an unsigned integer wraparound. This wrapped value is passed as a negative length to the internal pull function, which then interprets it as an enormous positive copy size in skb_copy_bits(). The fix replaces the constant maximum with the actual requested header length at each of the three extension-header parsing sites, ensuring the subtraction can never underflow. The flaw is reachable remotely by anyone who can send IPv6 packets to the target — no authentication, local access, or special configuration beyond having IPv6 enabled is required.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 5.10 | 3.13 | 5.10.271 | 9c4e432132a9 |
| 5.15 | 3.13 | 5.15.222 | 718747afa546 |
| 6.1 | 3.13 | 6.1.189 | a0ad0473c09d |
| 6.12 | 3.13 | 6.12.112 | 6c28c31f051d |
| 6.18 | 3.13 | 6.18.55 | cfa643f2ca36 |
| 6.6 | 3.13 | 6.6.158 | b2da5ed3d8c7 |
| 7.2 | 3.13 | 7.2.9 | d7f474226809 |
| mainline | 3.13 | 7.3 | 3b4e0b0c008a |
| cip/5.10 | 3.13 | 5.10.271-cip78 | 9c4e432132a9 |
| cip/6.1 | 3.13 | 6.1.189-cip61 | a0ad0473c09d |
| cip/6.1-rt | 3.13 | 6.1.189-cip61-rt32 | a0ad0473c09d |
| cip/6.12 | 3.13 | 6.12.112-cip33 | 6c28c31f051d |
04CIP Kernels
State of the newest release of each Civil Infrastructure Platform SLTS tree, from CIP's own fix records.
| CIP tree | State |
|---|---|
| cip/6.12 | Fixed in 6.12.112-cip33 |
| cip/6.1 | Fixed in 6.1.189-cip61 |
| cip/6.1-rt | Fixed in 6.1.189-cip61-rt32 |
| cip/5.10 | Fixed in 5.10.271-cip78 |
| cip/5.10-rt | Affected — no CIP fix yet (latest 5.10.268-cip77-rt34) |
| cip/4.19 | Affected — no CIP fix yet (latest 4.19.325-cip136) |
| cip/4.19-rt | Affected — no CIP fix yet (latest 4.19.325-cip136-rt50) |
| cip/4.4 | Affected — no CIP fix yet (latest 4.4.302-cip115) |
| cip/4.4-rt | Affected — no CIP fix yet (latest 4.4.302-cip115-rt63) |