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.
Published: 2026-09-25
Score: 7.8 High
EPSS: < 1% Very Low
KEV: No
Impact: Kernel memory corruption with potential privilege escalation
Action: Apply Patch
AI Analysis

Impact

The vulnerability arises from the Linux kernel’s handling of MPLS label pushes and pops, where skb_mpls_push stores the pre‑encapsulation network header only when skb->inner_protocol is unset, but skb_mpls_pop never clears that record. When a packet is later re‑encapsulated, the stale inner_protocol value causes the packet’s inner network header to point to an incorrect offset. In Open vSwitch this leads to a negative offset that passes a signed bound check, triggering a 4 GiB memcpy from a 30‑byte per‑CPU buffer and resulting in a kernel panic. The resulting memory corruption can be exploited to gain elevated privileges or to cause denial of service.

Affected Systems

All Linux kernel releases that contain the unpatched skb_mpls_push/pop logic, including recent mainline kernels prior to the patch. Systems running Open vSwitch on these kernels are affected by the interaction described.

Risk and Exploitability

The CVSS score is 7.8 and EPSS is < 1%. The bug is not listed in CISA’s KEV catalog. Attackers would need to craft MPLS traffic that triggers the re‑push/pop sequence in a system using Open vSwitch, so the principal vector is network traffic to a vulnerable switch. Because the flaw can lead to kernel panic or privilege escalation, the potential impact justifies immediate remediation.

Generated by OpenCVE AI on October 1, 2026 at 11:17 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the latest Linux kernel patch that includes the skb_mpls_push/pop fix.
  • Upgrade Open vSwitch to a version that incorporates the kernel change or corrects MPLS handling logic.
  • If an update cannot be applied immediately, reconfigure Open vSwitch to disable MPLS traffic or the affected push/pop functionality until the patch is applied.

Generated by OpenCVE AI on October 1, 2026 at 11:17 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Debian DLA Debian DLA DLA-4817-1 linux-6.12 security update
Debian DLA Debian DLA DLA-4841-1 linux security update
Debian DSA Debian DSA DSA-6528-1 linux security update
Ubuntu USN Ubuntu USN USN-8961-1 Linux kernel vulnerabilities
History

Sat, 03 Oct 2026 11:15:00 +0000


Thu, 01 Oct 2026 09:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-119
CWE-665

Wed, 30 Sep 2026 00:15:00 +0000


Fri, 25 Sep 2026 22:00:00 +0000

Type Values Removed Values Added
Weaknesses CWE-119
CWE-665

Fri, 25 Sep 2026 15:00:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 7.8, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H'}


Fri, 25 Sep 2026 10:30:00 +0000

Type Values Removed Values Added
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.
Title net: mpls: clear inner_protocol when the last label is popped
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-19T09:10:16.030Z

Reserved: 2026-09-24T16:01:01.158Z

Link: CVE-2026-97612

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-09-25T11:17:15.330

Modified: 2026-10-19T10:17:31.307

Link: CVE-2026-97612

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-09-25T00:00:00Z

Links: CVE-2026-97612 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-01T11:30:05Z

Weaknesses
  • CWE-805

    Buffer Access with Incorrect Length Value