Feb 27, 2026·5 min read·78 visits
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.
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.
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.
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 of this vulnerability is trivial for an authenticated attacker and requires no specialized tools beyond a standard HTTP client.
Prerequisites:
Attack Steps:
UpdateUser endpoint targeting their own User ID.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.
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:
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.Metric Breakdown (CVSS v4.0):
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| Product | Affected Versions | Fixed Version |
|---|---|---|
ZITADEL ZITADEL | >= 4.0.0, < 4.11.1 | 4.11.1 |
ZITADEL ZITADEL | < 3.4.7 | 3.4.7 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862 (Missing Authorization) |
| CVSS v4.0 | 8.2 (High) |
| Attack Vector | Network (API) |
| EPSS Score | 0.00041 (Low) |
| Impact | Integrity Compromise |
| Vendor | ZITADEL |
The software does not perform an authorization check when an actor attempts to access a resource or perform an action.
An uncontrolled resource consumption vulnerability exists in the Docling document conversion library. Maliciously structured HTML, JATS, ODS, or BoxNote inputs containing table cells with excessively large 'rowspan' or 'colspan' attribute values trigger algorithmic complexity conditions. This allows unauthenticated remote attackers to initiate resource exhaustion states, crashing or hanging the target document processing pipeline while bypassing configured timeouts.
A Local File Inclusion (LFI) and Arbitrary File Disclosure vulnerability exists in Docling and Docling Slim versions >= 2.16.0 up to 2.131.0. When parsing serialized DoclingDocument structures using the JSON input format, the backend fails to restrict image URI schemes, allowing remote attackers to retrieve local files and verify path existence on the host system during embedded document export.
Docling, a tool for parsing and processing diverse document formats, is vulnerable to arbitrary file read, arbitrary file write, and potential remote code execution (RCE) in versions 2.94.0 through 2.131.0. The vulnerability occurs when applications configure Docling to use the Tectonic engine for rendering TikZ diagrams into images. Because the compilation did not restrict hazardous TeX primitives or sandbox the environment, an attacker can supply crafted documents containing malicious TikZ definitions to access or modify local files and execute arbitrary commands under the privileges of the processing application.
An SSRF guard bypass vulnerability in the Docling document conversion engine allows unauthenticated attackers to bypass internal IP access controls. The vulnerability exists due to a DNS rebinding Time-of-Check Time-of-Use (TOCTOU) condition, URL authority parsing inconsistencies, and unvalidated network requests triggered during headless browser page rendering.
A technical analysis of CVE-2026-105742 (GHSA-p3fw-7699-7926), a sensitive information disclosure vulnerability in the Docling document processing library. Vulnerable versions of Docling indiscriminately forward custom HTTP headers, such as authentication tokens, to arbitrary third-party origins and during cross-origin redirects while fetching remote image assets from untrusted HTML and EPUB documents.
CVE-2026-106121 is a Denial of Service (DoS) vulnerability in the RabbitMQ Java Client library (amqp-client) affecting versions prior to 5.37.0. The vulnerability resides in the legacy, custom JSON-RPC parsing class com.rabbitmq.tools.json.JSONReader. When parsing malformed or truncated payloads ending within a quoted string or single-line comment, the parser's scanner enters an infinite loop. This occurs because the loop lacks an exit condition for the end-of-input sentinel character returned by the iterator, leading to either CPU exhaustion or a JVM crash from an OutOfMemoryError.