{"schemaVersion":3,"id":"CVE-2026-106489","aliases":["GHSA-rg9r-hr7g-5gc2"],"status":"published","duplicateOf":null,"title":null,"description":"Backstage is an open framework for building developer portals. Prior to 2.2.4, the @backstage/plugin-techdocs-backend package is affected by improper authorization enforcement for techdocs static content. An authenticated user with access to one TechDocs documentation site could craft a URL able to read documentation belonging to a different entity. This only affects deployments using the external TechDocs builder with an external storage provider (S3, GCS, etc.) and the permission framework enabled. Instances that do not use the permission framework are unaffected, since TechDocs content is visible to all authenticated users by design. This issue is fixed in version 2.2.4.","dates":{"published":"2026-10-06T20:39:50.992Z","modified":"2026-10-07T15:29:13.363Z","reserved":null,"kevAdded":[],"kevDue":[]},"cvss":{"headline":{"score":6.5,"severity":"medium","version":"3.1","versionLabel":"v3.1","source":"CVE.org","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","computed":false,"selection":"backend-summary"},"metrics":[{"version":"3.1","versionLabel":"v3.1","source":"CVE.org","score":6.5,"severity":"medium","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","exploitability":null,"impact":null,"computed":false},{"version":"3.1","versionLabel":"v3.1","source":"OSV · Npm","score":6.5,"severity":"medium","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","exploitability":7.2,"impact":6,"computed":true},{"version":"3.1","versionLabel":"v3.1","source":"NVD","score":6.5,"severity":"medium","vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","exploitability":null,"impact":null,"computed":false}]},"epss":{"probability":0.00287,"percentile":0.20022,"severity":"low","asOf":"2026-10-20T00:00:00.000Z","change":{"pp":null,"baselineDate":null,"baselineScore":null},"history":[{"date":"2026-10-07T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.00287,"percentile":0.20022}],"last30":[{"date":"2026-10-07T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.00287,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.00287,"percentile":0.20022}]},"kev":{"state":"not-listed","entries":[],"listedCount":0,"totalCatalogs":3,"catalogs":[{"source":"cisa","label":"CISA","listed":false,"entry":null},{"source":"enisa","label":"ENISA","listed":false,"entry":null},{"source":"circl","label":"CIRCL","listed":false,"entry":null}]},"ransomware":{"state":"none-recorded","sources":[]},"exploits":[],"exploitCount":0,"weaknesses":[{"id":"CWE-22","name":"Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')","description":"The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.","type":"weakness","status":"Stable","abstraction":"Base","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/22.html"},{"id":"CWE-862","name":"Missing Authorization","description":"The product does not perform an authorization check when an actor attempts to access a resource or perform an action.","type":"weakness","status":"Incomplete","abstraction":"Class","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/862.html"}],"affected":[{"vendor":"backstage","product":"backstage","name":"backstage","label":"backstage","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 1.54.6","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 1.54.6","eol":null,"hubHref":"/vendor/backstage/backstage"},{"vendor":"@backstage","product":"plugin-techdocs-backend","name":"plugin-techdocs-backend","label":"plugin-techdocs-backend","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 2.2.4","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 2.2.4","eol":null,"hubHref":"/vendor/backstage/plugin-techdocs-backend"},{"vendor":"@backstage","product":"plugin-techdocs-backend","name":"@backstage/plugin-techdocs-backend","label":"plugin-techdocs-backend","ecosystem":"Npm","cpePart":null,"purl":"pkg:npm/@backstage/plugin-techdocs-backend","purlType":"npm","versions":[{"text":"< 2.2.4","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 2.2.4","eol":null,"hubHref":null}],"affectedCount":3,"eol":{"hasEol":false,"count":0},"references":[{"url":"https://github.com/backstage/backstage/security/advisories/GHSA-rg9r-hr7g-5gc2","label":"github.com/backstage/backstage/security/advisories/GHSA-rg9r-hr7g-5gc2","hostname":"github.com","tags":["X Refsource CONFIRM","WEB"]},{"url":"https://github.com/backstage/backstage/commit/bf6bbf7326ada7d96d7b2c4ebc4a71546106f311","label":"github.com/backstage/backstage/commit/bf6bbf7326ada7d96d7b2c4ebc4a71546106f311","hostname":"github.com","tags":["X Refsource MISC","WEB"]},{"url":"https://github.com/backstage/backstage/releases/tag/v1.54.6","label":"github.com/backstage/backstage/releases/tag/v1.54.6","hostname":"github.com","tags":["X Refsource MISC","WEB"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-106489","label":"nvd.nist.gov/vuln/detail/CVE-2026-106489","hostname":"nvd.nist.gov","tags":["Advisory"]},{"url":"https://github.com/backstage/backstage","label":"github.com/backstage/backstage","hostname":"github.com","tags":["PACKAGE"]}],"lineage":{"upstream":[],"downstream":[],"duplicates":[],"related":[]},"timeline":[{"kind":"published","date":"2026-10-06T20:39:50.992Z","label":"Published","detail":"Vulnerability first disclosed.","source":null},{"kind":"modified","date":"2026-10-07T15:29:13.363Z","label":"Last modified","detail":"Vulnerability information updated.","source":null}],"risk":{"score":26,"level":"medium","profile":"Default","thresholds":{"critical":75,"high":50,"medium":25,"low":10}},"meta":{"dataAsOf":"2026-10-21T05:08:46.295Z","stale":false,"partial":false}}