Zitadel's OAuth2 / OIDC CodeExchange and RefreshToken implementations omit a critical validation step to ensure that the requesting client matches the client that originally initiated the authorization flow. This violates RFC 6749 Section 4.1.3, which mandates that the authorization server must ensure the authorization code was issued to the authenticated confidential client.
This flaw creates potential vulnerabilities in two main authentication phases, provided specific external preconditions are met:
ClientB) registered on the same Zitadel instance. Zitadel will authenticate ClientB and issue tokens for the victim user without verifying the client binding.Scope and Mitigation Factors:
code_verifier. However, PKCE does not protect against refresh token cross-use.Systems running one of the following versions are affected:
4.0.0 through 4.15.1 (including RC versions)3.0.0 through 3.4.11 (including RC versions)The vulnerability has been addressed in the latest releases by re-introducing strict client identity validation on the CodeExchange and RefreshToken grants.
Please upgrade to one of the following secure versions:
The recommended solution is to upgrade to a patched version.
To reduce exposure in the interim, ensure absolute adherence to application security best practices to prevent credential/token theft, enforce the use of PKCE for all clients to mitigate the Authorization Code Injection risk, and minimize refresh token lifespans.
If you have any questions or comments about this advisory, please email us at security@zitadel.com
Thanks to kodareef5, Shubham Raj / Causal Security, and Gaurav Popalghat for identifying and responsibly reporting this or a part of this vulnerability.
{
"nvd_published_at": null,
"severity": "HIGH",
"github_reviewed": true,
"cwe_ids": [
"CWE-287",
"CWE-863"
],
"github_reviewed_at": "2026-06-18T13:52:18Z"
}