{"description":"Trending threats, MITRE ATT\u0026CK coverage, and detection metadata. Fed continuously.","favicon":"https://feed.craftedsignal.io/favicon-32x32.png","feed_url":"https://feed.craftedsignal.io/products/trigger.dev-3.3.8---4.5.5/feed.json","home_page_url":"https://feed.craftedsignal.io/","icon":"https://feed.craftedsignal.io/apple-touch-icon.png","items":[{"_cs_actors":[],"_cs_cpes":[],"_cs_cves":[{"cvss":8.5,"id":"CVE-2026-73654"}],"_cs_exploited":false,"_cs_has_poc":false,"_cs_poc_references":[],"_cs_products":["trigger.dev (3.3.8 - 4.5.5)"],"_cs_severities":["high"],"_cs_tags":["prototype-pollution","rce","vulnerability","webserver"],"_cs_type":"advisory","_cs_vendors":["Trigger.dev"],"content_html":"\u003cp\u003eTrigger.dev versions 3.3.8 through 4.5.5 are vulnerable to prototype pollution via the \u003ccode\u003ePUT /api/v1/runs/:runId/metadata\u003c/code\u003e endpoint. The vulnerability exists because the application passes attacker-controlled \u003ccode\u003eoperation.key\u003c/code\u003e inputs directly into the \u003ccode\u003eJSONHeroPath.set()\u003c/code\u003e method without sanitization. This allows an attacker possessing a valid environment API key to inject properties into \u003ccode\u003eObject.prototype\u003c/code\u003e, 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.\u003c/p\u003e\n\u003ch2 id=\"attack-chain\"\u003eAttack Chain\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eAttacker authenticates to the Trigger.dev instance using a standard, low-privileged environment API key.\u003c/li\u003e\n\u003cli\u003eAttacker crafts a malicious \u003ccode\u003ePUT\u003c/code\u003e request to the \u003ccode\u003e/api/v1/runs/:runId/metadata\u003c/code\u003e endpoint.\u003c/li\u003e\n\u003cli\u003eThe request body includes an \u003ccode\u003eoperation.key\u003c/code\u003e value set to \u003ccode\u003e$.__proto__.polluted\u003c/code\u003e (or similar prototype path).\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eapplyMetadataOperations()\u003c/code\u003e function in \u003ccode\u003epackages/core/src/v3/runMetadata/operations.ts\u003c/code\u003e receives the untrusted key.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eJSONHeroPath\u003c/code\u003e processes the key and executes \u003ccode\u003e.set()\u003c/code\u003e on the \u003ccode\u003enewMetadata\u003c/code\u003e object, inadvertently writing to \u003ccode\u003eObject.prototype\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eGlobal process state is corrupted; subsequent database queries (e.g., via Prisma) fail because they now inherit unexpected properties.\u003c/li\u003e\n\u003cli\u003eThird-party libraries (e.g., Prometheus \u003ccode\u003eprom-client\u003c/code\u003e) encounter validation errors due to the polluted object structure, causing an \u003ccode\u003euncaughtException\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe webapp process crashes, resulting in service denial for all tenants, repeating upon subsequent requests (crash-loop).\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"impact\"\u003eImpact\u003c/h2\u003e\n\u003cp\u003eThe 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 \u003ccode\u003eObject.prototype\u003c/code\u003e serves as a primitive for further exploitation, such as logic or authentication bypasses, depending on the gadgets present in the runtime environment.\u003c/p\u003e\n\u003ch2 id=\"recommendation\"\u003eRecommendation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade Trigger.dev instances immediately to version 4.5.6 or later to include the prototype pollution guards.\u003c/li\u003e\n\u003cli\u003eAudit existing logs for anomalous \u003ccode\u003ePUT\u003c/code\u003e requests to the metadata API containing suspicious path segments like \u003ccode\u003e__proto__\u003c/code\u003e, \u003ccode\u003econstructor\u003c/code\u003e, or \u003ccode\u003eprototype\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eEnsure that any custom middleware or API extensions for metadata processing use \u003ccode\u003eObject.create(null)\u003c/code\u003e for storage and implement strict allow-listing for JSON path keys.\u003c/li\u003e\n\u003cli\u003eImplement request schema validation to strictly enforce expected character sets and patterns for API metadata keys.\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2026-08-14T02:03:29Z","date_published":"2026-08-14T02:03:29Z","id":"https://feed.craftedsignal.io/briefs/2026-08-trigger-dev-prototype-pollution/","summary":"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.","title":"Prototype Pollution in Trigger.dev Run Metadata API","url":"https://feed.craftedsignal.io/briefs/2026-08-trigger-dev-prototype-pollution/"}],"language":"en","title":"CraftedSignal Threat Feed - Trigger.dev (3.3.8 - 4.5.5)","version":"https://jsonfeed.org/version/1.1"}