{"id":"GHSA-9r75-g2cr-3h76","aliases":[],"status":"published","title":"Vercel Workflow Allows Webhook Creation with Predictable User-Specified Tokens","description":"`createWebhook()` in Vercel Workflow DevKit accepts a user-specified `token` parameter that serves as the credential for the public webhook endpoint `/.well-known/workflow/v1/webhook/{token}`. Official documentation recommended predictable token patterns, making it possible for an unauthenticated remote attacker to guess the token and inject arbitrary payloads into the workflow execution context.\n\n#### Impact\n\nAn attacker who guesses a webhook token can resume the associated workflow with an attacker-controlled HTTP request body, potentially triggering downstream side effects such as API calls, database writes, or deployments.\n\n#### Fix\n\n* Upgrade to version 4.2.0-beta.64. The fix removes the `token` option from `createWebhook()` so that webhook tokens are always randomly generated by the SDK.\n* Runs created with versions prior to 4.2.0-beta.64, that are 1) still active (i.e. running), and 2) have open hooks, are still susceptible to this vulnerability. If users suspect the hook tokens are predictable or leaked - consider cancelling those runs and restarting them on the latest patch.\n\n#### Workarounds\n\nIn case a version upgrade is not possible, avoid passing predictable or guessable values to the `token` parameter of `createWebhook()`. Instead, users can either\n\n* switch from `createWebhook()` to `createHook()` instead and programmatically resume hooks using `resumeHook()` instead of the public webhook endpoint, or\n* use `createWebhook()` without passing a user-provided `token`, which uses a non-guessable random `nanoid` by default.","severity":{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N","level":"medium","from":"ghsa"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-287"],"published":"2026-03-06T18:45:02Z","modified":"2026-03-06T19:02:20Z","fixes":[{"ecosystem":"npm","package":"workflow","fixed_in":["4.2.0-beta.64"],"sources":["ghsa","osv"]},{"ecosystem":"npm","package":"@workflow/core","fixed_in":["4.2.0-beta.64"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"workflow","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"4.1.0-beta.63"},{"fixed":"4.2.0-beta.64"}]}]},{"source":"ghsa","ecosystem":"npm","package":"@workflow/core","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"4.1.0-beta.63"},{"fixed":"4.2.0-beta.64"}]}]},{"source":"osv","ecosystem":"npm","package":"workflow","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"4.2.0-beta.64"}]}]},{"source":"osv","ecosystem":"npm","package":"@workflow/core","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"4.2.0-beta.64"}]}]}],"references":[{"url":"https://github.com/vercel/workflow/security/advisories/GHSA-9r75-g2cr-3h76","tags":["web"]},{"url":"https://github.com/vercel/workflow/commit/30e24d441e735635ffa4522198e6905d0e51e175","tags":["web"]},{"url":"https://github.com/vercel/workflow/releases/tag/workflow%404.2.0-beta.64","tags":["web"]},{"url":"https://github.com/advisories/GHSA-9r75-g2cr-3h76"},{"url":"https://github.com/vercel/workflow","tags":["package"]}],"sources":{"ghsa":[{"id":"GHSA-9r75-g2cr-3h76","title":"Vercel Workflow Allows Webhook Creation with Predictable User-Specified Tokens","description":"`createWebhook()` in Vercel Workflow DevKit accepts a user-specified `token` parameter that serves as the credential for the public webhook endpoint `/.well-known/workflow/v1/webhook/{token}`. Official documentation recommended predictable token patterns, making it possible for an unauthenticated remote attacker to guess the token and inject arbitrary payloads into the workflow execution context.\n\n#### Impact\n\nAn attacker who guesses a webhook token can resume the associated workflow with an attacker-controlled HTTP request body, potentially triggering downstream side effects such as API calls, database writes, or deployments.\n\n#### Fix\n\n* Upgrade to version 4.2.0-beta.64. The fix removes the `token` option from `createWebhook()` so that webhook tokens are always randomly generated by the SDK.\n* Runs created with versions prior to 4.2.0-beta.64, that are 1) still active (i.e. running), and 2) have open hooks, are still susceptible to this vulnerability. If users suspect the hook tokens are predictable or leaked - consider cancelling those runs and restarting them on the latest patch.\n\n#### Workarounds\n\nIn case a version upgrade is not possible, avoid passing predictable or guessable values to the `token` parameter of `createWebhook()`. Instead, users can either\n\n* switch from `createWebhook()` to `createHook()` instead and programmatically resume hooks using `resumeHook()` instead of the public webhook endpoint, or\n* use `createWebhook()` without passing a user-provided `token`, which uses a non-guessable random `nanoid` by default.","status":"published","published":"2026-03-06T18:45:02Z","modified":"2026-03-06T18:45:02Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N","level":"medium"}],"cwes":["CWE-287"],"updated_at":"2026-11-02T14:39:32.329372Z"}],"osv":[{"id":"GHSA-9r75-g2cr-3h76","title":"Vercel Workflow Allows Webhook Creation with Predictable User-Specified Tokens","description":"`createWebhook()` in Vercel Workflow DevKit accepts a user-specified `token` parameter that serves as the credential for the public webhook endpoint `/.well-known/workflow/v1/webhook/{token}`. Official documentation recommended predictable token patterns, making it possible for an unauthenticated remote attacker to guess the token and inject arbitrary payloads into the workflow execution context.\n\n#### Impact\n\nAn attacker who guesses a webhook token can resume the associated workflow with an attacker-controlled HTTP request body, potentially triggering downstream side effects such as API calls, database writes, or deployments.\n\n#### Fix\n\n* Upgrade to version 4.2.0-beta.64. The fix removes the `token` option from `createWebhook()` so that webhook tokens are always randomly generated by the SDK.\n* Runs created with versions prior to 4.2.0-beta.64, that are 1) still active (i.e. running), and 2) have open hooks, are still susceptible to this vulnerability. If users suspect the hook tokens are predictable or leaked - consider cancelling those runs and restarting them on the latest patch.\n\n#### Workarounds\n\nIn case a version upgrade is not possible, avoid passing predictable or guessable values to the `token` parameter of `createWebhook()`. Instead, users can either\n\n* switch from `createWebhook()` to `createHook()` instead and programmatically resume hooks using `resumeHook()` instead of the public webhook endpoint, or\n* use `createWebhook()` without passing a user-provided `token`, which uses a non-guessable random `nanoid` by default.","status":"published","published":"2026-03-06T18:45:02Z","modified":"2026-03-06T19:02:20.2194Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N","level":"medium"}],"cwes":["CWE-287"],"updated_at":"2026-11-02T15:46:44.225359Z"}]}}
