Skip to main content

Temporal s2s-proxy EUVDEUVD-2026-85567

| CVE-2026-96770 CRITICAL
Improper Following of a Certificate's Chain of Trust (CWE-296)
2026-09-23 Temporal GHSA-fhc4-rg5x-86fx
9.3
CVSS 4.0 · Vendor: Temporal
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach exposed s2s-proxy TLS listener
  2. Delivery
    Present self-signed client certificate
  3. Exploit
    Bypass CA verification (RequireAnyClientCert)
  4. Execution
    Establish TLS and yamux session
  5. Persist
    Invoke allowed admin-service RPCs
  6. Impact
    Read 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.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

s2s-proxy 0.0.1-alpha ≤0.2.2

Affected Packages

euvd s2s_proxy no fix

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

Vendor (Temporal) PRIMARY 9.3 CRITICAL
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
vuln.today AI 10.0 CRITICAL

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.

3.1 AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

Primary rating from Vendor (Temporal).

CVSS VectorVendor: Temporal

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
High
Subsequent system: Integrity
High
Subsequent system: Availability
High

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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.3%
Top 85% exploitable
Prevalence
Low
niche server-to-server replication proxy for Temporal multi-cluster deployments
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact
Very High
Technical Impact
Total

Priority Score

46
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

More in Go

View all
CVE-2023-44487 HIGH POC
7.5 Oct 10

Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour

CVE-2016-5386 HIGH
8.1 Jul 19

The net/http package in Go through 1.6 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and there

CVE-2025-68121 CRITICAL POC
10.0 Feb 05

Critical certificate validation bypass in Go crypto/tls during session resumption. If ClientCAs or RootCAs fields are mu

CVE-2019-14809 CRITICAL POC
9.8 Aug 13

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

CVE-2026-90942 CRITICAL POC
9.3 Sep 14

Casdoor through 4.4.0 exposes its instance-wide built-in JWT signing private key unmasked through the /api/get-certs and

CVE-2026-101090 CRITICAL POC
9.3 Sep 27

Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re

CVE-2026-78428 HIGH POC
8.8 Sep 17

Session cross-wiring in SUSE NeuVector before 5.6.1 allows an unauthenticated remote attacker to obtain another user's a

CVE-2026-92791 HIGH POC
8.7 Sep 16

Unauthenticated path traversal in Uber Kraken through 0.1.29 allows remote attackers to read files outside the configure

CVE-2018-7187 HIGH POC
8.8 Feb 16

The "go get" implementation in Go 1.9.4, when the -insecure command-line option is used, does not validate the import pa

CVE-2026-16651 HIGH POC
8.7 Sep 21

Denial of service in Temporal Server allows an authenticated caller holding at least namespace read permission to crash

CVE-2026-82405 HIGH POC
8.7 Sep 23

Account takeover in Klever-Go's KleverUpdateAccountPermission built-in (all versions prior to 1.7.20) allows an attacker

CVE-2026-82409 HIGH POC
8.4 Sep 23

Maliciously crafted on-chain account names processed by Klever-Go prior to 1.7.20 are spliced into Elasticsearch _bulk r

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