Mar 11, 2026·5 min read·8 visits
Go's crypto/tls package fails to re-validate certificate chains against updated trust stores during TLS session resumption, allowing revoked certificates to maintain access if a valid session ticket was previously issued.
A critical vulnerability in the Go standard library's crypto/tls package allows attackers to bypass updated Certificate Authority (CA) trust stores during TLS session resumption. Applications that dynamically mutate TLS configurations, such as the Terraform Provider for SendGrid, may inadvertently accept connections from entities whose certificates have been explicitly revoked or removed from the active trust configuration.
CVE-2025-68121 identifies a critical flaw in the Go standard library's crypto/tls package regarding improper certificate validation during TLS session resumption. The vulnerability specifically affects downstream applications that dynamically modify TLS trust configurations, such as the terraform-provider-sendgrid.
When a TLS session is resumed, the underlying implementation fails to re-verify the certificate chain against updated Certificate Authority (CA) trust stores. This results in a scenario where revoked or newly untrusted certificates can still be used to establish a secure connection.
The issue fundamentally undermines dynamic trust revocation mechanisms within Go-based network services. Applications that clone and modify tls.Config objects on a per-request basis are particularly susceptible, as the cloned configuration retains the ability to process session tickets issued before the trust boundaries were altered.
TLS session resumption optimizes performance by caching security parameters from a prior successful handshake. Go's crypto/tls implementation issues session tickets to clients, which encapsulate these parameters in an encrypted format.
The vulnerability is triggered when the server or client mutates its tls.Config object, specifically the RootCAs or ClientCAs fields, between the initial connection and the resumed connection. During the resumption phase, the Go TLS parser accepts the valid session ticket but omits the necessary step of evaluating the original certificate chain against the currently active trust configuration.
Consequently, the connection is authorized based on stale trust parameters rather than the explicitly defined current policy. The core failure resides in the state machine of the TLS handshake parser, which treats the successful decryption of a session ticket as implicit authorization, bypassing the explicit trust store checks mandated by the modified tls.Config.
The core issue revolves around the Config.Clone() method and dynamic configuration callbacks like GetConfigForClient. Prior to the patch, Config.Clone() copied the automatically generated session ticket keys into the new configuration object.
If this cloned configuration was subsequently modified to enforce stricter trust requirements, it retained the ability to decrypt and accept session tickets issued by the original, more permissive configuration. The system did not implement a mechanism to invalidate or forcefully re-verify ticket-resumed sessions against the newly mutated ClientCAs or RootCAs lists.
The patched versions of Go address this by ensuring that resumed sessions strictly re-evaluate the peer's certificate chain against the currently active RootCAs or ClientCAs collections. Furthermore, developers managing session ticket keys manually via SetSessionTicketKeys must explicitly rotate these keys when modifying trust stores to prevent similar bypasses.
Exploiting this vulnerability requires a specific sequence of events and architectural conditions. An attacker must first establish a legitimate TLS connection with the target service to obtain a valid session ticket.
Subsequently, the service administrator must update the application's tls.Config to distrust the attacker's certificate or the issuing CA. The attacker then initiates a new connection, presenting the previously acquired session ticket in the ClientHello message.
Because the vulnerable Go implementation relies solely on the cryptographic validity of the ticket, the connection succeeds despite the attacker's certificate no longer being trusted by the active configuration. This allows the attacker to maintain persistent, unauthorized access to the service until the session ticket naturally expires or the ticket keys are rotated.
The National Vulnerability Database assigns this flaw a CVSS v3.1 score of 10.0, indicating critical severity due to the potential bypass of intended access controls. The immediate consequence is that revoked entities maintain persistent access to services that rely on dynamic TLS trust modifications.
However, the practical exploitability depends heavily on the target application's architecture. Services that do not dynamically mutate tls.Config or utilize session resumption are largely unaffected. Static configurations that require a full service restart to apply CA changes do not expose this vulnerability.
This architectural nuance is reflected in lower severity ratings (e.g., 4.8) assigned by specific vendors whose implementations do not expose the vulnerable code path. Despite these conditional factors, any ecosystem tool, such as the terraform-provider-sendgrid, built on the affected Go toolchain presents a latent risk if its internal operations involve modifying trust parameters on the fly.
Complete remediation requires upgrading the underlying Go toolchain and recompiling all affected binaries. Developers must update to Go version 1.24.13, 1.25.7, or later releases containing the fix.
For ecosystem components like the terraform-provider-sendgrid, maintainers must publish new releases built with the patched compiler, and end-users must update their provider versions. Simply updating the Go runtime on the host operating system is insufficient for statically compiled Go binaries.
In environments where immediate recompilation is impossible, disabling TLS session tickets entirely by setting SessionTicketsDisabled: true in the tls.Config serves as an effective temporary mitigation. This configuration forces a full TLS handshake for every connection, neutralizing the ticket-based trust bypass at the cost of increased cryptographic overhead.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Go (crypto/tls) The Go Authors | < 1.24.13 | 1.24.13 |
Go (crypto/tls) The Go Authors | >= 1.25.0, < 1.25.7 | 1.25.7 |
terraform-provider-sendgrid arslanbekov | All versions built with vulnerable Go compilers | Requires recompilation |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-295 |
| Attack Vector | Network |
| CVSS v3.1 Score | 10.0 |
| Exploit Status | Proof of Concept |
| CISA KEV | No |
| Privileges Required | None |
Improper Certificate Validation