CVE-2026-89555
nicheUse-After-Free in Linux Kernel MPLS Multipath Hashing (mpls_select_multipath)
The Linux kernel's MPLS forwarding path contains a use-after-free in mpls_select_multipath(): while computing a multipath hash across the MPLS label stack, the code caches a pointer to the current label header (hdr), but a later pskb_may_pull() call to bring the inner IP header into the linear skb area can trigger pskb_expand_head(), which replaces and frees the old skb head, leaving hdr dangling. An attacker can trigger this by sending crafted packets (e.g., legal Geneve packets terminated on a bareudp/MPLS multipath setup) whose inner IP header sits in nonlinear skb data, causing a slab-use-after-free read confirmed by KASAN on unpatched kernels. The flaw carries a critical 9.8 CVSS (network, no privileges, no user interaction), though in practice the observed impact is kernel memory corruption with crash/DoS potential rather than demonstrated remote code execution. Affected systems are Linux hosts and routers that forward MPLS traffic with routes carrying multiple next-hops (ECMP), particularly SDN/service-provider or lab setups combining bareudp and Geneve tunnels. Exploitation status is none known: the bug was found via static analysis with a private reproducer, there is no public PoC, and it is not in the CISA KEV catalog.
What to do: Apply kernel updates that include the fix 'mpls: reload header after pskb_may_pull()' as soon as your distribution ships it, prioritizing hosts that forward MPLS with ECMP routes or terminate bareudp/Geneve tunnels. Until patched, consider disabling MPLS ECMP hashing on affected routers or filtering untrusted tunnel ingress where feasible. Watch for kernel oops/KASAN slab-use-after-free reports in mpls_select_multipath on forwarding boxes as evidence of probing or exploitation attempts.
| Linux kernel | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: mpls: reload header after pskb_may_pull() mpls_select_multipath() calls mpls_multipath_hash() to choose a nexthop when an MPLS route has multiple nexthops. While walking the MPLS label stack, the hash routine caches hdr for the current label. After finding the bottom-of-stack label, it calls pskb_may_pull() before reading the inner IP header. If an skb is constructed with the inner IP header in nonlinear data and insufficient tailroom in the linear head, pskb_may_pull() calls pskb_expand_head() to replace the skb head and free the old one. This leaves hdr pointing to freed memory. The IPv6 path can invalidate hdr again when it performs a second pull for the larger header. The issue was found through static analysis. A reproducer sending a legal Geneve packet through a bareudp/MPLS multipath setup triggered the same KASAN report in 2 of 2 unpatched runs: BUG: KASAN: slab-use-after-free in mpls_select_multipath Read of size 1 at addr ffff88800ecc6e20 by task ksoftirqd/1/23 Call Trace: mpls_select_multipath mpls_forward __netif_receive_skb_list_core netif_receive_skb_list_internal napi_complete_done gro_cell_poll __napi_poll net_rx_action Freed by task 23: kfree pskb_expand_head __pskb_pull_tail mpls_select_multipath Reload hdr from the current skb head after each successful pull before deriving the inner IPv4 or IPv6 header pointer.
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.