Feb 15, 2026·5 min read·35 visits
Backstage checked your ID at the door but didn't watch where you went inside. By exploiting the default redirect behavior of the `fetch` API, attackers could trick the backend into accessing restricted internal resources if they could chain a request through an allowed host with an open redirect.
A logic flaw in the Backstage `FetchUrlReader` component allowed Server-Side Request Forgery (SSRF) bypass via HTTP redirects. While the initial URL was validated against a security allowlist, the fetch implementation automatically followed redirects to unvalidated destinations, potentially exposing internal services or cloud metadata.
Backstage has become the darling of platform engineering—a unified portal where developers can find everything from API docs to service catalogs. To make this magic happen, Backstage needs to be a bit of a librarian. It reaches out to GitHub, GitLab, S3 buckets, and generic URLs to fetch catalog-info.yaml files and documentation. This heavy lifting is handled by a component in @backstage/backend-defaults called the FetchUrlReader.
Here’s the catch: when you give a server the power to fetch arbitrary URLs, you are handing it a loaded gun pointed at your internal network. To prevent developers from accidentally (or maliciously) fetching http://169.254.169.254/latest/meta-data/iam/security-credentials/ and stealing your AWS keys, Backstage implements a config called backend.reading.allow. It's essentially a bouncer list. You tell it: "Only talk to github.com and internal-docs.com."
But in CVE-2026-24048, we found out that the bouncer was only checking IDs at the front door. Once the request was inside, it could sneak out the back window to anywhere it pleased.
The vulnerability stems from a classic developer oversight: trusting the default behavior of high-level APIs. The FetchUrlReader utilized a standard fetch implementation (specifically node-fetch or similar polyfills in the Node environment). By default, when fetch receives a 3xx HTTP redirect status code (like 301 Moved Permanently or 302 Found), it automatically follows the Location header to the new URL.
In the vulnerable versions of Backstage, the code looked something like this:
user_provided_url in the allow list? Yes? Proceed.fetch(user_provided_url).user_provided_url says "Go to evil_internal_url".fetch client says "Okay!" and requests evil_internal_url.The security check happened only at step 1. The automatic redirect at step 4 completely bypassed the allowlist validation. It's a classic Time-of-Check to Time-of-Use (TOCTOU) logic failure, applied to network hops.
Let's look at the smoking gun. The fix involved ripping out the automatic redirect handling and replacing it with a manual loop that treats every hop as a potential threat.
The Vulnerable Logic (Conceptual):
// Blindly trusts the fetch client to handle redirects
const response = await fetch(url, {
// defaults follow redirects
});The Fix (Commit 27f9061d...):
In the patched version, the developers explicitly disabled automatic redirects and wrote a loop to validate the Location header of every 3xx response.
// The new, paranoid approach
const response = await fetch(url, {
redirect: 'manual', // STOP! Don't move.
});
if (response.status === 301 || response.status === 302) {
const location = response.headers.get('location');
const newUrl = new URL(location, url);
// The critical check that was missing:
if (!isAllowed(newUrl)) {
throw new Error(`Redirect to ${newUrl} is not allowed`);
}
// If allowed, loop and fetch the new URL...
}This change shifts the security model from "Trust the chain" to "Zero Trust for every hop."
So, why is this rated Low severity (CVSS 3.5)? Because pulling this off requires the stars to align. You can't just feed Backstage http://evil.com because the initial check will block it. You need a pivot point.
To exploit this, an attacker needs two things:
backend.reading.allow.The Attack Chain:
Let's assume the victim has allowed trusted-partner.com in their Backstage config. The attacker discovers that trusted-partner.com/login?next=... has an open redirect.
https://trusted-partner.com/login?next=http://169.254.169.254/latest/meta-data/.trusted-partner.com is on the list. Green light.HTTP/1.1 302 Found -> Location: http://169.254.169.254/....FetchUrlReader blindly follows the redirect to the AWS metadata service. Backstage reads the credentials and displays them (or stores them) as if they were valid catalog data.While the prerequisites are high, the impact in a cloud environment is catastrophic—total account compromise via metadata credentials.
The mitigation is straightforward: upgrade @backstage/backend-defaults to a patched version (0.12.2, 0.13.2, 0.14.1, or 0.15.0+). The patched component now manually iterates through redirects (up to 5 hops), validating the destination URL against the config at every single step.
If you cannot upgrade immediately, your defense-in-depth strategy is Egress Filtering. Your Backstage backend shouldn't be able to talk to the metadata service (169.254.169.254) or sensitive internal subnets anyway. A simple firewall rule dropping outbound traffic to RFC1918 addresses (excluding necessary services) renders this exploit inert, regardless of the application vulnerability.
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
@backstage/backend-defaults Backstage | < 0.12.2 | 0.12.2 |
@backstage/backend-defaults Backstage | >= 0.13.0, < 0.13.2 | 0.13.2 |
@backstage/backend-defaults Backstage | >= 0.14.0, < 0.14.1 | 0.14.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-918 |
| Attack Vector | Network |
| CVSS Score | 3.5 (Low) |
| EPSS Probability | 0.03% |
| Exploit Maturity | None (Theoretical) |
| Prerequisites | Allowed Host + Open Redirect |
Server-Side Request Forgery (SSRF)
CVE-2026-14669 is a critical heap-based buffer overflow vulnerability in PostgreSQL's date/time formatting function to_char(timestamptz). The flaw arises from unsafe copying of user-controlled timezone abbreviations into a fixed-size internal buffer. An authenticated database user can trigger this issue by setting a long POSIX timezone abbreviation containing custom formatting, allowing them to overwrite adjacent heap structures and hijack execution control to achieve remote code execution (RCE) with the privileges of the 'postgres' operating system user.
An unauthenticated remote denial of service vulnerability exists in the Unleash feature management platform. By submitting a crafted JSON payload containing deeply nested structures to an OpenAPI-validated endpoint, an attacker can trigger uncontrolled recursion within the error formatting module. This leads to a call-stack exhaustion (RangeError: Maximum call stack size exceeded) inside the Node.js runtime, causing the service to crash immediately without recovery.
CVE-2026-63004 is a server-side request forgery (SSRF) vulnerability in the Unleash feature management platform. Authenticated administrators with CREATE_ADDON or UPDATE_ADDON privileges can exploit this vulnerability to initiate requests to loopback addresses, private networks, and cloud metadata endpoints, potentially leading to information disclosure and credential extraction.
Prior to version 8.0.3, Unleash's Markdown event formatter directly mutated the global template-escaping function of the shared mustache Node.js module, resulting in a process-wide security degradation where HTML/Markdown escaping was permanently disabled for the application lifetime.
A critical SQL injection vulnerability exists in the GeoTools open-source Java library. This vulnerability is situated within the post-processing phase of OGC Filter conversion inside the PostGIS DataStore module. Specifically, the `jsonArrayContains` function does not validate or sanitize its arguments before constructing PostgreSQL SQL/JSON path evaluation queries. An unauthenticated remote attacker can exploit this weakness by submitting crafted filters via standard OGC services like WFS or WMS to execute arbitrary SQL commands on the underlying database system.
CVE-2026-61824 is a high-severity Cross-Site Scripting (XSS) vulnerability in kepano/defuddle before version 0.19.1. Custom site extractors for platforms such as X/Twitter, Substack, and YouTube constructed HTML representations via template string interpolation without output escaping. This allowed malicious pages to bypass standard parser sanitization routines and execute arbitrary JavaScript.