trigger-dev

Ecosystem: npm

Downloads: 3.97 Mln

Vulnerabilities from the last (months)
  • 1CriticalAffects 1 version
  • 5HighAffects 5 versions
  • 0MediumAffects 0 versions
  • 4ModerateAffects 4 versions
  • 0LowAffects 0 versions
Severity distribution (all time)
10vulnerabilities
  • Critical1 (10.0%)
  • High5 (50.0%)
  • Medium0 (0.0%)
  • Moderate4 (40.0%)
  • Low0 (0.0%)

Monthly breakdown

  • 10 vulnerabilities
    • Critical: 1
    • High: 5
    • Medium: 0
    • Moderate: 4
    • Low: 0

Vulnerabilities (10)

Known vulnerabilities affecting trigger-dev, based on data from OSV.

Vulnerabilities affecting trigger-dev
IDSeveritySummaryAffected versionsPublishedSource
GHSA-4672-hwv6-gq62ModerateTrigger.dev: Cross-environment deployment cancel### Summary Trigger.dev isolates each project into multiple **environments** (`dev`, `staging`, `prod`, and per-PR `preview` branches), each with its **own secret API key** — the environment is a trust boundary (a `dev`/preview/CI key is lower-trust than a `prod` key). Most API routes enforce this by scoping resource lookups to the authenticated key's environment (`where: { friendlyId, runtimeEnvironmentId: auth.environment.id }`). The deployment **cancel** path does not. `DeploymentService.getDeployment()` scopes the lookup by **`projectId` only** — never `environmentId` — so a secret key f
  • < 4.5.6
GitHub (opens in a new tab)
GHSA-59h8-w5q6-mfmpModerateTrigger.dev: Unauthenticated Realtime Stream Data Injection via Run FriendlyId## Summary The POST handler for `/realtime/v1/streams/:runId/:streamId` has no authentication. Any entity that knows or guesses a run friendlyId can inject arbitrary data into its realtime stream. ## Vulnerability Details **File:** `apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts` The `action` handler (line 17) has no auth wrapper. The code comment says: "Plain action for backwards compatibility with older clients that don't send auth headers." The run lookup at line 29 uses `where: { friendlyId: runId }` with NO environment scoping (`runtimeEnvironmentId` is not checked),
  • < 4.5.5
GitHub (opens in a new tab)
GHSA-9q4r-4842-93vwHighTrigger.dev: Cross-tenant SQL injection in the TSQL query compiler (POST /api/v1/query) via unsanitized window-function name### Summary A cross-tenant SQL injection in the TSQL query compiler lets **any authenticated trigger.dev customer read every other tenant's analytics data**. The customer-facing query endpoint `POST /api/v1/query` accepts a TSQL/TRQL query that is compiled to ClickHouse SQL by `internal-packages/tsql`. The compiler parameterizes or escapes all user input and injects a per-tenant `WHERE` guard — **except the window-function name**, which is concatenated into the SQL string with no allowlist and no escaping. By smuggling a backtick-quoted identifier into that position, an attacker injects a raw
  • < 4.5.6
GitHub (opens in a new tab)
GHSA-fj2x-mqqp-3v2wModerateTrigger.dev: Trigger CLI debug deployment logs expose resolved environment secret valuesAffected version: trigger.dev 4.5.3 (4.5.6 was advertised by the CLI but was not tested). A staging dry-run executed with `trigger.dev deploy --env staging --dry-run --log-level debug`. The debug output logged the complete build-worker options object. Its `envVars` property contained unredacted values for every resolved staging variable, including database connection strings and service credentials. The non-debug environment listing correctly hides values, so users can reasonably expect deployment logs not to print secrets. Impact: anyone with access to a developer terminal transcript, CI de
  • < 4.5.9
GitHub (opens in a new tab)
GHSA-gg6r-gp4c-89hpCriticalTrigger.dev: V1 coordinator default-secret unauth Socket.IO## TL;DR The /coordinator Socket.IO namespace mounts on every webapp boot and authenticates with a default secret ("coordinator-secret") baked into source. The override variable isn't documented in the self-host docs, .env.example, or helm values, so any operator who didn't read source ships with the default. Once connected, READY_FOR_EXECUTION returns the run's decrypted env vars. Anyone who can reach a default-config self-hosted webapp can pull production secrets out of any run whose internal id they can find. ## Vulnerabilities This attack is made possible by 3 vulnerabilities in Trigger
  • < 4.5.4
GitHub (opens in a new tab)
GHSA-pp95-gc86-jq6qHighTrigger.dev: Missing Authentication in Run Replay Action Allows Cross-Organization Task Execution (IDOR)### Summary The run replay `action` function at `apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts` has no authentication or authorization check. While the `loader` (GET) in the same file properly calls `requireUser(request)` and scopes queries to the user's organizations, the `action` (POST) at line 166 does neither — allowing any authenticated user to replay task runs from any organization by knowing the run's `friendlyId`. ### Details **Vulnerable file:** `apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts` **The `loader` (line 28-29) — properly authenticated:** `
  • < 4.5.2
GitHub (opens in a new tab)
GHSA-pqxw-g93w-hj9xHighTrigger.dev Self-Hosted Deployment: Default Secrets allow Unauthenticated Infrastructure Compromise## Summary Self-hosted trigger.dev v4 instances deployed using the provided Docker Compose configuration with default secrets from `hosting/docker/.env.example` are vulnerable to a multi-stage unauthenticated attack chain leading to complete infrastructure compromise. ## Vulnerability Details The `hosting/docker/.env.example` file contains hardcoded cryptographic secrets: ``` SESSION_SECRET=2818143646516f6fffd707b36f334bbb MAGIC_LINK_SECRET=44da78b7bbb0dfe709cf38931d25dcdd ENCRYPTION_KEY=f686147ab967943ebbe9ed3b496e465a MANAGED_WORKER_SECRET=447c29678f9eaf289e9c4b70d3dd8a7f ``` The `MAGIC
  • < 4.5.6
GitHub (opens in a new tab)
GHSA-q567-cr4x-96w4ModerateTrigger.dev: Blind SSRF via alert-channel webhook### Summary A WEBHOOK alert channel stores a user-supplied `url`. When an alert fires (deployment/run failure, error groups), the webapp server (`alertsWorker` -> `DeliverAlertService`) POSTs the HMAC-signed alert payload to that URL via `fetch(webhook.url, ...)`. The URL is never validated against a host allowlist or private-IP/metadata blocklist (a repo-wide search for `169.254`, `isPrivate`, `isLoopback`, `net.isIP`, `ssrf` returns ZERO hits), and the API route's URL field is just `z.string().optional()` (no syntax check at all). So an authenticated tenant can point the webhook at internal
  • < 4.5.2
GitHub (opens in a new tab)
GHSA-qxpp-qjg8-x4jvHighTrigger.dev: Run replay injects a task run into an attacker-chosen environment (cross-tenant write)### Summary The dashboard replay action authorizes the source run (it must belong to the caller's org), but the target environment for the replayed run is taken verbatim from the request body and is never checked for org or project membership. The environment lookup used by the replay path filters by id only. As a result, an authenticated user can replay one of their own runs into another organization's or project's environment, creating a task run there that consumes the victim tenant's queue and compute and pollutes their run history. ### Details The replay action member-scopes the source r
  • < 4.5.2
GitHub (opens in a new tab)
GHSA-xxv7-2vv3-h682HighTrigger.dev: Server-side request forgery via unvalidated webhook alert-channel URL### Summary A project member can create a webhook alert channel whose delivery URL points at an internal address, and trigger.dev's control plane will send the alert there with no SSRF protection. The webhook URL is stored as an unvalidated string and is fetched directly from the webapp server, so a low-privilege authenticated user can make the server issue POST requests to internal-only services and cloud metadata endpoints (for example http://169.254.169.254/). No private-IP, scheme, or redirect filtering exists anywhere in the webapp. ### Details The delivery sink performs a raw fetch to t
  • < 4.5.2
GitHub (opens in a new tab)
  • GHSA-4672-hwv6-gq62Moderate
    Trigger.dev: Cross-environment deployment cancel
    • < 4.5.6

    ### Summary Trigger.dev isolates each project into multiple **environments** (`dev`, `staging`, `prod`, and per-PR `preview` branches), each with its **own secret API key** — the environment is a trust boundary (a `dev`/preview/CI key is lower-trust than a `prod` key). Most API routes enforce this by scoping resource lookups to the authenticated key's environment (`where: { friendlyId, runtimeEnvironmentId: auth.environment.id }`). The deployment **cancel** path does not. `DeploymentService.getDeployment()` scopes the lookup by **`projectId` only** — never `environmentId` — so a secret key f

    CVE: CVE-2026-114079

  • GHSA-59h8-w5q6-mfmpModerate
    Trigger.dev: Unauthenticated Realtime Stream Data Injection via Run FriendlyId
    • < 4.5.5

    ## Summary The POST handler for `/realtime/v1/streams/:runId/:streamId` has no authentication. Any entity that knows or guesses a run friendlyId can inject arbitrary data into its realtime stream. ## Vulnerability Details **File:** `apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts` The `action` handler (line 17) has no auth wrapper. The code comment says: "Plain action for backwards compatibility with older clients that don't send auth headers." The run lookup at line 29 uses `where: { friendlyId: runId }` with NO environment scoping (`runtimeEnvironmentId` is not checked),

    CVE: CVE-2026-114086

  • GHSA-9q4r-4842-93vwHigh
    Trigger.dev: Cross-tenant SQL injection in the TSQL query compiler (POST /api/v1/query) via unsanitized window-function name
    • < 4.5.6

    ### Summary A cross-tenant SQL injection in the TSQL query compiler lets **any authenticated trigger.dev customer read every other tenant's analytics data**. The customer-facing query endpoint `POST /api/v1/query` accepts a TSQL/TRQL query that is compiled to ClickHouse SQL by `internal-packages/tsql`. The compiler parameterizes or escapes all user input and injects a per-tenant `WHERE` guard — **except the window-function name**, which is concatenated into the SQL string with no allowlist and no escaping. By smuggling a backtick-quoted identifier into that position, an attacker injects a raw

    CVE: CVE-2026-114081

  • GHSA-fj2x-mqqp-3v2wModerate
    Trigger.dev: Trigger CLI debug deployment logs expose resolved environment secret values
    • < 4.5.9

    Affected version: trigger.dev 4.5.3 (4.5.6 was advertised by the CLI but was not tested). A staging dry-run executed with `trigger.dev deploy --env staging --dry-run --log-level debug`. The debug output logged the complete build-worker options object. Its `envVars` property contained unredacted values for every resolved staging variable, including database connection strings and service credentials. The non-debug environment listing correctly hides values, so users can reasonably expect deployment logs not to print secrets. Impact: anyone with access to a developer terminal transcript, CI de

    CVE: CVE-2026-114073

  • GHSA-gg6r-gp4c-89hpCritical
    Trigger.dev: V1 coordinator default-secret unauth Socket.IO
    • < 4.5.4

    ## TL;DR The /coordinator Socket.IO namespace mounts on every webapp boot and authenticates with a default secret ("coordinator-secret") baked into source. The override variable isn't documented in the self-host docs, .env.example, or helm values, so any operator who didn't read source ships with the default. Once connected, READY_FOR_EXECUTION returns the run's decrypted env vars. Anyone who can reach a default-config self-hosted webapp can pull production secrets out of any run whose internal id they can find. ## Vulnerabilities This attack is made possible by 3 vulnerabilities in Trigger

    CVE: CVE-2026-114088

  • GHSA-pp95-gc86-jq6qHigh
    Trigger.dev: Missing Authentication in Run Replay Action Allows Cross-Organization Task Execution (IDOR)
    • < 4.5.2

    ### Summary The run replay `action` function at `apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts` has no authentication or authorization check. While the `loader` (GET) in the same file properly calls `requireUser(request)` and scopes queries to the user's organizations, the `action` (POST) at line 166 does neither — allowing any authenticated user to replay task runs from any organization by knowing the run's `friendlyId`. ### Details **Vulnerable file:** `apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts` **The `loader` (line 28-29) — properly authenticated:** `

  • GHSA-pqxw-g93w-hj9xHigh
    Trigger.dev Self-Hosted Deployment: Default Secrets allow Unauthenticated Infrastructure Compromise
    • < 4.5.6

    ## Summary Self-hosted trigger.dev v4 instances deployed using the provided Docker Compose configuration with default secrets from `hosting/docker/.env.example` are vulnerable to a multi-stage unauthenticated attack chain leading to complete infrastructure compromise. ## Vulnerability Details The `hosting/docker/.env.example` file contains hardcoded cryptographic secrets: ``` SESSION_SECRET=2818143646516f6fffd707b36f334bbb MAGIC_LINK_SECRET=44da78b7bbb0dfe709cf38931d25dcdd ENCRYPTION_KEY=f686147ab967943ebbe9ed3b496e465a MANAGED_WORKER_SECRET=447c29678f9eaf289e9c4b70d3dd8a7f ``` The `MAGIC

    CVE: CVE-2026-114087

  • GHSA-q567-cr4x-96w4Moderate
    Trigger.dev: Blind SSRF via alert-channel webhook
    • < 4.5.2

    ### Summary A WEBHOOK alert channel stores a user-supplied `url`. When an alert fires (deployment/run failure, error groups), the webapp server (`alertsWorker` -> `DeliverAlertService`) POSTs the HMAC-signed alert payload to that URL via `fetch(webhook.url, ...)`. The URL is never validated against a host allowlist or private-IP/metadata blocklist (a repo-wide search for `169.254`, `isPrivate`, `isLoopback`, `net.isIP`, `ssrf` returns ZERO hits), and the API route's URL field is just `z.string().optional()` (no syntax check at all). So an authenticated tenant can point the webhook at internal

    CVE: CVE-2026-114076

  • GHSA-qxpp-qjg8-x4jvHigh
    Trigger.dev: Run replay injects a task run into an attacker-chosen environment (cross-tenant write)
    • < 4.5.2

    ### Summary The dashboard replay action authorizes the source run (it must belong to the caller's org), but the target environment for the replayed run is taken verbatim from the request body and is never checked for org or project membership. The environment lookup used by the replay path filters by id only. As a result, an authenticated user can replay one of their own runs into another organization's or project's environment, creating a task run there that consumes the victim tenant's queue and compute and pollutes their run history. ### Details The replay action member-scopes the source r

    CVE: CVE-2026-85651

  • GHSA-xxv7-2vv3-h682High
    Trigger.dev: Server-side request forgery via unvalidated webhook alert-channel URL
    • < 4.5.2

    ### Summary A project member can create a webhook alert channel whose delivery URL points at an internal address, and trigger.dev's control plane will send the alert there with no SSRF protection. The webhook URL is stored as an unvalidated string and is fetched directly from the webapp server, so a low-privilege authenticated user can make the server issue POST requests to internal-only services and cloud metadata endpoints (for example http://169.254.169.254/). No private-IP, scheme, or redirect filtering exists anywhere in the webapp. ### Details The delivery sink performs a raw fetch to t

    CVE: CVE-2026-85650

Showing 1-10 of 10 vulnerabilities