Executive brief
ZITADEL is an identity and access management system that runs custom JavaScript workflows ("Actions") during authentication and login flows. A tenant organization administrator can exploit a missing sandbox restriction to read sensitive files from the host filesystem using the JavaScript require() function, potentially stealing instance-wide credentials and escalating to full control of the entire ZITADEL deployment.
Technical details
The vulnerability stems from ZITADEL Actions V1 enabling goja's Node-compatible require() registry without restricting the source loader, allowing action scripts to load arbitrary host files readable by the ZITADEL process. An attacker with ORG_OWNER role (which grants org.action.write and org.flow.write permissions) can read process-accessible files including .js, .json, and other formats via error channels. On deployments following ZITADEL's documented bootstrap paths, this enables recovery of instance-wide credentials such as IAM_LOGIN_CLIENT PAT or IAM_OWNER service account keys. The attack breaks multi-tenant isolation, as tenant administrators should not access host filesystem secrets or instance credentials. The vulnerability affects Actions V1 across versions 3.0.0–3.4.12 and 4.0.0–4.16.0; patches disable filesystem-backed module loading in 3.4.13+ and 4.16.1+.
Affected products
- ZITADEL ZITADEL 3.0.0 through 3.4.12, 4.0.0 through 4.16.0
Timeline
- 2026-09-24: disclosed: Public advisory published
- 2026: patched: Patches available in ZITADEL 3.4.13+ and 4.16.1+