GHSA-9r75-g2cr-3h76: Predictable Webhook Tokens in Vercel Workflow
Vulnerability ID: GHSA-9R75-G2CR-3H76
CVSS Score: 7.5
Published: 2026-03-06
A high-severity vulnerability exists in the Vercel Workflow DevKit (@workflow/core) affecting the createWebhook() function. The vulnerability allows developers to manually specify predictable tokens for public webhook endpoints, leading to an Insecure Direct Object Reference (IDOR) flaw. Unauthenticated attackers can guess these tokens (e.g., github_webhook:repo_name) and send malicious POST requests to resume paused workflows, inject data, or trigger unauthorized state transitions. The vendor has patched this by removing the ability to specify custom tokens in favor of mandatory cryptographically secure identifiers.
TL;DR
The Vercel Workflow SDK allowed developers to set predictable tokens for public webhooks. Attackers can guess these tokens to manipulate running workflows without authentication. Fixed in version 4.2.0 by enforcing random token generation.
⚠️ Exploit Status: POC
Technical Details
- Attack Vector: Network (Public Internet)
- CVSS: 7.5 (High)
- CWE: CWE-639 (IDOR)
- Impact: Workflow Manipulation / Data Injection
- Affected Component: createWebhook() API
- Remediation: Upgrade to @workflow/core@4.2.0+
Affected Systems
- Vercel Workflow DevKit
- @workflow/core npm package
-
@workflow/core: < 4.2.0-beta.64 (Fixed in:
4.2.0-beta.64)
Code Analysis
Commit: 30e24d4
fix: prevent providing token to createWebhook
diff --git a/packages/core/src/workflow/create-hook.ts b/packages/core/src/workflow/create-hook.ts
index ...
--- a/packages/core/src/workflow/create-hook.ts
+++ b/packages/core/src/workflow/create-hook.ts
@@ -10,0 +11,6 @@
+ if (token !== undefined) {
+ throw new Error(
+ '`createWebhook()` does not accept a `token` option. Webhook tokens are always randomly generated...'
+ );
+ }
Mitigation Strategies
- Enforce cryptographically secure random identifiers for all public webhook endpoints.
- Implement secondary authentication (e.g., HMAC signatures) for webhook payloads.
- Treat all webhook inputs as untrusted and validate schema strictly within the workflow.
Remediation Steps:
- Upgrade
@workflow/coreto version4.2.0-beta.64or later (stable4.2.0). - Search the codebase for calls to
createWebhook({ token: ... }). - Remove the
tokenproperty from these calls. - If deterministic identifiers are required for internal logic, switch to using
createHook()combined withresumeHook()instead of the publiccreateWebhook()API.
References
Read the full report for GHSA-9R75-G2CR-3H76 on our website for more details including interactive diagrams and full exploit analysis.
Top comments (0)