CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-GV8R-9RW9-9697

The Ghost in the Handshake: Traefik & Go mTLS Bypass in HTTP/3

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 20, 2026·7 min read·43 visits

Executive Summary (TL;DR)

A flaw in Go's TLS library allows HTTP/3 clients to bypass Client Authentication (mTLS) in Traefik. If a server updates its trusted CAs, a client can simply 'resume' an old session to bypass the new restrictions. It's like using an expired hand-stamp to re-enter a club after the bouncers changed the rules.

A critical vulnerability in the Go standard library's `crypto/tls` package, affecting the popular Traefik proxy, allows attackers to bypass mutual TLS (mTLS) client authentication. This issue specifically targets HTTP/3 (QUIC) connections leveraging TLS 1.3 session resumption. By exploiting a logic flaw in how Go handles configuration changes during session resumption, a client with a previously valid certificate (or a stolen session ticket) can bypass current access control lists, effectively rendering 'Zero Trust' architectures null and void.

The Hook: The Zero Trust Lie

In the modern infrastructure landscape, we have stopped trusting the network. We don't rely on IP allowlists or VPNs anymore; we rely on Mutual TLS (mTLS). It is the cryptographic equivalent of a biometric scan at every door. You present your client certificate, the server validates it against a trusted Certificate Authority (CA), and only then are you allowed in. Traefik, the darling of the cloud-native world, is often the bouncer standing at that door, managing ingress for thousands of microservices.

But here is the dark joke: security and performance are mortal enemies. To make the web faster, we invented HTTP/3 (powered by QUIC), which runs over UDP and promises lightning-fast connections. One of its tricks is 0-RTT (Zero Round Trip Time) or optimized session resumption. It remembers you so you don't have to do the heavy cryptographic lifting every single time you connect.

CVE-2025-68121 is what happens when that memory is a little too trusting. It turns out that under specific conditions in HTTP/3, Traefik (via Go's crypto/tls) forgets to check if your ID is still valid when you resume a session. It just remembers that you were cool five minutes ago. This is a catastrophic failure for any environment relying on mTLS for zero-trust enforcement, effectively turning your fortress into a public park.

The Flaw: Optimization Over Security

The root cause lies deep within the Go programming language's standard library, specifically in how crypto/tls handles TLS 1.3 session resumption. In a standard TLS handshake, the server looks at its configuration (ClientCAs), requests a certificate from the client, validates the signature, and checks the chain of trust. This is expensive in terms of CPU and latency.

To speed this up, TLS 1.3 allows Session Resumption. The server gives the client a "ticket" after the first handshake. The client can present this ticket later to say, "Hey, we just talked, let's use the same encryption keys." The logic flaw here is a classic caching error. The Go library assumed that the server's configuration—specifically the list of trusted CAs—is immutable (unchanging) for the lifespan of that ticket.

However, Traefik is a dynamic proxy. It reloads configurations on the fly. You might rotate your CAs, revoke a compromised root, or change the ClientAuth policy from VerifyClientCertIfGiven to RequireAndVerifyClientCert. The vulnerability is that during resumption, Go checked the validity of the ticket, but it failed to re-verify that the client's certificate chain is trusted by the current ClientCAs configuration. It blindly trusted the state from the previous handshake.

The Code: The Smoking Gun

The vulnerability exists in the server_handshake_tls13.go file within the Go standard library. When a client attempts to resume a session (using a Pre-Shared Key or PSK), the server code needs to decide if the old session is still safe to use. The flaw was an omission: the code verified the cipher suites and the SNI, but it didn't verify that the ClientCAs pool hadn't changed.

Here is a conceptual simplification of the vulnerable logic versus the fix:

// VULNERABLE LOGIC (Simplified)
func (c *Conn) handleResumption() {
    session := c.decryptTicket()
    
    // The code checks if the certificate matches, but...
    // It DOES NOT check if the CA that signed this cert 
    // is still in the config.ClientCAs pool.
    if session != nil {
        c.resumeSession(session)
        return // Bypass complete!
    }
    // Fallback to full handshake
}

The fix, introduced in Go 1.24.13 and 1.25.7, adds a critical check. It forces the library to compare the trust anchors used in the original session against the current configuration. If they don't match (e.g., the admin removed a CA), resumption is rejected, forcing a full handshake where the client will fail authentication.

// PATCHED LOGIC
func (c *Conn) handleResumption() {
    session := c.decryptTicket()
    
    // New check: Is the peer's certificate chain still valid 
    // according to the CURRENT config?
    if !c.config.ClientCAs.Contains(session.peerCertChain[0]) {
        // Config changed! Reject resumption.
        return c.doFullHandshake()
    }
    
    c.resumeSession(session)
}

This highlights a dangerous pattern in stateful protocol implementation: Assumption of Static State. In dynamic environments like Kubernetes ingress controllers, nothing is static.

The Exploit: The 'Club Handstamp' Attack

Let's construct a realistic attack scenario. Imagine you have a Traefik ingress controller protecting a sensitive admin panel. It requires a client certificate signed by AdminCA.

Step 1: The Legitimate Entry. The attacker obtains a valid client certificate. Maybe they compromise a low-level employee's laptop, or maybe they were an employee. They connect to the Traefik instance using HTTP/3. The handshake succeeds. Traefik issues a TLS Session Ticket. The attacker now has the "handstamp."

Step 2: The Lockout. The security team detects the compromise or the employee is fired. They update the Traefik configuration. They remove AdminCA from the trust store or revoke the specific certificate. They push the new config. Traefik reloads hot, without dropping connections.

Step 3: The Bypass. The attacker, holding the Session Ticket, reconnects. Instead of initiating a new handshake (which would fail because their cert is now untrusted), they send the Session Ticket in the ClientHello.

Because of CVE-2025-68121, the Go TLS stack sees the valid ticket and thinks, "Oh, I know you." It resumes the session using the old trust context. The attacker is now authenticated and inside the admin panel, despite their certificate authority being explicitly removed from the server's configuration. The "lock" was changed, but the "key" (the session ticket) still works.

The Impact: Why Should We Panic?

This vulnerability is rated CVSS 10.0 (Critical) for a reason. mTLS is rarely used for public websites; it is used for high-security, internal communications (Service-to-Service) and administrative access. It is the bedrock of "Zero Trust."

If you are running a service mesh, a bank API, or a corporate VPN replacement that uses Traefik with HTTP/3 enabled, your revocation lists are essentially broken for anyone with a session ticket. An attacker with persistence can maintain access indefinitely by constantly refreshing their session ticket, even after you have supposedly locked them out.

Furthermore, because this is an issue in the underlying Go library, it's not just Traefik. Any Go-based HTTP/3 server that relies on ClientCAs for authentication and allows configuration updates (common in microservices) is vulnerable. The impact is total compromise of the authentication layer.

The Fix: Closing the Window

The remediation path is straightforward but urgent. The flaw is in the binary's standard library, so you cannot just change a config file—you must update the software itself.

For Traefik Users: Update immediately to v2.11.37 or v3.6.8. These versions were built with the patched Go version. If you cannot update immediately, your only effective workaround is to disable HTTP/3 entirely in your Traefik static configuration. This forces clients to use HTTP/1.1 or HTTP/2, which do not trigger this specific code path in the same way.

For Go Developers: If you maintain your own Go-based servers, you must recompile your application with Go 1.24.13, Go 1.25.7, or Go 1.26.0-rc3. Simply restarting your service isn't enough; the binary itself carries the vulnerable crypto/tls logic. Check your go.mod and your CI/CD pipelines immediately.

Official Patches

TraefikRelease notes for Traefik v2.11.37
GoGo 1.24.13 Release Notes

Fix Analysis (1)

Technical Appendix

CVSS Score
10.0/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
EPSS Probability
0.02%
Top 100% most exploited
50,000
via Shodan

Affected Systems

Traefik Proxy (v2.x <= 2.11.36)Traefik Proxy (v3.x <= 3.6.7)Kubernetes Ingress Controllers using affected Traefik versionsCustom Go applications using crypto/tls and HTTP/3

Affected Versions Detail

Product
Affected Versions
Fixed Version
Traefik
Traefik Labs
<= 2.11.362.11.37
Traefik
Traefik Labs
<= 3.6.73.6.8
Go Standard Library
Go
< 1.24.131.24.13
AttributeDetail
CVE IDCVE-2025-68121
CVSS Severity10.0 (Critical)
Attack VectorNetwork (Session Resumption)
Affected ComponentGo crypto/tls (HTTP/3)
ImpactAuthentication Bypass (mTLS)
Exploit StatusPoC Available
EPSS Score0.00016 (Rising)

MITRE ATT&CK Mapping

T1550Use Existing Material
Defense Evasion
T1078Valid Accounts
Initial Access
T1553Subvert Trust Controls
Defense Evasion
CWE-295
Improper Certificate Validation

Improper Certificate Validation

Known Exploits & Detection

Internal ResearchGo Issue Tracker discussion detailing the reproduction steps.
GitHub AdvisoryTraefik advisory confirming the vector via HTTP/3.
NucleiDetection Template Available

Vulnerability Timeline

Vulnerability reported to Go Security Team
2026-01-16
CVE-2025-68121 Assigned
2026-02-05
Traefik releases fixed versions v2.11.37 and v3.6.8
2026-02-20
Public disclosure via GHSA
2026-02-21

References & Sources

  • [1]GitHub Advisory: TLS ClientAuth Bypass
  • [2]NVD: CVE-2025-68121
Related Vulnerabilities
CVE-2024-45337

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 4 hours ago•CVE-2022-0492
7.8

CVE-2022-0492: Privilege Escalation and Container Escape via cgroups v1 release_agent

CVE-2022-0492 is a high-severity missing authorization vulnerability in the Linux kernel's Control Groups (cgroups) v1 implementation. The flaw resides within the cgroup_release_agent_write function in kernel/cgroup/cgroup-v1.c, where the kernel fails to validate if the process writing to the release_agent file possesses administrative capabilities in the initial user namespace. This allows a local attacker inside a container with root privileges (UID 0) to abuse user namespaces, mount a cgroups v1 directory, modify the release_agent parameter, and execute arbitrary commands on the host system as host root, effectively achieving a complete container escape.

Amit Schendel
Amit Schendel
4 views•7 min read
•2 days ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
8 views•6 min read
•2 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•2 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•2 days ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
27 views•7 min read
•2 days ago•CVE-2026-47759
8.7

CVE-2026-47759: Stored Cross-Site Scripting (XSS) via Unsanitized data-mce-* Serialization Bypass in TinyMCE

CVE-2026-47759 is a critical stored Cross-Site Scripting (XSS) vulnerability affecting multiple active branches of the TinyMCE rich text editor. The flaw resides in the editor's handling of user-controlled, prefixed internal attributes, such as data-mce-href, data-mce-src, and data-mce-style. When processing raw HTML inputs, TinyMCE's internal validation schema neglects to inspect these custom prefixed attributes. During HTML serialization, the editor's engine extracts these unsanitized values and copies them back into standard executable attributes, overwriting any previously sanitized standard values and leading to execution of arbitrary code.

Amit Schendel
Amit Schendel
13 views•7 min read