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



CVE-2026-27945

ZITADEL Actions V2 Server-Side Request Forgery (SSRF)

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 28, 2026·6 min read·49 visits

Executive Summary (TL;DR)

ZITADEL Actions V2 fails to validate webhook target URLs against a deny-list. Authenticated admins can exploit this to send HTTP requests to the loopback interface or internal network services (SSRF). Fixed in version 4.11.1.

A Server-Side Request Forgery (SSRF) vulnerability exists in the ZITADEL identity management platform within the Actions V2 execution engine. The vulnerability allows authenticated administrators with permission to configure Actions to define webhook targets that resolve to local or internal network addresses. This flaw enables high-privileged attackers to probe the internal network structure, access cloud instance metadata services, or interact with local services bound to the loopback interface, bypassing network perimeter controls.

Vulnerability Overview

ZITADEL Actions V2 is a feature introduced to allow developers to customize authentication flows and trigger external logic via webhooks. These actions are executed by the ZITADEL server, which issues HTTP requests to user-defined URLs. CVE-2026-27945 is a Server-Side Request Forgery (SSRF) vulnerability residing in the HTTP client implementation used to execute these webhooks.

The core issue is the absence of destination validation. Prior to version 4.11.1, the execution engine would accept any syntactically valid URL and attempt to establish a connection. This behavior allows an attacker with the actions configuration privilege to direct the ZITADEL server to initiate connections to arbitrary hosts, including localhost (127.0.0.1), link-local addresses, and private network ranges (RFC 1918).

While the CVSS score is low (2.1) due to the high privilege requirement (PR:H) and specific configuration needs (AT:P), the architectural flaw represents a significant risk in multi-tenant environments or scenarios where an administrator account is compromised. An attacker can pivot from the ZITADEL instance to the internal network, potentially accessing unauthenticated management interfaces or cloud metadata services.

Root Cause Analysis

The vulnerability stems from the direct usage of a standard Go http.Client without a restrictive RoundTripper or pre-flight validation logic. In the vulnerable versions (ZITADEL >= 2.59.0, < 4.11.1), the Action execution logic takes the user-supplied target URL and passes it to the transport layer for execution.

CWE-918 (Server-Side Request Forgery) occurs here because the application processes a user-supplied URL and uses it to perform a request to an unexpected destination. The specific failure was the lack of a 'guard rails' mechanism to inspect the resolved IP address of the target hostname before establishing the TCP connection.

Furthermore, the default behavior of many HTTP clients, including Go's net/http, is to follow HTTP redirects. Even if a naive check validated the initial URL (e.g., ensuring the string does not start with localhost), an attacker could bypass this by pointing the Action to an external server attacker.com, which responds with a 302 Found redirecting to http://127.0.0.1:8080.

Code Analysis

The remediation for CVE-2026-27945 involved implementing a custom transport layer that intercepts the request flow to validate the destination against a deny-list.

Vulnerable Logic (Conceptual): In the unpatched version, the execution flow was direct:

// Simplified representation of the vulnerable flow
func ExecuteWebhook(targetURL string, payload []byte) (*http.Response, error) {
    client := &http.Client{Timeout: 5 * time.Second}
    // No validation of targetURL host/IP
    req, _ := http.NewRequest("POST", targetURL, bytes.NewBuffer(payload))
    return client.Do(req)
}

Patched Logic (Commit b2532e9666): The fix introduces a DenyList mechanism and applies it within the RoundTrip method. This ensures that validation occurs immediately before the connection is attempted.

// internal/actions/http_module.go (Patched)
 
func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
    // 1. Extract Hostname
    host := req.URL.Hostname()
 
    // 2. Validate Hostname against DenyList (e.g., "localhost")
    if t.denyList.IsBlocked(host) {
        return nil, fmt.Errorf("target host %s is blocked", host)
    }
 
    // 3. Resolve IP addresses
    ips, err := net.LookupIP(host)
    if err != nil {
        return nil, err
    }
 
    // 4. Validate resolved IPs against DenyList (e.g., 127.0.0.1)
    for _, ip := range ips {
        if t.denyList.IsIPBlocked(ip) {
            return nil, fmt.Errorf("target IP %s is blocked", ip.String())
        }
    }
 
    // 5. Proceed with request if safe
    return t.next.RoundTrip(req)
}

> [!NOTE] > While the patch adds necessary validation, it relies on net.LookupIP before the actual RoundTrip. If the underlying transport performs a second DNS resolution (common in Go's DefaultTransport), this code path remains theoretically vulnerable to DNS Rebinding (TOCTOU) attacks, where the DNS server returns a safe IP during the check and a malicious IP during the connection.

Exploitation Scenarios

To exploit this vulnerability, an attacker must have a role allowing the configuration of ZITADEL Actions (e.g., IAM_OWNER or ORG_OWNER).

Scenario 1: Internal Port Scanning

  1. Setup: The attacker defines a new Action triggered by a common event (e.g., Flow: Login).
  2. Configuration: The Action script is set to send a webhook to http://localhost:$PORT.
  3. Iteration: The attacker updates the port number (80, 443, 22, 5432) and triggers the flow.
  4. Observation: By observing the execution logs or error messages (e.g., Connection refused vs. Timeout vs. Bad Request), the attacker infers which ports are listening on the ZITADEL server.

Scenario 2: Cloud Metadata Exfiltration If ZITADEL is hosted on AWS, GCP, or Azure, the attacker targets the link-local metadata service.

// Malicious Action Configuration
let url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/";
// Triggers the SSRF
let response = http.fetch(url, { method: "GET" });

If the ZITADEL instance has not disabled HTTP access to the metadata service, this request could return temporary credentials associated with the instance role.

Impact Assessment

The impact of CVE-2026-27945 is constrained by the privileges required to exploit it. It is not an unauthenticated remote code execution vulnerability; it is a post-authentication lateral movement vector.

Confidentiality: Low to Medium. An attacker can map the internal network and potentially read data from internal services that rely solely on network location for authentication (e.g., Redis without password, Actuator endpoints).

Integrity: Low. If internal services allow state-changing operations via GET requests or unauthenticated POST requests (REST APIs), the attacker could modify internal system states.

Availability: None. The vulnerability does not directly allow for denial of service against the ZITADEL instance itself, though it could be used to harass internal services.

EPSS & CVSS: The EPSS score (0.00034) reflects the low probability of mass exploitation due to the high-privilege requirement. The CVSS 4.0 score of 2.1 is derived primarily from the limitation that the attacker is already a high-level administrator.

Remediation & Mitigation

The primary remediation is to upgrade ZITADEL to version 4.11.1 or later. This version introduces the denylist package which blocks access to loopback and unspecified addresses by default.

Configuration Required for Full Protection: The default patch only blocks loopback addresses (127.0.0.0/8, ::1). It does not automatically block private network ranges (RFC 1918). Administrators must explicitly configure the ZITADEL_EXECUTIONS_DENYLIST environment variable or configuration file to include these ranges if ZITADEL is deployed in a sensitive internal network.

Recommended Deny List for Private Networks:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 169.254.169.254/32 (Cloud Metadata)

Defense in Depth: Regardless of the patch status, infrastructure-level controls should be applied:

  1. Kubernetes NetworkPolicies: Restrict egress traffic from the ZITADEL namespace to allow connections only to known external endpoints (e.g., SMTP, SMS providers).
  2. Service Mesh / Sidecars: Use Istio or Linkerd to enforce an allow-list for egress traffic, preventing the application from connecting to arbitrary IPs even if the application-level check is bypassed.

Official Patches

ZITADELZITADEL v4.11.1 Release Notes containing the fix

Fix Analysis (2)

Technical Appendix

CVSS Score
2.1/ 10
CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
EPSS Probability
0.03%
Top 90% most exploited

Affected Systems

ZITADEL Identity Management System

Affected Versions Detail

Product
Affected Versions
Fixed Version
ZITADEL
ZITADEL
>= 2.59.0 < 4.11.14.11.1
AttributeDetail
CVE IDCVE-2026-27945
CWE IDCWE-918
Attack VectorNetwork
CVSS v4.02.1 (Low)
Privileges RequiredHigh (Admin)
EPSS Score0.03%

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-918
Server-Side Request Forgery (SSRF)

The application does not validate or incorrectly validates the destination IP address of an HTTP request, allowing an attacker to coerce the server into connecting to internal-only services.

Known Exploits & Detection

Research ContextAdvisory describing the theoretical attack via configured Actions

Vulnerability Timeline

Preliminary related fixes committed
2026-02-18
Core SSRF fix committed to repository
2026-02-25
CVE-2026-27945 Published
2026-02-26
NVD Analysis Pending
2026-02-27

References & Sources

  • [1]GHSA Advisory
  • [2]NVD Detail

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 7 hours ago•GHSA-4PH6-MJV7-3FQ6
6.5

GHSA-4PH6-MJV7-3FQ6: Improper Handling of Untrusted DNS-over-HTTPS Response Data in netfoil

netfoil, an allowlist-based DNS proxy, failed to sanitize ALPN fields parsed from untrusted DNS-over-HTTPS (DoH) HTTPS Resource Records. This allowed attackers to inject ANSI escape sequences into log files or trigger Denial of Service (DoS) via uncontrolled memory allocations.

Alon Barad
Alon Barad
5 views•6 min read
•about 8 hours ago•GHSA-3GJW-F78C-VVPW
7.5

GHSA-3GJW-F78C-VVPW: Denial of Service via Unhandled Out-of-Bounds Indexing Panic in tokio-postgres

An issue was discovered in the tokio-postgres library for Rust prior to version 0.7.18. A trust assumption mismatch between the PostgreSQL protocol messages sent by a server and how they are parsed and indexed by the client-side library allows a rogue or compromised database server to trigger a Denial of Service (DoS) crash via an unhandled out-of-bounds slice indexing panic.

Alon Barad
Alon Barad
6 views•6 min read
•about 22 hours ago•CVE-2026-14669
8.8

CVE-2026-14669: PostgreSQL to_char() Timezone Abbreviation Heap-Based Buffer Overflow

CVE-2026-14669 is a critical heap-based buffer overflow vulnerability in PostgreSQL's date/time formatting function to_char(timestamptz). The flaw arises from unsafe copying of user-controlled timezone abbreviations into a fixed-size internal buffer. An authenticated database user can trigger this issue by setting a long POSIX timezone abbreviation containing custom formatting, allowing them to overwrite adjacent heap structures and hijack execution control to achieve remote code execution (RCE) with the privileges of the 'postgres' operating system user.

Alon Barad
Alon Barad
14 views•6 min read
•3 days ago•CVE-2026-63462
7.5

CVE-2026-63462: Unauthenticated Stack Overflow Denial of Service in Unleash Server

An unauthenticated remote denial of service vulnerability exists in the Unleash feature management platform. By submitting a crafted JSON payload containing deeply nested structures to an OpenAPI-validated endpoint, an attacker can trigger uncontrolled recursion within the error formatting module. This leads to a call-stack exhaustion (RangeError: Maximum call stack size exceeded) inside the Node.js runtime, causing the service to crash immediately without recovery.

Alon Barad
Alon Barad
11 views•6 min read
•3 days ago•CVE-2026-63004
5.5

CVE-2026-63004: Server-Side Request Forgery in Unleash Addon and Integration Subsystem

CVE-2026-63004 is a server-side request forgery (SSRF) vulnerability in the Unleash feature management platform. Authenticated administrators with CREATE_ADDON or UPDATE_ADDON privileges can exploit this vulnerability to initiate requests to loopback addresses, private networks, and cloud metadata endpoints, potentially leading to information disclosure and credential extraction.

Amit Schendel
Amit Schendel
10 views•8 min read
•3 days ago•CVE-2026-63466
4.1

CVE-2026-63466: Process-Wide Security Degradation via Global Module Mutation in Unleash

Prior to version 8.0.3, Unleash's Markdown event formatter directly mutated the global template-escaping function of the shared mustache Node.js module, resulting in a process-wide security degradation where HTML/Markdown escaping was permanently disabled for the application lifetime.

Alon Barad
Alon Barad
3 views•6 min read