---
title: "GHSA-gg6r-gp4c-89hp: Trigger.dev: V1 coordinator default-secret unauth Socket.IO"
url: https://erroneo.us/security/ghsa/GHSA-gg6r-gp4c-89hp/
description: "GHSA-gg6r-gp4c-89hp (critical, npm): Trigger.dev: V1 coordinator default-secret unauth Socket.IO. TL;DR The /coordinator Socket.IO namespace mounts on every…"
type: advisory
section: "Security Digest"
date_published: 2026-10-02
date_modified: 2026-10-02
publisher: erroneo.us
author: erroneo.us Security Desk
ghsa: "GHSA-gg6r-gp4c-89hp"
license: All rights reserved. Quote with attribution and a link.
---

# GHSA-gg6r-gp4c-89hp: Trigger.dev: V1 coordinator default-secret unauth Socket.IO

## Affected packages

- npm `trigger.dev` < 4.5.4 → fixed: 4.5.4

## Details

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, READYFOREXECUTION 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) PROVIDERSECRET and COORDINATORSECRET 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) READYFOREXECUTION 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) TASKRUNCOMPLETED,…

## Sources

- [GitHub Advisory GHSA-gg6r-gp4c-89hp](https://github.com/advisories/GHSA-gg6r-gp4c-89hp)
- [github.com](https://github.com/triggerdotdev/trigger.dev/security/advisories/GHSA-gg6r-gp4c-89hp)
- [github.com](https://github.com/triggerdotdev/trigger.dev/pull/4236)
- [github.com](https://github.com/triggerdotdev/trigger.dev/commit/5ba8557a51533be05f04245b03e1ca975cd57eff)
- [github.com](https://github.com/triggerdotdev/trigger.dev/releases/tag/v4.5.4)

---
Source page: https://erroneo.us/security/ghsa/GHSA-gg6r-gp4c-89hp/ · Security Digest: https://erroneo.us/security/ · More: https://erroneo.us/llms.txt
