Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privilege customer
-
ExploitCraft TSQL with backtick-quoted window-function name
-
ExecutionInject raw subquery past tenant WHERE guard
-
ImpactExfiltrate other organizations' analytics data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Parameterized queries, prepared statements
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Persistence The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated Trigger.dev customer account with a valid API key (PR:L) and the ability to submit a TSQL/TRQL query to the customer-facing endpoint POST /api/v1/query - a standard product feature, so no non-default configuration is needed. The specific technical prerequisite is placing a backtick-quoted identifier in the window-function name position, which the lexer accepts and visitIdentifier unescapes, bypassing the TSQL_CLICKHOUSE_FUNCTIONS/TSQL_AGGREGATIONS allowlist that gates the normal visitCall path. Limiting factors: exploitation is impossible without valid authentication, and the highest real-world impact occurs only in multi-tenant deployments where distinct untrusted organizations share the same ClickHouse backend; single-tenant/self-hosted-for-one-org installs have little cross-tenant data to steal. Affected: Trigger.dev <= 4.5.5; fixed in 4.5.6. |
| Impact | This is a credible, high-priority issue for organizations running Trigger.dev, though not a mass-exploitation emergency. The vendor-supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/SC:H, score 8.3) indicates a network-reachable, low-complexity attack requiring only low privileges - i.e., any valid authenticated customer account. The PR:L requirement is the single most important mitigating factor: this is not anonymous internet-wide exploitation but an authenticated cross-tenant data-theft primitive, most relevant to multi-tenant/SaaS deployments where untrusted customers share a ClickHouse backend. Impact is confidentiality-only (VC:H, VI:N/VA:N) with a scope/subsequent-system change (SC:H) reflecting that one tenant reads another tenant's data. No EPSS score, no CISA KEV listing, and no published exploit code were provided, so there is no public evidence of active exploitation; however, the GHSA/VulnCheck advisory documents the exact vulnerable sink and states the attack was verified end-to-end against the real compiler and a live ClickHouse, meaning a working technique is effectively public even if packaged exploit code is not. Net: treat as a genuine priority for self-hosted multi-tenant operators (patch to 4.5.6), but EPSS/KEV absence suggests opportunistic mass scanning is not yet a demonstrated threat. |
| Exploit ScenarioDerived | An attacker signs up for (or already holds) a legitimate low-privilege Trigger.dev customer account and sends a crafted TSQL query to POST /api/v1/query containing a backtick-quoted window-function name. Because the window-function name is concatenated into the generated ClickHouse SQL without allowlisting or escaping, the attacker smuggles a raw subquery that executes outside the per-tenant WHERE guard, returning another organization's analytics rows (e.g., task_runs data). No separate public exploit tool is required; the reporter (VulnCheck) verified the technique end-to-end against the live compiler. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 21, 2026
Cross-tenant SQL injection in Trigger.dev's TSQL/TRQL query compiler (versions up to and including 4.5.5) allows any authenticated customer holding a valid API key to read other organizations' analytics data from the shared ClickHouse backend through the customer-facing POST /api/v1/query endpoint. The compiler applies its allowlists, identifier escaping, and per-tenant WHERE guard everywhere except the window-function name, which is concatenated raw into the generated SQL, so a backtick-quoted identifier can smuggle a raw subquery that sits outside the tenant guard. Exploitation requires authentication (PR:L) and a multi-tenant deployment for maximum impact; no public exploit code identified at time of analysis, and the issue is fixed in 4.5.6.
RemediationAI
Upgrade Trigger.dev to 4.5.6 or later, which is the vendor-released patch; the fix is available through PR https://github.com/triggerdotdev/trigger.dev/pull/4316 and commit https://github.com/triggerdotdev/trigger.dev/commit/6997aeb05e27d2db47f9eda01fdc8a17c81a1ae0, and details are in advisory GHSA-9q4r-4842-93vw. If immediate upgrade is not possible, reduce exposure by restricting access to POST /api/v1/query to trusted internal callers or network ranges, at the cost of limiting the product feature for legitimate users; audit and rotate customer API keys, though rotation alone does not close the injection and only complicates existing sessions; and, where feasible, segregate ClickHouse backends per tenant or per trust boundary, which lowers cross-tenant blast radius but increases operational complexity. Because exploitation requires a valid authenticated account (PR:L per CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N), tightening account provisioning and monitoring query payloads for backtick-quoted tokens in window-function positions can serve as detective compensating controls with the trade-off of false positives on legitimate advanced queries.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Trigger.dev compiles customer TSQL/TRQL queries into ClickHouse SQL inside internal-packages/tsql. CWE-89 applies here because the sink, ClickHousePrinter.visitWindowFunction (printer.ts:3073-3075), interpolates node.name directly into a template string with no allowlist check and no identifier escaping. Elsewhere in the compiler, the normal function-call path visitCall (printer.ts:2951) rejects names outside the hardcoded TSQL_CLICKHOUSE_FUNCTIONS and TSQL_AGGREGATIONS allowlists, string constants are bound as ClickHouse query_params, and other identifiers pass through escapeClickHouseIdentifier - but none of these gates apply to the window-function name path. The lexer accepts a backtick-quoted identifier and visitIdentifier strips the backticks and unescapes the inner text, so spaces, parentheses, commas, quotes, and full subqueries become part of node.name and are printed verbatim. Tenant isolation is enforced only by enforcedWhereClause, which is attached to the outer table's WHERE using organization_id/project_id/environment_id from the caller's API key; an injected subquery has no such guard and therefore reads across all organizations. The practical exposure is highest where distinct untrusted organizations share one ClickHouse backend, while single-tenant or self-hosted-for-one-org installs have little cross-tenant data to reach.
Know when Trigger Dev 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N
Network endpoint reachable by any authenticated customer (AV:N/AC:L/PR:L/UI:N); reading across tenant boundaries is a scope change (S:C) with confidentiality-only impact (C:H, I:N/A:N).
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
Trigger.dev before 4.5.6 contains an SQL injection vulnerability in the TSQL query compiler, which concatenates window-function names into generated ClickHouse SQL without allowlisting or escaping. Authenticated customers can submit a backtick-quoted identifier to POST /api/v1/query that injects a raw subquery outside the per-tenant WHERE guard, exfiltrating other organizations' analytics data.
Technical POC Analysis
CWE-89 SQL injection (the advisory also tags CWE-639 cross-tenant authorization bypass).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Trigger.dev deployments at versions up to and including 4.5.5 carry a cross-tenant data access flaw that allows any authenticated customer with a valid API key to read other organizations' analytics data from the shared ClickHouse backend. This undermines tenant isolation for multi-tenant customers and should concern leadership because it can expose customer data across organizational boundaries. No public exploit identified at time of analysis.
Apply vendor patch.
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
SQL injection exploits the way applications construct database queries by mixing user input directly into SQL statements.
Related Vulnerabilities in Trigger.dev Authorization and Injection Flaws
View all 29More in Trigger Dev
View allPrototype pollution in Trigger.dev's run metadata API (versions 3.3.8 through 4.5.5) lets any authenticated tenant corru
Cross-tenant authorization bypass in Trigger.dev before 4.5.6 lets a caller holding a valid API key for one project act
Missing authorization on the run replay API endpoint in Trigger.dev before 4.5.2 allows authenticated attackers to injec
Cross-tenant path traversal in Trigger.dev versions 4.4.2 through pre-4.5.0-rc.5 allows any authenticated tenant holding
EUVD-2026-106884
GHSA-vmhj-4cqp-m5cj
NVD
CVE.org
EPSS
Exploit-DB