All vulnerabilities
CVE-2026-97612

Linux: net: mpls: clear inner_protocol when the last label is popped

Linux LinuxOperating systems
CVSS
7.8High
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)0.16%Chance of exploitation activity in the next 30 days, higher than 5% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in55ed97db27bffe29c21fdefd5d25601322c36ff8Also 833ec2788322306407503b4cfc7745cd1f9d785f, 38db09804b2616aa1e2fcdf97f0c3ae8b9dbdd34 and 3 moreCVE List
Published25 Sep 2026Updated 19 Oct 2026CVE List

What fixes it

  • 55ed97db27bffe29c21fdefd5d25601322c36ff8LinuxCVE List
  • 833ec2788322306407503b4cfc7745cd1f9d785fLinuxCVE List
  • 38db09804b2616aa1e2fcdf97f0c3ae8b9dbdd34LinuxCVE List
  • 0b3425fd0ecd515997956f7bb8a8a576b444ed64LinuxCVE List
  • 011e17b5cae19b9f6a150923275e41c278de64f0LinuxCVE List
  • 78a86d75a70e1e227711c72865c59b1422d0a5aeLinuxCVE 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:

net: mpls: clear inner_protocol when the last label is popped

skb_mpls_push() records the pre-encapsulation network header once, gated on !skb->inner_protocol. skb_mpls_pop() never clears that record, so it outlives the encapsulation it describes.

Open vSwitch can then re-push MPLS onto a packet whose inner_network_header still points at the older, deeper offset: push a label, pop every label, recirculate (ovs_flow_key_update() re-derives key->eth.type and resets network_header, but leaves inner_*), then push again. ovs_fragment() trusts the record:

skb->network_header = skb->inner_network_header;

so skb_network_offset() goes negative. The bound check is signed:

if (skb_network_offset(skb) > MAX_L2_LEN)

a negative offset passes it, and prepare_frag() widens the value:

unsigned int hlen = skb_network_offset(skb); memcpy(&data->l2_data, skb->data, hlen);

which is a ~4GiB memcpy out of a 30-byte per-CPU buffer.

Reproduced on v7.3-rc1. RDX is the truncated length, (unsigned int)(-8):

BUG: unable to handle page fault for address: ffffe8ffffc16000 #PF: supervisor write access in kernel mode Oops: 0002 [#1] SMP KASAN NOPTI RIP: 0010:memcpy+0x8/0x20 RDX: 00000000fffffff8 RSI: ffff888105d732db RDI: ffffe8ffffc16000 prepare_frag+0x3df/0x4e0 ovs_fragment+0x589/0x7e0 do_output+0x4ce/0x5e0 do_execute_actions+0x55d2/0x7b30 ovs_execute_actions+0xea/0x450

Same root-cause shape as commit 975b5b067f52 ("ipv6: sr: restore network header before routing and forwarding"): a stale network header offset reaching a consumer that widens it. Here it originates in the MPLS push/pop path.

Clear inner_protocol once the packet is no longer MPLS, so a later push re-records the current header. net/sched/act_mpls.c is the only other skb_mpls_pop() caller and gets the same fix; sch_frag.c saves and restores inner_protocol around fragmentation in the same way OVS does.

Text from CVE List

Affected versions 18

  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 55ed97db27bffe29c21fdefd5d25601322c36ff8CVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 833ec2788322306407503b4cfc7745cd1f9d785fCVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 38db09804b2616aa1e2fcdf97f0c3ae8b9dbdd34CVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 0b3425fd0ecd515997956f7bb8a8a576b444ed64CVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 011e17b5cae19b9f6a150923275e41c278de64f0CVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before da8c3a7f5d3137fec4ff60a6248f5f6d66b6a63eCVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before b39120523475d6b436be7f6cb27d48064148a327CVE List
  • Linuxaffected: 48d2ab609b6bbecb7698487c8579bc40de9d6dfa before 78a86d75a70e1e227711c72865c59b1422d0a5aeCVE List
  • Linuxaffected: 4.9CVE List
  • Linuxunaffected: all versions before 4.9CVE 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