GHSA-5fpj-28rv-84r7: SSRF
Summary
Budibase automation steps (outgoing webhook, Zapier, n8n, Slack, Discord, Make.com) make server-side HTTP requests to user-provided URLs using node-fetch directly, completely bypassing the IP blacklist protection that exists in the REST API integration. Additionally, the REST API blacklist itself defaults to empty when BLACKLISTIPS is not configured.
Vulnerable Code
Automation Steps (No Blacklist)
All automation steps use fetch() directly without any IP validation:
packages/server/src/automations/steps/outgoingWebhook.ts line 69: typescript const response = await fetch(url, request) // No blacklist check
packages/server/src/automations/steps/zapier.ts line 34: typescript response = await fetch(url, {method: "post", ...}) // No blacklist check
packages/server/src/automations/steps/n8n.ts line 53: typescript response = await fetch(url, request) // No blacklist check
packages/server/src/automations/steps/slack.ts line 20: typescript response = await fetch(url, {method: "post", ...}) // No blacklist check
packages/server/src/automations/steps/discord.ts line 29: typescript response = await fetch(url, {method: "post", ...}) // No blacklist check
REST API Integration (Empty Default Blacklist)
packages/server/src/integrations/rest.ts line 684: typescript if (await blacklist.isBlacklisted(url)) { throw new Error("Cannot connect to URL.") }
But BLACKLISTIPS env var defaults to undefined, so the blacklist is empty:
packages/backend-core/src/blacklist/blacklist.ts lines 39-45: typescript if (blackListArray?.length === 0) { return false // Always passes when no IPs configured }
Impact
- Automation steps: ANY user can create automations with webhook/Zapier/n8n/Slack/Discord steps pointing to internal IPs. These completely bypass the blacklist module - REST API: Even when BLACKLISTIPS is configured, it only blocks listed IPs. Default deployments have no protection. - Cloud metadata: http://169.254.169.254/latest/meta-data/ accessible via any automation step - Internal services: Access databases, admin panels, Kubernetes API on private IPs
Remediation
1. Apply blacklist checks to ALL outbound HTTP requests, including automation steps 2. Add hardcoded default private IP ranges (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16) 3. Use a centralized HTTP client wrapper instead of direct fetch() calls 4. SSRF protection should be on by default, not opt-in via environment variable
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/@budibase/serverto a version that resolves this vulnerability.Fixed in 3.41.3 - Configuration
Set BLACKLIST_IPS to a default non-empty value when the environment variable is not configured, so the REST API IP blacklist is not empty by default.
Budibase REST API / blacklist (BLACKLIST_IPS) BLACKLIST_IPS default = non-empty (enable SSRF protection by default) - Configuration
Add hardcoded default private IP ranges (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16) to the blacklist so automation steps cannot reach private/internal targets.
Budibase SSRF blacklist Default private IP ranges = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 - Configuration
Apply blacklist checks to ALL outbound HTTP requests by replacing direct fetch()/node-fetch calls in automation steps (outgoingWebhook, Zapier, n8n, Slack, Discord, Make.com) with a centralized HTTP client wrapper that enforces blacklist validation.
Budibase automation outbound HTTP requests (outgoingWebhook/Zapier/n8n/Slack/Discord/Make.com) HTTP client usage = use centralized blacklist-aware HTTP client wrapper for ALL outbound requests - Compensating control
Block/deny outbound server network access from the Budibase instance to internal/private IP ranges and cloud metadata address (169.254.0.0/16 and 169.254.169.254) at the network layer (firewall/egress rules), so SSRF attempts via automation steps cannot reach internal services even if application-level checks fail.
Event History
Frequently Asked Questions
What is the severity of GHSA-5fpj-28rv-84r7?
The severity of GHSA-5fpj-28rv-84r7 is rated at 78, indicating a high risk vulnerability.
How do I fix GHSA-5fpj-28rv-84r7?
To fix GHSA-5fpj-28rv-84r7, update to Budibase version 3.41.3 or later where this issue has been addressed.
What type of vulnerability is GHSA-5fpj-28rv-84r7?
GHSA-5fpj-28rv-84r7 is classified as a Server-Side Request Forgery (SSRF) vulnerability.
What impact does GHSA-5fpj-28rv-84r7 have on Budibase?
GHSA-5fpj-28rv-84r7 allows automation steps to make server-side HTTP requests to user-provided URLs, bypassing IP blacklist protections.
Who is affected by GHSA-5fpj-28rv-84r7?
All users of Budibase who utilize the automation steps that involve outgoing webhooks may be affected by GHSA-5fpj-28rv-84r7.