Skip to main content
Vulnerability Database/CVE-2026-88064

CVE-2026-88064: Backstage TechDocs RCE Vulnerability

CVE-2026-88064 is a remote code execution flaw in Backstage TechDocs that allows authenticated users to execute unintended code through malicious YAML configurations. This post covers technical details, affected versions, and mitigation.

Published:

CVE-2026-88064 Overview

CVE-2026-88064 is an input validation vulnerability [CWE-20] in the Backstage @backstage/plugin-techdocs-node package. Backstage is an open framework for building developer portals. The flaw affects versions prior to 1.14.6 and versions 1.15.0 through 1.15.3. An authenticated user who can register or modify a TechDocs source can supply a crafted mkdocs.yml file. Unsafe Python YAML tags, markdown_extensions names and configuration, theme options, and extra_templates values reach the documentation generator and trigger unintended code execution. The resulting impact is limited to files, credentials, network access, and resources available to the TechDocs backend or build container.

Critical Impact

Authenticated attackers can achieve code execution in the TechDocs backend or build container, exposing credentials and internal network resources reachable from the build environment.

Affected Products

  • Backstage @backstage/plugin-techdocs-node versions prior to 1.14.6
  • Backstage @backstage/plugin-techdocs-node versions 1.15.0 through 1.15.3
  • Backstage releases prior to v1.50.5 and v1.54.6

Discovery Timeline

  • 2026-09-16 - CVE CVE-2026-88064 published to NVD
  • 2026-09-16 - Last updated in NVD database

Technical Details for CVE-2026-88064

Vulnerability Analysis

The vulnerability resides in how @backstage/plugin-techdocs-node parses and forwards MkDocs configuration to the documentation generator. TechDocs uses MkDocs, a Python-based static site generator, to render Markdown into HTML. When Backstage loads a user-supplied mkdocs.yml, it insufficiently validates several fields before passing them to the Python build process.

Specifically, the parser accepts arbitrary Python YAML tags of the form tag:yaml.org,2002:python/.... These tags instruct PyYAML to instantiate Python objects or invoke functions during deserialization. Alongside the YAML tag issue, the package accepts arbitrary markdown_extensions names and options, unrestricted theme keys, and unchecked extra_templates values. Any of these paths can load attacker-controlled Python code into the build.

Because a TechDocs source only requires authenticated access to register or modify, an internal user can weaponize a repository to execute code within the TechDocs backend or its build container.

Root Cause

The root cause is missing allowlisting on multiple mkdocs.yml fields. The custom YAML loader constructs UnknownTag objects for unrecognized types without restricting Python tag names. Extension configuration keys such as plantuml_cmd and theme keys were not constrained to a safe set. Values in extra_templates were forwarded to the generator without validation.

Attack Vector

An authenticated attacker registers or edits a TechDocs source pointing at a repository they control. The repository contains a malicious mkdocs.yml that either declares a dangerous Python YAML tag, references an attacker-controlled Markdown extension, sets a plugin option that invokes an external binary, or supplies a hostile theme option. When a build runs, the payload executes inside the TechDocs backend or ephemeral build container.

typescript
// Security patch: constrain Python YAML tags accepted by the loader
// Source: https://github.com/backstage/backstage/commit/25125ee727a3de3418a8fa6a9e458cd5b73ecf26
const ALLOWED_PYTHON_YAML_TAGS = new Set([
  'tag:yaml.org,2002:python/name:materialx.emoji.twemoji',
  'tag:yaml.org,2002:python/object.apply:materialx.emoji.to_svg',
  'tag:yaml.org,2002:python/object/apply:pymdownx.slugs.slugify',
]);

class UnknownTag {
  public readonly data: any;
  public readonly type?: string;

  constructor(data: any, type?: string) {
    if (
      type?.startsWith('tag:yaml.org,2002:python/') &&
      !ALLOWED_PYTHON_YAML_TAGS.has(type)
    ) {
      throw new Error(`Unsupported Python YAML tag '${type}'`);
    }

    this.data = data;
    this.type = type;
  }
}
typescript
// Security patch: harden markdown_extensions and theme sanitization
// Source: https://github.com/backstage/backstage/commit/02cd7cdbb18b687446277b5602adaee7f1d53cbb
export const DANGEROUS_EXTENSION_CONFIG_KEYS = new Set(['plantuml_cmd']);

export const ALLOWED_THEME_KEYS = new Set([
  'name',
  'font',
  'icon',
  'logo',
  'favicon',
  'language',
  'direction',
  'palette',
  'features',
]);

Stop Remote Code Execution Before It Runs

Singularity™ Endpoint detects and blocks exploit attempts at machine speed, including zero-days and novel attack techniques.

Stop Exploit Attempts

Detection Methods for CVE-2026-88064

Indicators of Compromise

  • Presence of tag:yaml.org,2002:python/ tags in any mkdocs.yml outside the small allowlist patched upstream.
  • markdown_extensions entries referencing unknown packages, absolute paths, or containing plantuml_cmd values.
  • Unexpected extra_templates entries or theme keys outside name, font, icon, logo, favicon, language, direction, palette, and features.
  • TechDocs build containers making outbound network connections to unfamiliar hosts or resolving to credential metadata endpoints.

Detection Strategies

  • Scan all TechDocs-registered repositories for mkdocs.yml files and diff their contents against the upstream allowlists introduced in commits 25125ee and 02cd7cd.
  • Monitor TechDocs backend process trees for child processes spawned by MkDocs that are not python, mkdocs, or expected plugin binaries.
  • Alert on git operations that add or modify mkdocs.yml in repositories linked as TechDocs sources.

Monitoring Recommendations

  • Enable audit logging on the Backstage TechDocs backend for source registration and update events, including the authenticated principal.
  • Forward TechDocs build container stdout, stderr, and process telemetry to a centralized logging platform for retention and search.
  • Track egress traffic from build containers and alert on connections to cloud metadata IPs such as 169.254.169.254.

How to Mitigate CVE-2026-88064

Immediate Actions Required

  • Upgrade @backstage/plugin-techdocs-node to version 1.14.6 or 1.15.4, or move to Backstage release v1.50.5 or v1.54.6.
  • Rotate any credentials, tokens, or cloud IAM keys reachable from the TechDocs backend or build container.
  • Audit all registered TechDocs sources and remove or quarantine any mkdocs.yml files that contain non-allowlisted Python YAML tags or extension options.

Patch Information

The issue is fixed in @backstage/plugin-techdocs-node versions 1.14.6 and 1.15.4, shipped with Backstage releases v1.50.5 and v1.54.6. Technical details are documented in the Backstage Security Advisory GHSA-292q-8mf5-h6g3 and in the patch commits 017ace5, 02cd7cd, 25125ee, a7d995f, and a900a99.

Workarounds

  • Run TechDocs builds in an ephemeral, isolated container with no access to production credentials or cloud metadata services.
  • Restrict who can register or modify TechDocs sources through Backstage permissions until the upgrade is applied.
  • Pre-validate mkdocs.yml files in a CI job that rejects Python YAML tags and non-allowlisted markdown_extensions, theme, and extra_templates values.
bash
# Upgrade the affected package to a fixed version
yarn up @backstage/plugin-techdocs-node@^1.15.4

# Or for the 1.14.x line
yarn up @backstage/plugin-techdocs-node@^1.14.6

# Verify the installed version
yarn why @backstage/plugin-techdocs-node

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.