npm · @budibase/server
Budibase: SSRF in Automation Steps - Webhook, Zapier, N8N, Slack, Discord Bypass IP Blacklist
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 BLACKLIST_IPS is not configured.
All automation steps use fetch() directly without any IP validation:
packages/server/src/automations/steps/outgoingWebhook.ts line 69:
const response = await fetch(url, request) // No blacklist check
packages/server/src/automations/steps/zapier.ts line 34:
response = await fetch(url, {method: "post", ...}) // No blacklist check
packages/server/src/automations/steps/n8n.ts line 53:
response = await fetch(url, request) // No blacklist check
packages/server/src/automations/steps/slack.ts line 20:
response = await fetch(url, {method: "post", ...}) // No blacklist check
packages/server/src/automations/steps/discord.ts line 29:
response = await fetch(url, {method: "post", ...}) // No blacklist check
packages/server/src/integrations/rest.ts line 684:
if (await blacklist.isBlacklisted(url)) {
throw new Error("Cannot connect to URL.")
}
But BLACKLIST_IPS env var defaults to undefined, so the blacklist is empty:
packages/backend-core/src/blacklist/blacklist.ts lines 39-45:
if (blackListArray?.length === 0) {
return false // Always passes when no IPs configured
}
http://169.254.169.254/latest/meta-data/ accessible via any automation stepfetch() callsIs your project exposed to this? Stateward checks every dependency on every pull request and flags it only if your code actually reaches it.
Check my repoSources: CISA KEV (public domain), OSV.dev & GitHub Advisory Database (CC-BY-4.0), FIRST EPSS, NVD/CWE (public domain). Served live from the Stateward advisory database.