Linux: ipv6: sr: restore network header before routing and forwarding
What fixes it
- 8f44d4160bcdb3136a9145a4b9c7816382976925LinuxCVE List
- 9cfbe2c381ab6d00a08e7a5b6028865adfb4e1bcLinuxCVE List
- 97b21ef57dfabbff660a4672c9fef7edfb720f47LinuxCVE List
- 3ad7dca5e03bd64c65983a19734337512fd75491LinuxCVE List
- 975b5b067f525a1b1338c4a3bee1c46545801518LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
ipv6: sr: restore network header before routing and forwarding
ipv6_srh_rcv() runs with skb->data at the Segment Routing Header (SRH) while skb_network_header() points at the IPv6 header.
When segments_left > 0, ipv6_srh_rcv() previously restored the skb->data position by pushing sizeof(struct ipv6hdr), assuming the SRH immediately followed the fixed IPv6 header. If another extension header (such as a Hop-by-Hop options header) precedes the SRH, skb_network_offset() remained negative.
This led to two problems:
- During ip6_route_input(), fib6_rules_early_flow_dissect() invokes
__skb_flow_dissect() which passes the negative skb_network_offset() to flow dissection, breaking BPF and C flow dissector logic.
- If forwarded via ip6_forward() or redirected via act_mirred, downstream
handlers (like sch_fragment() or neighbour output) pass the negative offset as an unsigned length, triggering OOB memcpy or buffer overflows.
Fix this by pushing -skb_network_offset(skb) before routing, ensuring skb_network_offset(skb) is 0 for route lookup / flow dissection as well as downstream forwarding. On the loopback path, pull skb_transport_offset(skb) to restore skb->data to the SRH before looping back.
Text from CVE List
Affected versions 18
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before f463c4786cf27376de7dfc0833a12e924a98f698CVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before 8f44d4160bcdb3136a9145a4b9c7816382976925CVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before 9cfbe2c381ab6d00a08e7a5b6028865adfb4e1bcCVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before af08f62b5a5a446d6134a92d86771d3d12e0e3daCVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before ce4c8beedc19aceeab0e7bdc6f34394fb158c47cCVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before 97b21ef57dfabbff660a4672c9fef7edfb720f47CVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before 3ad7dca5e03bd64c65983a19734337512fd75491CVE List
- Linuxaffected: 1ababeba4a21f3dba3da3523c670b207fb2feb62 before 975b5b067f525a1b1338c4a3bee1c46545801518CVE List
- Linuxaffected: 4.10CVE List
- Linuxunaffected: all versions before 4.10CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.111 through 6.12.*CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 8
- git.kernel.org/stable/c/f463c4786cf27376de7dfc0833a12e924a98f698Referencevia CVE List
- git.kernel.org/stable/c/8f44d4160bcdb3136a9145a4b9c7816382976925Referencevia CVE List
- git.kernel.org/stable/c/9cfbe2c381ab6d00a08e7a5b6028865adfb4e1bcReferencevia CVE List
- git.kernel.org/stable/c/af08f62b5a5a446d6134a92d86771d3d12e0e3daReferencevia CVE List
- git.kernel.org/stable/c/ce4c8beedc19aceeab0e7bdc6f34394fb158c47cReferencevia CVE List
- git.kernel.org/stable/c/97b21ef57dfabbff660a4672c9fef7edfb720f47Referencevia CVE List
- git.kernel.org/stable/c/3ad7dca5e03bd64c65983a19734337512fd75491Referencevia CVE List
- git.kernel.org/stable/c/975b5b067f525a1b1338c4a3bee1c46545801518Referencevia CVE List