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-27946

ZITADEL Authorization Bypass: Self-Verification of Email and Phone

Alon Barad
Alon Barad
Software Engineer

Feb 27, 2026·5 min read·52 visits

Executive Summary (TL;DR)

ZITADEL versions prior to 4.11.1 allow users to verify their own email and phone numbers via the `UpdateHumanUser` API without administrative privileges. This bypasses MFA enrollment policies and password reset safeguards.

A high-severity authorization bypass vulnerability in ZITADEL allows authenticated users to self-verify their email addresses and phone numbers via the V2 User API. By manipulating the API request payload, a user can mark their contact information as verified without completing the required challenge-response (OTP or link) process. This flaw circumvents identity assurance mechanisms and can lead to privilege escalation or security policy bypasses dependent on verified contact details.

Vulnerability Overview

ZITADEL is an open-source identity management system that provides self-service capabilities for users to manage their profiles, including email addresses and phone numbers. Ideally, modifying sensitive attributes such as the verification status of contact information requires administrative privileges or a completed verification flow (e.g., clicking a link sent to the email). CVE-2026-27946 represents a failure in the authorization logic governing these updates.

The vulnerability exists specifically within the UpdateHumanUser command in the V2 API. When processing user updates, the system failed to correctly categorize the Verified flag as a protected attribute. Consequently, the authorization check treated a request setting Verified: true as a standard self-service profile update rather than a privileged administrative action. This allows any authenticated user to unilaterally declare their contact methods as verified.

Root Cause Analysis

The root cause of this vulnerability lies in the permission evaluation logic within the ChangeUserHuman command handler, specifically in internal/command/user_v2_human.go. The handler uses a helper function, checkPermissionUpdateUser, to determine if the requesting user has the necessary rights to perform the update. This function accepts a boolean argument—often named allowSelf—which dictates whether the operation can be performed by the user on their own account without the user.write permission.

In the vulnerable implementation, the code calculated allowSelf based primarily on whether metadata was being changed. The logic assumed that if metadataChanged was false, the user was modifying standard profile fields (like name or display name) which are permissible for self-update. However, the logic failed to account for the Email.Verified and Phone.Verified fields. These fields were not flagged as requiring write permission, so the system permitted users to inject Verified: true into the update payload. The backend then persisted this state to the database, effectively bypassing the verification controller entirely.

Code Analysis

The patch introduces a strict check to determine if the update payload attempts to modify the verification status of an email or phone number. If such a modification is detected, the system forces an administrative permission check.

Vulnerable Logic:

// The system checks if metadata is changing. If not, it allows self-update.
// This overlooks the 'Verified' field in the 'human' struct.
if err := c.checkPermissionUpdateUser(ctx, ..., !metadataChanged); err != nil {
    return nil, err
}

Patched Logic (Commit 0261536243):

// The fix explicitly defines conditions that require write (admin) permission.
// This now includes attempting to set the verified flag on email or phone.
requireWritePermission := metadataChanged || 
    (human.Email != nil && human.Email.Verified) || 
    (human.Phone != nil && human.Phone.Verified)
 
// The 'allowSelf' argument is now '!requireWritePermission'.
// If the user tries to verify themselves, requireWritePermission is true,
// causing allowSelf to be false, triggering a permission error for standard users.
if err := c.checkPermissionUpdateUser(ctx, ..., !requireWritePermission); err != nil {
    return nil, err
}

By expanding the definition of requireWritePermission, the developers ensured that the verification status can only be modified by an actor holding the user.write permission or through the dedicated verification flows that bypass this specific handler.

Exploitation Methodology

Exploitation of this vulnerability is trivial for an authenticated attacker and requires no specialized tools beyond a standard HTTP client.

Prerequisites:

  1. A valid user account on a vulnerable ZITADEL instance.
  2. Access to the ZITADEL V2 API endpoints.

Attack Steps:

  1. The attacker authenticates to obtain a session token.
  2. The attacker constructs a JSON payload for the UpdateUser endpoint targeting their own User ID.
  3. The payload includes the human object with an email or phone number and explicitly sets the verification flag.

Sample Payload:

{
  "userId": "<CURRENT_USER_ID>",
  "human": {
    "email": {
      "address": "attacker@malicious.com",
      "isVerified": true
    }
  }
}

Outcome: Upon sending this request, the server returns a 200 OK response. The user profile is immediately updated in the database with email_verified = true. The attacker can now proceed to perform actions that require a verified email, such as resetting passwords without email confirmation (if configured) or enrolling in MFA factors that rely on verified contact channels.

Impact Assessment

The ability to self-verify contact information undermines the trust model of the identity provider. While the CVSS score is High (8.2), the practical impact depends on how the organization relies on the Verified status.

Security Implications:

  • MFA Bypass / Enrollment: Attackers may be able to register new MFA devices or recover accounts using phone numbers they do not actually control, provided they can verify them via this exploit.
  • Trust Integrity: Downstream applications relying on the email_verified claim in OIDC tokens will inherently trust the attacker's unverified email. This is critical for applications that auto-provision accounts based on email domain trust.
  • Notification Spoofing: An attacker could register a victim's email address to their own account and mark it as verified, potentially intercepting sensitive notifications or causing confusion in user directories.

Metric Breakdown (CVSS v4.0):

  • Attack Vector: Network (exploitable remotely).
  • Privileges Required: Low/None (depending on self-registration). Any standard user can exploit this.
  • Integrity Impact: High (Direct modification of trust anchors).

Official Patches

ZITADELZITADEL v4.11.1 Release Notes

Fix Analysis (1)

Technical Appendix

CVSS Score
8.2/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:H/VA:N/SC:N/SI:H/SA:N
EPSS Probability
0.04%
Top 88% most exploited

Affected Systems

ZITADEL Identity Management Platform

Affected Versions Detail

Product
Affected Versions
Fixed Version
ZITADEL
ZITADEL
>= 4.0.0, < 4.11.14.11.1
ZITADEL
ZITADEL
< 3.4.73.4.7
AttributeDetail
CWE IDCWE-862 (Missing Authorization)
CVSS v4.08.2 (High)
Attack VectorNetwork (API)
EPSS Score0.00041 (Low)
ImpactIntegrity Compromise
VendorZITADEL

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
T1078Valid Accounts
Initial Access
CWE-862
Missing Authorization

The software does not perform an authorization check when an actor attempts to access a resource or perform an action.

Vulnerability Timeline

Patch committed
2026-02-25
Vulnerability disclosed and CVE assigned
2026-02-26

References & Sources

  • [1]GHSA-282g-fhmx-xf54: Bypass Email/Phone Verification
  • [2]Fix Commit

More Reports

•about 6 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 7 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 21 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