Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with catalog.location.create permission
-
DeliveryCraft URL with percent-encoded dot segments
-
ExploitRegister location matching trusted catalog.rules pattern
-
ExecutionURL reader canonicalizes and fetches untrusted path
-
ImpactUntrusted entity ingested as trusted content
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitable only in deployments that use catalog.rules with URL-type ('url') location patterns to restrict which catalog kinds may be ingested from which URL prefixes; deployments not relying on URL location patterns are not exposed to the bypass. The attacker must be an authenticated user holding the catalog.location.create permission (per PR:L), so this is not remote-unauthenticated. The technique depends on the mismatch between DefaultCatalogRulesEnforcer matching the raw location.target string and URL readers canonicalizing the same URL (normalizing percent-encoded dot segments, encoded separators/backslashes, default ports) before fetching. No complete workaround exists for deployments that depend on URL location patterns to restrict catalog kinds; the vendor states that restricting location-registration permissions reduces exposure and that upgrading is the fix. Downstream consequences beyond the ingestion-policy boundary (e.g., actions by processors or scaffolder using integration credentials) depend on deployment configuration and were not substantiated by the advisory. |
| Impact | Signals are moderate and internally consistent rather than alarming. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N, base 6.5) describes a network-reachable, low-complexity flaw that requires an authenticated principal holding the catalog.location.create permission (PR:L), with impact limited to integrity (C:N/A:N). This aligns with the GHSA advisory: the only confirmed crossed boundary is the operator-configured catalog ingestion policy, and the advisory explicitly states it found no basis for impact claims beyond that boundary. No EPSS score is provided in the input, so exploitation probability cannot be quantified. KEV status is not indicated, so there is no confirmed active exploitation. No POC/exploit availability is asserted in the input (the references are the vendor advisory, patch commits, and release tags, not exploit code), so there is no public exploit identified at time of analysis - though the advisory does document a concrete example attack URL. The vuln.today decision label is 'this_month', consistent with a real-but-not-emergency issue: it is a genuine authorization-bypass worth patching on a normal cadence, not a high-CVSS-but-illusory problem, but it is gated behind an authenticated, specifically-permissioned user and a deployment that actually relies on catalog.rules URL patterns to restrict kinds. Teams not using URL-pattern-based catalog rules are effectively unaffected. |
| Exploit ScenarioDerived | In a Backstage deployment that restricts catalog kinds to trusted URL prefixes via catalog.rules, an authenticated user holding catalog.location.create registers a URL location such as https://ghe.example.com/trusted/%2e%2e/attacker/repo/blob/main/catalog-info.yaml. The raw string matches the https://ghe.example.com/trusted/** pattern during rule evaluation, but the URL reader canonicalizes the percent-encoded dot segments and fetches content from the attacker-controlled path, admitting untrusted entity content as trusted. No public exploit code is identified, though the advisory documents the exact crafted-URL technique. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 26, 2026
Catalog ingestion policy bypass in @backstage/plugin-catalog-backend lets an authenticated user holding the catalog.location.create permission register a URL whose raw string matches a trusted catalog.rules prefix (for example https://ghe.example.com/trusted/**) while the URL reader canonicalizes it to a location outside that prefix, so entity content from an untrusted source is ingested as if it came from a trusted one. Versions before 3.9.2 and 4.0.0 through 4.0.1 are affected, fixed in 3.9.2 (Backstage 1.54.10) and 4.0.2 (Backstage 1.56.1). Impact is scoped to the operator-configured ingestion policy boundary, downstream effects depend on deployment configuration, and no public exploit identified at time of analysis.
RemediationAI
Upgrade @backstage/plugin-catalog-backend to 3.9.2 (Backstage release 1.54.10) on the 3.x line or to 4.0.2 (Backstage release 1.56.1) on the 4.x line; do not rely on 4.0.1, which the vendor states is not fixed. After upgrading, review catalog.rules URL location patterns, because matching now happens against the canonical URL form and any pattern that relied on percent-encoded characters being matched as written, or on default ports being kept, will no longer match and must be updated. The vendor states there is no complete workaround for deployments that depend on URL location patterns to restrict catalog kinds, and that restricting who holds the catalog.location.create permission reduces exposure - a measure that limits the attacker population but does not restore the policy boundary, so upgrading remains the only complete fix. Advisory and release notes are at https://github.com/backstage/backstage/security/advisories/GHSA-w658-mh9p-ww8f, https://github.com/backstage/backstage/releases/tag/v1.54.10 and https://github.com/backstage/backstage/releases/tag/v1.56.1.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
DefaultCatalogRulesEnforcer in the Backstage catalog backend evaluates URL-type location targets by glob-matching the raw location.target string against the operator's catalog.rules location patterns, whereas the URL readers used for ingestion parse and canonicalize the same target - normalizing percent-encoded dot segments, encoded path separators, encoded backslashes, default ports and similar forms - before fetching content. That discrepancy is a classic CWE-22 path traversal confusion: a target such as https://<host>/trusted/%2e%2e/attacker/repo/blob/main/catalog-info.yaml satisfies the trusted prefix pattern as a literal string but resolves to https://<host>/attacker/repo/... when read. The upstream fix matches locations in canonical form so rule decisions agree with fetch-time resolution; the commit tests cover multi-encoded dot segments (%252e%252e), encoded separators (%2f), encoded backslashes (%5C), and userinfo-based prefix spoofing. Because matching now happens on the canonical URL, existing patterns that depended on percent-encoded characters being matched literally or on default ports being preserved must be rewritten.
Know when Backstage gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
Authenticated user with catalog.location.create is required (PR:L), the crafted URL is network-submitted with no user interaction (AV:N/UI:N), and impact is integrity-only - untrusted content admitted as trusted (I:H, C:N/A:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Backstage is an open framework for building developer portals. Prior to 3.9.2 and from 4.0.0 until 4.0.2, DefaultCatalogRulesEnforcer in @backstage/plugin-catalog-backend compares the raw location.target URL against catalog.rules, while URL readers canonicalize the same URL before fetching it. An authenticated user with catalog.location.create permission can use percent-encoded path segments to make an untrusted URL match a trusted location pattern even though the canonical URL resolves outside that scope. This admits entity content from an untrusted source as trusted, while further downstream consequences depend on deployment configuration. This issue is fixed in versions 3.9.2 and 4.0.2.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
The Bitbucket pull-request Scaffolder actions in Backstage can be abused by an authenticated user with template-executio
Backstage is an open platform for building developer portals. Rated critical severity (CVSS 9.9), this vulnerability is
Authenticated Backstage users can retrieve the internal execution data of other users' Scaffolder tasks - notably the Se
Authenticated users who can register or modify a TechDocs documentation source can achieve code execution inside the Bac
Authenticated remote code execution in the @backstage/plugin-techdocs-node package shipped with the Backstage developer
Arbitrary code execution in Backstage TechDocs documentation builds allows an authenticated user with write access to a
Arbitrary Python code execution in Backstage's @backstage/plugin-techdocs-node (versions < 1.13.11 and = 1.14.0) lets a
Improper task-state validation in the @backstage/plugin-scaffolder-backend plugin (Backstage versions prior to 3.3.1, 3.
Arbitrary code execution on the TechDocs backend host is achievable through a sanitizer bypass in the @backstage/plugin-
Improper input validation in the @backstage/plugin-scaffolder-backend-module-sentry scaffolder actions (Backstage 0.3.0
@backstage/plugin-scaffolder-backend is the backend for the default Backstage software templates. Rated high severity (C
Authenticated users of Backstage Scaffolder can bypass administrator-configured action restrictions in @backstage/plugin
EUVD-2026-110054
GHSA-w658-mh9p-ww8f
NVD
CVE.org
EPSS
Exploit-DB