GitHub Advisoryadvisory · npm
GHSA-hfhx-w8p8-4hc7 Budibase: SSRF via bare fetch() in uploadUrl during AI table generation
MEDIUM
Official page ↗
- Aliases
- CVE-2026-73307
- Ecosystem
- npm
- Packages
- @budibase/server
- Severity
- Moderate
- CVSS vector
- CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N
- Weaknesses
- CWE-918
- Reviewed
- 2026-07-24
Affected packages
• npm @budibase/server: <= 3.38.1 (no fix yet)
Description
Budibase: SSRF via bare fetch() in uploadUrl during AI table generation
Summary
The `uploadUrl()` function in `packages/server/src/utilities/fileUtils.ts` uses a bare `fetch(url)` call without any SSRF protection. This function is invoked when the AI table generation feature processes LLM-generated attachment column values that are strings (URLs).
A builder-level user can craft prompts that cause the LLM to generate internal IP addresses or cloud metadata endpoints as attachment URLs. When `generateRows()` calls `processAttachments()`, these URLs are fetched server-side without blacklist validation, allowing the attacker to reach internal services, cloud metadata APIs (169.254.169.254), or other network-internal resources.
This is a variant of the same class of issue addressed in other Budibase code paths where `fetchWithBlacklist()` is correctly used to prevent SSRF.
Affected Versions
{
try {
const res = await fetch(url) // No blacklist validation
```
This is called from:
```typescript
// packages/server/src/sdk/workspace/ai/helpers/rows.ts:104-114
async function processAttachments(
entry: Record,
attachmentColumns: FieldSchema[]
) {
function processAttachment(value: any) {
if (typeof value === "object") {
return uploadFile(value)
}
return uploadUrl(value) // String values treated as URLs, fetched without protection
}
```
Which is triggered via `generateRows()` at line 34:
```typescript
// packages/server/src/sdk/workspace/ai/helpers/rows.ts:34
await processAttachments(entry, attachmentColumns)
```
Compare with correct sibling: processUrlFile() in extract.ts
```typescript
// packages/server/src/automations/steps/ai/extract.ts:139-144
async function processUrlFile(
fileUrl: string,
fileType: SupportedFileType,
llm: LLMResponse
): Promise {
const response = await fetchWithBlacklist(fileUrl) // Correct: uses blacklist
```
The `fetchWithBlacklist()` function validates each URL (including redirects) against a blacklist of internal/private IP ranges before making the request:
```typescript
// packages/server/src/automations/steps/utils.ts:100-112
export async function fetchWithBlacklist(
url: string,
request: RequestInit = {}
): Promise {
const maxRedirects = 5
let nextUrl = url
// ...
for (let redirects = 0; redirects " \
-H "Cookie: budibase:auth=$TOKEN"
The attachment URL in the response points to the saved metadata content
```
Impact
• Attacker with builder access can read cloud instance metadata (AWS IAM credentials, GCP service account tokens)
• Internal service enumeration and data exfiltration from private network resources
• Port scanning of internal infrastructure via timing/error differences
• Bypass of network segmentation when Budibase is deployed in a DMZ or VPC
Suggested Remediation
Replace the bare `fetch()` in `uploadUrl()` with `fetchWithBlacklist()`:
```typescript
// packages/server/src/utilities/fileUtils.ts
import fs from "fs"
-import fetch from "node-fetch"
import path from "path"
import { pipeline } from "stream"
import { promisify } from "util"
import * as uuid from "uuid"
import { context, objectStore } from "@budibase/backend-core"
import { Upload } from "@budibase/types"
import { ObjectStoreBuckets } from "../constants"
+import { fetchWithBlacklist } from "../automations/steps/utils"
// ...
export async function uploadUrl(url: string): Promise {
try {
• const res = await fetch(url)
+ const res = await fetchWithBlacklist(url)
const extension = [...res.url.split(".")].pop()!.split("?")[0]
```
Related
Alias · CVE (1)
- CVE-2026-73307 Budibase is an open-source low-code platform. vulnerability
Weakness · CWE (1)
- CWE-918 Server-Side Request Forgery weakness
References
- https://github.com/Budibase/budibase/security/advisories/GHSA-hfhx-w8p8-4hc7 web
- https://github.com/Budibase/budibase/pull/18866 web
- https://github.com/Budibase/budibase/commit/72e602d68daeebe3b95b0ed87acd351a38e327d7 web
- https://github.com/Budibase/budibase package
- https://github.com/Budibase/budibase/releases/tag/3.39.4 web