Skip to main content

Linux Kernel CVE-2026-31669

| EUVDEUVD-2026-25562 CRITICAL
Use After Free (CWE-416)
2026-04-24 Linux GHSA-29w7-pv74-wpq7
9.8
CVSS 3.1 · Vendor: Linux
Share

Severity by source

Vendor (Linux) PRIMARY
9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
8.1 HIGH

Remotely reachable and unauthenticated (AV:N/PR:N), but exploitation requires winning a free-vs-lookup race on MPTCP/IPv6 hosts, so AC:H; kernel UAF supports high C/I/A.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
SUSE
CRITICAL
qualitative
Red Hat
7.3 HIGH
qualitative

Primary rating from Vendor (Linux).

CVSS VectorVendor: Linux

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

6
Analysis Generated
Jul 24, 2026 - 02:24 vuln.today
Patch released
Apr 27, 2026 - 20:09 nvd
Patch available
CVSS changed
Apr 27, 2026 - 15:22 NVD
9.8 (CRITICAL)
Patch available
Apr 24, 2026 - 16:16 EUVD
EUVD ID Assigned
Apr 24, 2026 - 15:00 euvd
EUVD-2026-25562
CVE Published
Apr 24, 2026 - 14:45 nvd
CRITICAL 9.8

DescriptionCVE.org

In the Linux kernel, the following vulnerability has been resolved:

mptcp: fix slab-use-after-free in __inet_lookup_established

The ehash table lookups are lockless and rely on SLAB_TYPESAFE_BY_RCU to guarantee socket memory stability during RCU read-side critical sections. Both tcp_prot and tcpv6_prot have their slab caches created with this flag via proto_register().

However, MPTCP's mptcp_subflow_init() copies tcpv6_prot into tcpv6_prot_override during inet_init() (fs_initcall, level 5), before inet6_init() (module_init/device_initcall, level 6) has called proto_register(&tcpv6_prot). At that point, tcpv6_prot.slab is still NULL, so tcpv6_prot_override.slab remains NULL permanently.

This causes MPTCP v6 subflow child sockets to be allocated via kmalloc (falling into kmalloc-4k) instead of the TCPv6 slab cache. The kmalloc-4k cache lacks SLAB_TYPESAFE_BY_RCU, so when these sockets are freed without SOCK_RCU_FREE (which is cleared for child sockets by design), the memory can be immediately reused. Concurrent ehash lookups under rcu_read_lock can then access freed memory, triggering a slab-use-after-free in __inet_lookup_established.

Fix this by splitting the IPv6-specific initialization out of mptcp_subflow_init() into a new mptcp_subflow_v6_init(), called from mptcp_proto_v6_init() before protocol registration. This ensures tcpv6_prot_override.slab correctly inherits the SLAB_TYPESAFE_BY_RCU slab cache.

AnalysisAI

Kernel memory corruption in Linux's MPTCP subsystem allows a use-after-free in __inet_lookup_established affecting IPv6 subflow sockets. Because mptcp_subflow_init() copied tcpv6_prot before inet6_init() had registered its slab cache, MPTCP IPv6 child sockets were allocated from kmalloc-4k without the SLAB_TYPESAFE_BY_RCU guarantee, so lockless RCU ehash lookups could dereference freed socket memory. There is no public exploit identified at time of analysis, and the EPSS score is very low (0.03%), but the flaw is remotely reachable via network traffic on hosts using MPTCP over IPv6.

Technical ContextAI

The affected component is Multipath TCP (MPTCP) in the Linux kernel network stack, specifically the interaction between subflow socket allocation and the established-connection hash table (ehash). The kernel's ehash lookups are lockless and depend on SLAB_TYPESAFE_BY_RCU, a slab flag that keeps freed objects type-stable during an RCU read-side critical section so that a concurrent lookup never sees reused memory of a different type. tcp_prot and tcpv6_prot obtain this flag through proto_register(). The root cause (CWE-416, Use After Free) is an initialization-ordering bug: mptcp_subflow_init() runs at fs_initcall (level 5) and snapshots tcpv6_prot into tcpv6_prot_override while tcpv6_prot.slab is still NULL, because inet6_init() and its proto_register(&tcpv6_prot) only run later at device_initcall (level 6). The override's slab pointer therefore stays NULL forever, forcing child-socket allocation into the generic kmalloc-4k cache that lacks RCU type-safety. The CPE data identifies the affected product as the Linux kernel (cpe:2.3:a:linux:linux:*).

RemediationAI

Vendor-released patch: upgrade to a fixed stable kernel - 5.15.203, 6.1.169, 6.6.135, 6.12.82, 6.18.23, 6.19.13, or mainline 7.0, whichever matches your branch; the upstream fix splits IPv6 initialization into mptcp_subflow_v6_init() so tcpv6_prot_override.slab correctly inherits the SLAB_TYPESAFE_BY_RCU cache (fix commit f6e1f25fa5e7 and stable backports at https://git.kernel.org/stable/c/f6e1f25fa5e733570f6d6fe37a4dfed2a0deba47). Distribution users should apply the vendor package update, e.g. Ubuntu USN-8490-1 (https://ubuntu.com/security/notices/USN-8490-1); OT/embedded operators should follow Siemens SSA-019113 and SSA-082556. If immediate patching is not possible, the most direct compensating control is to disable MPTCP where it is not required - set net.mptcp.enabled=0 via sysctl - which removes the vulnerable subflow allocation path entirely at the cost of losing multipath functionality; alternatively, disabling IPv6 on affected interfaces avoids the IPv6-specific slab-inheritance bug but is disruptive to dual-stack deployments. These are stopgaps only; the code fix is the correct remediation.

Vendor StatusVendor

SUSE

Severity: Critical
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Fixed
SUSE Linux Enterprise Desktop 15 SP7 Fixed
SUSE Linux Enterprise High Availability Extension 15 SP7 Fixed
SUSE Linux Enterprise High Availability Extension 15 SP7 Fixed
SUSE Linux Enterprise High Performance Computing 15 SP7 Fixed

Share

CVE-2026-31669 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy