Jun 23, 2026·7 min read·31 visits
A bypass in the Budibase OAuth2 SDK allows low-privileged users to trigger Server-Side Request Forgery (SSRF) against internal resources, bypassing central IP blacklists.
CVE-2026-48153 is a Server-Side Request Forgery (SSRF) vulnerability in the Budibase OAuth2 SDK prior to version 3.39.0. It allows authenticated low-privileged users to bypass outbound network security blacklists and send arbitrary requests to internal subnets or cloud metadata services.
Budibase is an open-source low-code platform designed to build internal business applications. To facilitate integration with third-party service providers, Budibase implements an OAuth2 software development kit (SDK) within its backend subsystem. This integration pipeline allows administrators and low-privileged application builders to establish data sources that query external APIs on behalf of the platform.
The architecture exposes an attack surface where user-provided target endpoints are processed by server-side code. Server-Side Request Forgery (SSRF) represents a critical risk in such multi-tenant and low-code applications because the server executing these requests typically resides within a sensitive corporate intranet or a private virtual private cloud (VPC) environment. Without strict validation of outbound destinations, attackers can utilize the platform as a proxy to reach isolated resources.
CVE-2026-48153 identifies an implementation flaw where the outbound HTTP validation system is bypassed when retrieving access tokens. The vulnerability lies within the token exchange phase of the OAuth2 SDK, where the application issues a raw HTTP POST request to a user-controlled endpoint. This bypass facilitates arbitrary server-side requests targeting internal hosts, local loops, and cloud infrastructure metadata endpoints.
To protect against Server-Side Request Forgery, Budibase implements a centralized defense mechanism based on the blacklist.isBlacklisted(url) helper function. This routine resolves the target hostname and compares the resulting IP addresses against defined exclusion lists. These exclusion lists contain IPv4 and IPv6 loopback addresses, private IP ranges as defined in RFC 1918, and link-local addresses commonly associated with cloud provider metadata services.
The primary root cause of CVE-2026-48153 is the direct instantiation of the raw node-fetch library inside the OAuth2 SDK's token acquisition routine, bypassing the secure outbound fetch wrapper. The fetchToken function was designed to directly perform the HTTP POST request using unmodified library methods. This design decision completely removed the request execution sequence from the centralized validation pathway, meaning the target URL was never tested against blacklist.isBlacklisted.
Furthermore, the system relies on the Joi schema validation library to assert the structure of user-supplied parameters during data source definition. The validation schema assigned to the OAuth2 Token URL field was configured to check only that the input conformed to a basic URI format. It did not enforce scheme-specific constraints, host-level whitelists, or domain sanitization, allowing an attacker to input arbitrary IP addresses and local loopback strings.
Prior to the patch, the fetchToken function accepted user-defined configurations and executed requests directly. The code structure directly invoked raw node-fetch instead of using the custom client wrapper, as shown in the vulnerable code path:
// Vulnerable Implementation
import fetch from 'node-fetch';
async function fetchToken(config) {
const { tokenUrl, clientId, clientSecret, code } = config;
// Direct call using raw node-fetch bypasses blacklist checks
const response = await fetch(tokenUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
code,
client_id: clientId,
client_secret: clientSecret
})
});
return response.json();
}The remediation introduced in version 3.39.0 forces all OAuth2 outbound requests to leverage the internal, hardened request wrapper. This secure wrapper validates target addresses prior to TCP handshake initiation, as demonstrated in the patched structure:
// Patched Implementation
import { safeFetch } from '../utils/http'; // Standardized wrapper enforcing blacklist
import { blacklist } from '../utils/security';
async function fetchToken(config) {
const { tokenUrl, clientId, clientSecret, code } = config;
// Enforce blacklist validation before execution
if (blacklist.isBlacklisted(tokenUrl)) {
throw new Error('Restricted destination address');
}
// Route request through safeFetch wrapper
const response = await safeFetch(tokenUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
code,
client_id: clientId,
client_secret: clientSecret
})
});
return response.json();
}The logical execution flow before and after the application of this remediation is mapped below:
Exploitation of CVE-2026-48153 requires network access to the Budibase management panel and credentials corresponding to a builder role. This authorization level is typically granted to developers who are tasked with constructing internal application interfaces. An attacker with these privileges can navigate to the data sources configuration panel to establish a mock OAuth2 server connection.
The attacker configures the Token Endpoint parameter to point to a targeted resource in the internal subnet. In a cloud environment, such as Amazon Web Services (AWS), the targeted URL would point to the link-local metadata address http://169.254.169.254/latest/meta-data/iam/security-credentials/. The backend server accepts this configuration without raising schema errors because the input satisfies the loose URI validation rules defined in the Joi schema.
Once the configuration is active, the attacker triggers the token retrieval process by initiating an authentication flow. The Budibase container establishes a TCP connection to the cloud metadata endpoint and sends an HTTP POST request containing URL-encoded client details. Although the request method is POST, many metadata endpoints and internal HTTP services process incoming payloads and return response data to the requesting client.
The backend server receives the HTTP response containing the requested metadata or sensitive credentials. Depending on how the integration handles the response payload, the output may be logged in error blocks, returned directly to the client interface, or reflected within the workspace context. This information leakage allows the attacker to compromise credentials or proceed with internal network reconnaissance.
The ability to force the Budibase backend to communicate with arbitrary internal addresses shifts the security boundary from the application container to the host network. Because the platform is often containerized and deployed within internal virtualization environments, this SSRF provides an avenue for lateral movement. The Common Vulnerability Scoring System (CVSS) scores this issue as 8.5, noting a Scope change (S:C), reflecting this transition.
Attackers can target unauthenticated microservices that are listening on the local loopback interface or within the virtual network. For example, a default Budibase deployment may run a CouchDB instance or a Redis server on localhost. These services are often configured without authentication under the assumption that they are unreachable from the public internet. An attacker can exploit the SSRF to issue administrative commands or retrieve data from these local databases.
If the Budibase container is executed with permissive IAM roles in a public cloud, the exploitation of the Instance Metadata Service can lead to full node compromise. Access to AWS temporary security credentials allows the attacker to impersonate the container host. This credentials theft can lead to unauthorized access to cloud resources, databases, and code repositories, elevating the attack from a local application compromise to a broad infrastructure breach.
The primary remediation path is upgrading the Budibase application to version 3.39.0 or higher. This update replaces the insecure node-fetch integration within the OAuth2 SDK with the native, secured transport client that strictly respects blacklist boundaries. Additionally, the update hardens the underlying Joi schemas used to validate incoming configuration variables.
If upgrading immediately is not technically feasible, administrators should enforce strict egress filtering at the network virtualization layer. Implementing network security groups or iptables rules can prevent the Budibase container from initiating outbound connections to the host's link-local addresses and private IP ranges. The following iptables rule blocks egress traffic to the metadata IP address:
iptables -A OUTPUT -d 169.254.169.254 -j DROPFurthermore, administrative teams must audit current data source definitions for anomalous configuration profiles. Database queries should be executed to identify any OAuth2 configurations referencing IP addresses rather than public domain names. Restricting user provisioning to ensure that only trusted personnel are assigned the builder privilege minimizes the risk of unauthorized configuration manipulation.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
budibase Budibase | < 3.39.0 | 3.39.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-918 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 | 8.5 (HIGH) |
| EPSS Score | 0.00174 |
| EPSS Percentile | 7.04% |
| Exploit Status | poc |
| KEV Status | not listed |
A high-severity access control vulnerability in ToolHive CLI before v0.30.1 and ToolHive Studio before v0.38.0 allows local containerized MCP servers to bypass network isolation. This enables malicious workloads to establish TCP/IP connections to administrative and control plane endpoints exposed on the host loopback interface.
AnyCable is a real-time communication server. Prior to version 1.6.15, its Pusher-compatible REST API suffered from an authentication bypass vulnerability because it failed to verify that the request body matched the signature-validated body_md5 parameter. This allows attackers to perform replay attacks with modified body contents.
A denial-of-service vulnerability exists in AnyIO prior to version 4.14.2. Standard error streams of process-pool workers are connected to an operating system pipe that is never drained by the parent process. This allows a worker to fill the pipe buffer and deadlock indefinitely.
CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.
CVE-2026-63406 is an information disclosure vulnerability in AnyCable-go prior to version 1.6.15. The built-in telemetry client is enabled by default with a hardcoded public authentication token ('secret'). This client digests highly sensitive configuration parameters and command-line arguments, including JWT secrets and RPC secrets, into a stable SHA-256 fingerprint. This fingerprint is sent over public networks, exposing those administrative secrets to offline dictionary and brute-force attacks if intercepted.
CVE-2026-84992 is a Cross-Site Scripting (XSS) vulnerability affecting md-editor-v3 before version 6.5.4. It occurs because the fenced-code block language parser directly interpolates unescaped language metadata into unquoted HTML attributes inside the custom rendering callback. This bypasses the built-in XSSPlugin which runs during the parsing phase, before rendering.