Skip to main content

Linux Kernel EUVDEUVD-2026-58897

| CVE-2026-72139 CRITICAL
2026-08-15 416baaa9-dc9f-4396-8d5f-8c081fb06d67 GHSA-vw9x-rc5g-h57c
Critical
Disputed · 9.8 Vendor: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
Share

Severity by source

Sources disagree (Medium–Critical)
Vendor (416baaa9-dc9f-4396-8d5f-8c081fb06d67) PRIMARY
9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI
7.0 HIGH

Free occurs in the local connect() path and needs configured auth keys (PR:L) plus a timing race against softirq RX (AV:L, AC:H); UAF can corrupt kernel memory, so C/I/A High.

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

vuln.today treats the vendor’s rating as authoritative. A higher third-party CVSS (e.g. CISA-ADP) is shown for transparency but does not drive the headline severity.

CVSS VectorVendor: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

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

Lifecycle Timeline

5
Analysis Generated
Aug 17, 2026 - 07:12 vuln.today
CVSS changed
Aug 17, 2026 - 06:22 NVD
9.8 (CRITICAL)
Patch available
Aug 15, 2026 - 07:20 EUVD
CVE Published
Aug 15, 2026 - 06:21 cve.org
CRITICAL 9.8
CVE Published
Aug 15, 2026 - 06:21 cve.org
UNKNOWN (no severity yet)

DescriptionCVE.org

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

tcp: defer md5sig_info kfree past RCU grace period in tcp_connect

The md5+ao reconciliation in tcp_connect() (net/ipv4/tcp_output.c) has two symmetric branches:

if (needs_md5) { tcp_ao_destroy_sock(sk, false); } else if (needs_ao) { tcp_clear_md5_list(sk); kfree(rcu_replace_pointer(tp->md5sig_info, NULL, ...)); }

Both branches free a per-socket auth-info object while the socket is in TCP_SYN_SENT and is already on the inet ehash (inserted by inet_hash_connect() in tcp_v4_connect()). Both branches are reachable by softirq RX-path readers that load the corresponding info pointer via implicit RCU before bh_lock_sock_nested() is taken.

The needs_md5 branch is fixed in the prior patch by re-introducing the call_rcu() free in tcp_ao_destroy_sock(): the equivalent per-key loop runs inside tcp_ao_info_free_rcu(), the RCU callback, so by the time it frees each tcp_ao_key all softirq readers that captured the container have already completed rcu_read_unlock().

The needs_ao branch is not symmetric in the same way. The container free can be deferred via kfree_rcu(md5sig, rcu) -- struct tcp_md5sig_info already has the required rcu member (include/net/tcp.h:1999-2002), and the rest of the tree already does this in the tcp_md5sig_info_add() rollback paths (net/ipv4/tcp_ipv4.c:1410, 1436). But the per-key teardown is done by tcp_clear_md5_list() in process context BEFORE the container's RCU grace period: it walks &md5sig->head and frees each tcp_md5sig_key with bare hlist_del + kfree. A concurrent softirq reader in __tcp_md5_do_lookup() / __tcp_md5_do_lookup_exact() (tcp_ipv4.c:1253, 1298) walks the same list via hlist_for_each_entry_rcu() and races with that bare kfree on the keys themselves -- a per-key slab use-after-free of the same class as the TCP-AO bug, on the same race window.

Fix this in two halves:

  1. Convert the bare kfree() in tcp_connect() to kfree_rcu() so the

md5sig_info container joins the rest of the md5sig lifecycle. The local-variable lift is mechanical and required because kfree_rcu() is a macro that expects an lvalue.

  1. Make tcp_clear_md5_list() RCU-safe by replacing hlist_del +

kfree(key) with hlist_del_rcu + kfree_rcu(key, rcu). struct tcp_md5sig_key already carries the rcu member (include/net/tcp.h:1995) and tcp_md5_do_del() (net/ipv4/tcp_ipv4.c:1456) already uses kfree_rcu, so this restores the lifecycle invariant the rest of the file follows rather than introducing a one-off.

The other caller of tcp_clear_md5_list() is tcp_md5_destruct_sock() (net/ipv4/tcp.c:412), which runs from the sock destructor when the socket is already unhashed and unreachable; the extra grace period there is unnecessary but harmless. Making the helper unconditionally RCU-safe is the cleaner contract.

The needs_ao branch is not reachable by the userns reproducer used to demonstrate the AO-side splat (the repro installs both keys but ends up in the needs_md5 branch because the connect peer matches the MD5 key, not the AO key); however the symmetric race exists and a maintainer touching this code should not have to think about which branch escapes RCU and which one does not.

[also credits to Qihang, who found that this races with tcp-diag]

AnalysisAI

Use-after-free in the Linux kernel's IPv4 TCP stack (net/ipv4/tcp_output.c) occurs when tcp_connect() reconciles conflicting TCP-MD5 and TCP-AO authentication keys on a socket that is already in TCP_SYN_SENT and hashed into the inet ehash. In the needs_ao branch, tcp_clear_md5_list() frees each tcp_md5sig_key and the md5sig_info container with bare kfree() before the RCU grace period, while softirq RX-path readers (__tcp_md5_do_lookup / __tcp_md5_do_lookup_exact) are still walking the same list under RCU, producing a per-key slab use-after-free. It affects kernels on the 6.18 line (and the described stable range) and is fixed by deferring frees with kfree_rcu; no public exploit identified at time of analysis, and EPSS is low (0.21%, 11th percentile).

Technical ContextAI

The flaw lives in the interaction between TCP's two authentication mechanisms - the older TCP-MD5 signature option (TCP_MD5SIG, historically used to protect BGP sessions) and the newer TCP-AO (Authentication Option). Both maintain per-socket auth-info objects (tcp_md5sig_info holding a hlist of tcp_md5sig_key, and tcp_ao_info). These structures are read locklessly on the softirq receive path via RCU (hlist_for_each_entry_rcu), so any teardown must respect an RCU grace period before freeing. The root cause class is a classic Use-After-Free (CWE-416, though the feed lists CWE as N/A): the container was freed with bare kfree() and the per-key list was torn down with hlist_del + kfree in process context, both before readers that captured the objects had exited rcu_read_unlock(). The fix restores the lifecycle invariant the rest of tcp_ipv4.c already follows (kfree_rcu / hlist_del_rcu, as in tcp_md5_do_del and the tcp_md5sig_info_add rollback paths).

RemediationAI

Vendor-released patch: upgrade to Linux 6.18.40 or 7.1.5 (or 7.2-rc2 for the mainline release candidate), which convert the bare kfree() in tcp_connect() to kfree_rcu() and make tcp_clear_md5_list() RCU-safe (hlist_del_rcu + kfree_rcu). The fix commits are at https://git.kernel.org/stable/c/33a1bee413628378fd036a4f2b17ba86b0bc560c, https://git.kernel.org/stable/c/b74cd55038905d5e74c1de109ab78a30b2ea0e1f, and https://git.kernel.org/stable/c/da48b9bf1eb95a9cfd09d615ca58cfc2b03de369; distribution kernels should be updated to the vendor build incorporating these. As a compensating control on hosts that cannot patch immediately, restrict the ability to set TCP-MD5/TCP-AO keys and to create unprivileged user namespaces (sysctl kernel.unprivileged_userns_clone=0 where supported), since the race requires an actor able to configure these socket options; the trade-off is that disabling unprivileged userns can break sandboxed applications and container runtimes that rely on it, and hosts that legitimately use TCP-MD5 for BGP peering cannot simply disable the feature.

Vendor StatusVendor

SUSE

Severity: Important
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Not-Affected
SUSE Linux Enterprise High Availability Extension 15 SP7 Not-Affected
SUSE Linux Enterprise High Availability Extension 16.0 Affected

Share

EUVD-2026-58897 vulnerability details – vuln.today

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