Prototype Pollution in Trigger.dev Run Metadata API
An unauthenticated-accessible prototype pollution vulnerability in the Trigger.dev metadata API allows low-privileged attackers to corrupt the global object, leading to cross-tenant denial of service and process crashes via CVE-2026-73654.
CVE search metadata
CVE search record: CVE-2026-73654. Severity: high. CVSS: 8.5. KEV: no. Product: trigger.dev (3.3.8 - 4.5.5). Brief: Prototype Pollution in Trigger.dev Run Metadata API. Brief link: https://feed.craftedsignal.io/briefs/2026-08-trigger-dev-prototype-pollution/
Trigger.dev versions 3.3.8 through 4.5.5 are vulnerable to prototype pollution via the PUT /api/v1/runs/:runId/metadata endpoint. The vulnerability exists because the application passes attacker-controlled operation.key inputs directly into the JSONHeroPath.set() method without sanitization. This allows an attacker possessing a valid environment API key to inject properties into Object.prototype, which is inherited by all objects in the webapp process. Because Trigger.dev operates as a multi-tenant web application, this pollution corrupts internal state across tenants, including Prisma query objects and Prometheus metrics. The contamination results in authentication failures for other tenants and triggers uncaught exceptions that cause the entire webapp process to crash, enabling a persistent denial-of-service attack.
Attack Chain
- Attacker authenticates to the Trigger.dev instance using a standard, low-privileged environment API key.
- Attacker crafts a malicious
PUTrequest to the/api/v1/runs/:runId/metadataendpoint. - The request body includes an
operation.keyvalue set to$.__proto__.polluted(or similar prototype path). - The
applyMetadataOperations()function inpackages/core/src/v3/runMetadata/operations.tsreceives the untrusted key. JSONHeroPathprocesses the key and executes.set()on thenewMetadataobject, inadvertently writing toObject.prototype.- Global process state is corrupted; subsequent database queries (e.g., via Prisma) fail because they now inherit unexpected properties.
- Third-party libraries (e.g., Prometheus
prom-client) encounter validation errors due to the polluted object structure, causing anuncaughtException. - The webapp process crashes, resulting in service denial for all tenants, repeating upon subsequent requests (crash-loop).
Impact
The vulnerability enables a complete cross-tenant denial of service. A single authenticated request can crash the entire webapp process. Beyond availability, the ability to pollute Object.prototype serves as a primitive for further exploitation, such as logic or authentication bypasses, depending on the gadgets present in the runtime environment.
Recommendation
- Upgrade Trigger.dev instances immediately to version 4.5.6 or later to include the prototype pollution guards.
- Audit existing logs for anomalous
PUTrequests to the metadata API containing suspicious path segments like__proto__,constructor, orprototype. - Ensure that any custom middleware or API extensions for metadata processing use
Object.create(null)for storage and implement strict allow-listing for JSON path keys. - Implement request schema validation to strictly enforce expected character sets and patterns for API metadata keys.
Immediate actions
Upgrade Trigger.dev instances to 4.5.6 or higher
Threat Hunt
Search logs for PUT requests to /api/v1/runs/*/metadata containing __proto__, constructor, or prototype
Data: Webserver access logs
Detection coverage 1
Detect CVE-2026-73654 Exploitation Attempt
highDetects PUT requests to the run metadata endpoint containing potential prototype pollution payloads in the operation key.
Detection queries are available on the platform. Get full rules →