Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid ToolJet account (any organization)
-
DeliveryDiscover or enumerate target organization's credential_id
-
ExploitSend POST /api/data-sources/decrypt with target credential_id
-
ExecutionUnguarded endpoint returns plaintext secret
-
ImpactAuthenticate directly to victim's database or API
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Exploitation requires a valid ToolJet authentication token for any account on the affected instance (PR:L per CVSS) - no elevated role or admin access is needed. The attacker must have network access to the ToolJet API; the NVD vector designates AV:A (adjacent network), but internet-exposed ToolJet deployments effectively remove this barrier. A specific credential_id from a target organization must be known or discoverable; the endpoint itself does not provide enumeration, so the attacker must obtain valid IDs through another channel (insider access, sequential ID guessing if IDs are non-random, or a separate information disclosure vulnerability). The cross-tenant confidentiality breach is only realized in multi-tenant ToolJet deployments hosting multiple organizations on the same instance - single-tenant deployments are not exposed to inter-organization credential exfiltration, though the missing guard remains an authorization gap. No non-default configuration is required; the vulnerable endpoint is present in all pre-patch ToolJet installations by default. |
| Impact | The NVD CVSS 6.8 vector (AV:A/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N) reflects the core risk well but the AV:A designation may understate exposure: ToolJet deployments that publish the API over the internet would reduce the adjacency barrier to none. The Scope:Changed metric is correctly applied - a single compromised or malicious account in one tenant can exfiltrate secrets of entirely separate organizations, amplifying blast radius beyond the attacker's own tenant. Attack complexity is genuinely Low: once a valid session and a target credential_id are in hand, exploitation is a single authenticated HTTP POST. EPSS data was not provided in the input and KEV listing is absent, so no probabilistic exploitation estimate or confirmed active exploitation signal is available. The missing KEV entry and absence of public POC suggest targeted rather than opportunistic exploitation so far, but the low technical barrier makes this a real priority for multi-tenant ToolJet operators. Single-tenant self-hosted instances face reduced cross-organization risk but retain the authorization gap. |
| Exploit ScenarioDerived | An attacker with a low-privileged ToolJet account on a shared instance - potentially a free-tier or guest user in their own organization - discovers or is provided a credential_id associated with another tenant's data source (e.g., through insider knowledge, enumeration of sequential IDs, or a separate information disclosure). They issue a single authenticated POST /api/data-sources/decrypt request with that credential_id and receive the full plaintext secret in the response, which they can then use to directly access the victim organization's database or third-party API. No public exploit code has been identified at time of analysis, but the attack requires no special tooling beyond a standard HTTP client. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 25, 2026
Cross-tenant credential decryption in ToolJet prior to 3.20.1780-lts allows any authenticated user to retrieve plaintext data-source secrets belonging to any other organization on the same instance. The POST /api/data-sources/decrypt endpoint omits the ValidateDataSourceGuard present on all neighboring routes and performs no organization-scoped lookup, meaning a valid session from any tenant is sufficient to exfiltrate database passwords, API keys, and other stored secrets across tenant boundaries. No public exploit has been identified at time of analysis, but the attack is mechanically trivial for any user with a valid account and knowledge of a target credential_id.
RemediationAI
Upgrade ToolJet to version 3.20.1780-lts or later, which is the vendor-released patch that adds ValidateDataSourceGuard and correct organization-scoped authorization to the POST /api/data-sources/decrypt endpoint. The authoritative advisory is at https://github.com/ToolJet/ToolJet/security/advisories/GHSA-x7qj-hfg8-p4cw. If immediate patching is not possible, restrict access to the /api/data-sources/decrypt route at the reverse proxy or WAF layer to a known-safe set of internal IPs or block it entirely - note this will break data-source testing and connection-validation features for end users. As a detection measure, audit application logs for POST /api/data-sources/decrypt requests where the credential_id in the body does not belong to the requesting user's organization; anomalous cross-tenant lookups in logs may indicate prior exploitation. There is no known workaround that preserves full functionality without patching.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
ToolJet is a NestJS-based open-source platform for building internal tools and workflows. Its data-source layer stores encrypted credentials via a CredentialsService. The affected handler, POST /api/data-sources/decrypt, calls CredentialsService.getValue() with a caller-supplied credential_id and returns the decrypted plaintext. Unlike adjacent data-source routes that apply the ValidateDataSourceGuard NestJS guard and inject the calling @User() context to enforce organization scoping, this endpoint was left unguarded and context-free. The root cause is CWE-639 (Authorization Bypass Through User-Controlled Key): the caller fully controls the lookup key (credential_id) and the service performs no authorization check to verify the credential belongs to the caller's organization. Affected product is identified by CPE cpe:2.3:a:tooljet:tooljet:*:*:*:*:*:*:*:*, covering all releases before 3.20.1780-lts.
Know when Tooljet gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:A/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
AV:N chosen over AV:A because ToolJet's API is typically internet-exposed; PR:L confirmed by authentication requirement; S:C reflects cross-tenant boundary violation.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
ToolJet is the open-source foundation am AI-native platform for building and deploying internal tools, workflows and AI agents. Prior to 3.20.1780-lts, the authenticated endpoint POST /api/data-sources/decrypt returns the decrypted plaintext for any credential whose credential_id is supplied in the request body. Unlike every neighbouring data-source route, this handler is not protected by ValidateDataSourceGuard, does not receive the calling @User(), and the underlying CredentialsService.getValue() looks the credential up by id only, with no organization scoping. As a result, any authenticated user of any organization can decrypt the data-source secrets of any other organization by supplying that organization's credential_id - a cross-tenant confidentiality breach. This vulnerability is fixed in 3.20.1780-lts.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
The forgot password token basically just makes us capable of taking over the account of whoever comment in an app that w
Improper Access Control in GitHub repository tooljet/tooljet prior to v1.19.0. Rated high severity (CVSS 8.8), this vuln
ToolJet versions v0.5.0 to v1.2.2 are vulnerable to token leakage via Referer header that leads to account takeover . Ra
Excessive Attack Surface in GitHub repository tooljet/tooljet prior to v1.16.0. Rated high severity (CVSS 8.0), this vul
Tooljet v1.6 does not properly handle missing values in the API, allowing attackers to arbitrarily reset passwords via a
Account Takeover :: when see the info i can see the hash pass i can creaked it ............... Rated high severity (CVSS
Unrestricted file size limit can lead to DoS in tooljet/tooljet <1.27 by allowing a logged in attacker to upload profile
A cross-site scripting (XSS) vulnerability in ToolJet v1.6.0 allows attackers to execute arbitrary web scripts or HTML v
Stored code injection in ToolJet self-hosted (prior to 3.20.178-lts) lets any authenticated builder-role user - availabl
ToolJet versions v0.6.0 to v1.10.2 are vulnerable to HTML injection where an attacker can inject malicious code inside t
Just like in the previous report, an attacker could steal the account of different users. Rated medium severity (CVSS 4.
CI/CD pipeline injection in ToolJet's GitHub Actions render-preview deployment workflow (versions prior to 3.20.180) all
EUVD-2026-39470
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB