Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach exposed s2s-proxy TLS listener
-
DeliveryPresent self-signed client certificate
-
ExploitBypass CA verification (RequireAnyClientCert)
-
ExecutionEstablish TLS and yamux session
-
PersistInvoke allowed admin-service RPCs
-
ImpactRead or modify Temporal cluster state
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V12 - Secure Communication Certificate chain validation
|
| Exploitation Conditions | Requires an s2s-proxy instance running an affected version (0.1.16 through 0.2.2) whose TLS server listener is configured with skipCAVerification=false (i.e. RequireClientAuth expected), which paradoxically triggers Go's RequireAnyClientCert mode that omits CA chain verification. The attacker must have network reachability to that mux/TCP server listener. No trusted certificate, private key, or Temporal credential is required, and no user interaction is needed. The practical limiting factor is network exposure of the replication listener and the breadth of RPCs enabled in the proxy's aclPolicy allowedMethods/allowedNamespaces, which bounds what an authenticated-as-peer attacker can do. |
| Impact | This is a genuine high-priority defect, not a high-CVSS-but-low-risk artifact. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) describes a network-reachable, low-complexity, fully unauthenticated flaw, and the description confirms the substance: because TLS server listeners select Go's RequireAnyClientCert mode when skipCAVerification is false, the proxy proves the client possesses a private key but never checks the certificate against the configured CA (CWE-296). An attacker's own self-signed cert therefore satisfies the check, so the intended mTLS trust boundary provides no authentication at all. The scope-change signals (SC:H/SI:H/SA:H) are well-founded: a successful connection lets the attacker invoke the admin-service RPCs permitted by the proxy's aclPolicy (e.g. AddOrUpdateRemoteCluster, GetWorkflowExecutionRawHistoryV2, StreamWorkflowReplicationMessages) against the backing Temporal cluster. No EPSS score, KEV entry, or SSVC decision data was provided, and no weaponized POC is referenced - but the CVE ships direct source-code evidence (encryption/tls.go and the fixing commit), the logic error is trivially understood, and no secret material is needed to exploit it, which collectively imply a low exploitation barrier for anyone who can reach an affected listener. The one material limiter is exposure: the proxy's mux/TCP server listener must be network-reachable to the attacker, which in typical cross-cluster replication deployments may be a restricted network path rather than the open internet. |
| Exploit ScenarioDerived | An attacker who can reach an s2s-proxy TLS server listener (versions 0.1.16-0.2.2 with skipCAVerification=false) generates a throwaway self-signed certificate and key, which satisfies the RequireAnyClientCert private-key check without any CA validation. They complete the TLS and yamux handshake as if they were a trusted peer cluster and then issue the admin-service RPCs the proxy's ACL allows, reaching the backing Temporal cluster with no trusted certificate and no Temporal credential. No public weaponized exploit is referenced, but the vendor commit and vulnerable source lines are published, making reproduction straightforward. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 23, 2026
Unauthenticated remote attackers can bypass client-certificate trust in Temporal's s2s-proxy 0.1.16 through 0.2.2 by presenting a self-signed certificate and key to a mux or TCP TLS server listener, because the proxy runs Go's RequireAnyClientCert mode whenever skipCAVerification is false and therefore never validates the presented chain against the configured CA. A successful handshake yields a yamux-multiplexed, peer-authenticated channel on which the attacker can call every RPC the proxy's aclPolicy allows, exercising the proxy's own Temporal credentials against the cross-cluster replication API without supplying any trusted certificate, private key, or Temporal credential. No CISA KEV active-exploitation signal is present and no public exploit identified at time of analysis, but the defect carries a 9.3 CVSS 4.0 score and the vendor has published an upstream fix (PR #296 plus associated commits).
RemediationAI
Deploy the upstream fix: the vendor states a patch is available, delivered via s2s-proxy PR #296 and commits f1dc6b9a3919d37e82545ab461cbe6bb62618d3c and d100c2258dbc37d7df51298ea045315f36c7eb3b, so upgrade to the first tagged release after 0.2.2 that contains that change and confirm in encryption/tls.go that a listener requiring client authentication now selects full CA chain verification (RequireAndVerifyClientCert) rather than RequireAnyClientCert; note that upstream fix available (PR/commit), released patched version not independently confirmed, and that setting skipCAVerification=true is not a fix because it does not enable chain verification. If upgrade cannot be completed immediately, restrict network reachability to the proxy's mux/TCP replication listener (port 11000 in Temporal's sample configurations, or whatever the deployment assigns) by binding it to a private interface, applying firewall or security-group allow-lists limited to known peer proxy and cluster addresses, and keeping it off public ingress, accepting that this control must be maintained as cluster membership changes and that it fails open if rules drift. A stronger interim control is to terminate and validate mTLS in a service-mesh sidecar or load balancer placed in front of the proxy listener so that unverified client certificates never reach the vulnerable Go listener, at the cost of an extra hop, connection overhead, and making the sidecar's own trust configuration the new trust anchor. Finally, shrink the blast radius by trimming aclPolicy allowedMethods and allowedNamespaces to the minimum required for replication, understanding that this limits damage but does not remediate the certificate bypass.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw sits in the TLS listener handling of Temporal's s2s-proxy, the Go service that links Temporal clusters for cross-cluster replication. Go's crypto/tls offers several ClientAuthType values, and the relevant one, RequireAnyClientCert, only confirms that the peer possesses the private key for the certificate it presents; it intentionally skips validating that certificate against the configured CA pool. The proxy's configuration translation layer maps operator-facing RequireClientAuth/VerifyCA settings onto an internal SkipCAVerification flag, so a listener that appears to require verified client authentication resolves instead to RequireAnyClientCert rather than RequireAndVerifyClientCert, which is the CWE-296 (improper following of a certificate's chain of trust) failure class. Once the TLS handshake and the yamux stream-multiplexing layer are established, the attacker is treated as a legitimate peer proxy and can invoke whatever RPCs the deployment's aclPolicy enables, such as AddOrUpdateRemoteCluster, DescribeCluster, DescribeMutableState, GetNamespaceReplicationMessages, GetWorkflowExecutionRawHistoryV2, and StreamWorkflowReplicationMessages, driving them with the proxy's Temporal credentials. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N with subsequent-system high confidentiality, integrity, and availability impact) reflects that the proxy is a trust bridge whose compromise propagates into the Temporal clusters it fronts; the affected package is tracked as cpe:2.3:a:temporal_technologies,_inc.:s2s-proxy:*:*:*:*:*:*:*:* and the vulnerable logic resides in encryption/tls.go, with the fix commit d100c2258dbc37d7df51298ea045315f36c7eb3b renaming VerifyCA to SkipCAVerification and correcting the mapping.
Know when Go gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:H/SI:H/SA:H
Unauthenticated network cert-validation bypass (self-signed cert accepted) crosses into the backing Temporal cluster, so S:C with high read/modify/DoS via admin RPCs.
Primary rating from Vendor (Temporal).
CVSS VectorVendor: Temporal
DescriptionCVE.org
All published s2s-proxy versions through 0.2.2 are affected. In versions 0.1.16 through 0.2.2, TLS server listeners use Go's RequireAnyClientCert mode when skipCAVerification is false. This mode checks that the client holds the certificate's private key but does not verify the certificate against the configured CA. An attacker can therefore use a self-signed certificate and key to establish a TLS and yamux connection, then invoke RPCs allowed by the proxy's configuration and Temporal credentials. No certificate or private key trusted by the deployment, and no Temporal credential, is required.
Executive ViewAI
Temporal's s2s-proxy, the component that brokers trust between Temporal clusters, can be induced to accept connections from any party able to reach its mux or TCP TLS listener, after which the proxy's own credentials are used to reach the cross-cluster replication API - effectively letting the proxy vouch for an untrusted caller. Organizations running s2s-proxy 0.1.16 through 0.2.2 lose the certificate-based assurance they depend on to keep replication traffic between clusters authenticated and private. This matters to leadership because the affected service sits directly in the data path between production clusters, so a single internet- or partner-reachable listener can place replicated state, and the trust relationship between environments, at risk.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour
The net/http package in Go through 1.6 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and there
Critical certificate validation bypass in Go crypto/tls during session resumption. If ClientCAs or RootCAs fields are mu
net/url in Go before 1.11.13 and 1.12.x before 1.12.8 mishandles malformed hosts in URLs, leading to an authorization by
Casdoor through 4.4.0 exposes its instance-wide built-in JWT signing private key unmasked through the /api/get-certs and
Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re
Session cross-wiring in SUSE NeuVector before 5.6.1 allows an unauthenticated remote attacker to obtain another user's a
Unauthenticated path traversal in Uber Kraken through 0.1.29 allows remote attackers to read files outside the configure
The "go get" implementation in Go 1.9.4, when the -insecure command-line option is used, does not validate the import pa
Denial of service in Temporal Server allows an authenticated caller holding at least namespace read permission to crash
Account takeover in Klever-Go's KleverUpdateAccountPermission built-in (all versions prior to 1.7.20) allows an attacker
Maliciously crafted on-chain account names processed by Klever-Go prior to 1.7.20 are spliced into Elasticsearch _bulk r
EUVD-2026-85567
GHSA-fhc4-rg5x-86fx
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB