Skip to content
Heist/ feed
HighFix available

Trigger.dev: Run replay injects a task run into an attacker-chosen environment (cross-tenant write)

Type: advisorySource: OSV1 source record

### 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 run correctly (apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts, the findFirst on taskRun filtered by `project.organization.members.some.userId`), but passes the target environment straight from the submitted form, resources.taskruns.$runParam.replay.ts:344-346: ```js const replayRunService = new ReplayTaskRunService(); const newRun = await replayRunService.call(taskRun, { environmentId: submission.value.environment, // attacker-controlled, unvalidated payload: submission.value.payload, ... }); ``` `submission.value.environment` comes from ReplayRunData (apps/webapp/app/v3/replayTask.ts: `environment: z.string().optional()`), so it is fully client-controlled. ReplayTaskRunService resolves it with no ownership check, apps/webapp/app/v3/services/replayTaskRun.server.ts:26-28: ```js const authenticatedEnvironment = await findEnvironmentById( overrideOptions.environmentId ?? exist

Announced Group revision 1
Original source ↗

GHSA-qxpp-qjg8-x4jv

Primary source · Revision 1

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:GHSA-qxpp-qjg8-x4jv

trigger.dev

Source reference: /affected/0/package/name

Affected versions
Not stated in this record
Fixed versions
4.5.2

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "SEMVER",
        "events": [
          {
            "introduced": "0"
          },
          {
            "fixed": "4.5.2"
          }
        ]
      }
    ],
    "package": {
      "name": "trigger.dev",
      "purl": "pkg:npm/trigger.dev",
      "ecosystem": "npm"
    },
    "database_specific": {
      "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-qxpp-qjg8-x4jv/GHSA-qxpp-qjg8-x4jv.json"
    }
  }
]
Related CVEs
CVE-2026-85651

Source reference: /aliases

Publisher severity

high

Source reference: /database_specific/severity

Event
#71347 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement