CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-XRMJ-5G4G-8987

GHSA-xrmj-5g4g-8987: Workflow Template Injection in @dynatrace-oss/dynatrace-mcp-server

Amit Schendel
Amit Schendel
Senior Security Researcher

Jul 31, 2026·5 min read·7 visits

Executive Summary (TL;DR)

The @dynatrace-oss/dynatrace-mcp-server before v2.0.0 allowed attackers to perform template injection into Dynatrace Workflow templates. This allows arbitrary Jinja2 template execution that persists on the tenant even after the session ends.

A template injection vulnerability in @dynatrace-oss/dynatrace-mcp-server allows untrusted input to be interpolated directly into Dynatrace Workflows using Jinja2 syntax, leading to persistent data exposure and exfiltration.

Vulnerability Overview

The Model Context Protocol (MCP) server for Dynatrace, distributed via the npm registry as @dynatrace-oss/dynatrace-mcp-server, acts as a bridge enabling Large Language Models (LLMs) to interact with Dynatrace APIs and perform automated operations.

One of the capabilities exposed by this MCP server is the create_workflow_for_notification tool. This tool allows users or automated agents to generate alert routing workflows inside a Dynatrace tenant, specifying details such as the target team, the class of problem, and the communication channel.

In versions of the server prior to 2.0.0, the tool accepts parameter inputs without proper validation or escaping, and interpolates them directly into a Dynatrace Workflow definition template. This workflow template utilizes the Jinja2 rendering engine at runtime, introducing a template injection surface (CWE-1336) that exposes the underlying Dynatrace tenant data to exfiltration.

Root Cause Analysis

The fundamental flaw resides within the handler implementation found at src/capabilities/create-workflow-for-problem-notification.ts. The handler accepts user-controlled properties, including teamName, problemType, and channel, via an incoming MCP JSON-RPC call.

These variables are processed as raw string variables and concatenated directly into the properties of a WorkflowCreate structure. Specifically, the channel parameter is wrapped in a Jinja2 execution syntax block: {{ "${channel}" }}. Because the implementation relies on simple ES6 template literals rather than structured, parameter-aware builders, characters like quotes and brackets remain intact.

Furthermore, the validation schema declared in src/index.ts relies on basic Zod string constraints (z.string().optional()) that enforce zero pattern verification or character blocklists. Consequently, any string containing template tags ({{ and }}) is parsed without validation, allowing the injection payload to reach the platform configuration unchanged.

Code & Architectural Analysis

An inspection of the vulnerable source code highlights how the payloads were constructed:

// Vulnerable: src/capabilities/create-workflow-for-problem-notification.ts
let notificationWorkflow: WorkflowCreate = {
  title: `[MCP POC] Notify team ${teamName} on problem of type ${problemType}`,
  description: `Automatically created workflow to notify team ${teamName}...`,
  isPrivate: isPrivate,
  type: 'SIMPLE',
  tasks: {
    send_notification: {
      name: 'Send notification',
      action: 'dynatrace.slack:slack-send-message',
      description: 'Sends a notification to a Slack channel',
      input: {
        connectionId: 'slack-connection-id',
        channel: `{{ "${channel}" }}`,
        message: `🚨 Alert for Team ${teamName}\n*Problem Type*: ${problemType}\n` +
                 `*Problem ID*: {{ event()["display_id"] }}\n` +
                 `*Status*: {{ event()["event.status"] }}\n`
      },
      active: true,
    },
  },
};

The logical execution flow of this exploit moves from the user/agent interface to the internal templating engine as shown below:

The channel context is particularly vulnerable. By injecting #channel" }} into the parameter, an attacker breaks out of the string boundary defined in the generated template structure, giving them direct access to the outer Jinja2 processing context.

Exploitation Methodology & Proof of Concept

To execute this attack, a malicious actor must trigger the create_workflow_for_notification tool. This can occur either through direct administrative access to the MCP client interface or via an indirect prompt injection attack, where an LLM is manipulated into executing the tool on behalf of an operator.

A verified proof-of-concept payload submits the following arguments during the tool execution request:

{
  "teamName": "{{ event() }}",
  "problemType": "ERROR",
  "channel": "#mcp-sec-poc",
  "isPrivate": true
}

When this workflow is saved to the Dynatrace platform and subsequently triggered by an incident event, the underlying Jinja2 execution layer evaluates the payload. Instead of outputting the literal string {{ event() }}, the execution layer interprets the function call, which dumps the entire current event dictionary—including active operational data, status markers, and system metadata—into the outgoing communication block.

Architectural Impact & Persistence

The core risk of this vulnerability is the persistent execution state of Dynatrace workflows. Unlike typical web-application vulnerabilities where the exploitation lifecycle is ephemeral, a workflow template injection creates a long-lived configuration object within the tenant.

Once the workflow is saved, it continues to run within the Dynatrace platform infrastructure. It remains active even if the operator closes their session, has their personal access credentials revoked, or completely uninstalls the MCP server. This establishes a highly reliable and silent persistence channel.

Furthermore, because the templates run within the security context of the Dynatrace automation execution environment, they can access platform utility functions like environment(). An attacker can use this access to map out internal tenant URLs, architecture settings, and directory metadata, then exfiltrate this information through configured notification actions.

Remediation & Defensive Engineering

Rather than attempting to build sanitization routines to sanitize complex nested Jinja2 brackets, the development team decided to completely remove the vulnerable code path to eliminate the attack surface.

In version 2.0.0, both the create_workflow_for_notification and make_workflow_public tools were removed. Users needing workflow creation capabilities are instructed to use official channels, such as the dtctl command-line utility, the native Dynatrace User Interface, or the raw Dynatrace Automation API directly.

To remediate this vulnerability, operators must upgrade @dynatrace-oss/dynatrace-mcp-server to version 2.0.0 or higher. Note that upgrading the server does not purge previously generated workflows; an incident response audit must be executed inside the Dynatrace console to discover and manually delete any workflows created under the prefix [MCP POC].

Fix Analysis (1)

Technical Appendix

CVSS Score
4.2/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N

Affected Systems

@dynatrace-oss/dynatrace-mcp-server

Affected Versions Detail

Product
Affected Versions
Fixed Version
@dynatrace-oss/dynatrace-mcp-server
Dynatrace
< 2.0.02.0.0
AttributeDetail
CWE IDCWE-1336
Attack VectorNetwork
CVSS v3.14.2
Exploit Statuspoc
KEV StatusNot Listed
Weakness NameImproper Neutralization of Special Elements Used in a Template Engine

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1546Event Triggered Execution
Persistence
CWE-1336
Improper Neutralization of Special Elements Used in a Template Engine

The product parses a template without properly neutralizing special elements, allowing attackers to execute arbitrary template code.

Known Exploits & Detection

GitHub Security AdvisoryVerified Proof of Concept via tool payload argument injection

Vulnerability Timeline

Advisory Published & Patch Released
2025-01-31

References & Sources

  • [1]GitHub Advisory Database
  • [2]Repository Security Advisory
  • [3]Patch Commit
  • [4]Pull Request #547
  • [5]Release Tag v2.0.0

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•34 minutes ago•GHSA-3WHF-VGF2-9W6G
5.1

GHSA-3WHF-VGF2-9W6G: Denial of Service via Unbounded Recursion and State Panic in zaino-state

The zaino-state crate contains two critical flaws in its block reorganization and state synchronization logic. An unbounded recursive async function handling block reorganization fails to validate cyclic relationships, enabling network peers to cause infinite loops that exhaust CPU and memory resources. Furthermore, a logical pruning error during non-finalized block cache trimming can purge all cached blocks, triggering an immediate panic and crash of the daemon.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 2 hours ago•CVE-2026-53504
7.5

CVE-2026-53504: Regular Expression Denial of Service (ReDoS) in Thumbor Convolution Filter

A critical Regular Expression Denial of Service (ReDoS) vulnerability exists in Thumbor prior to version 7.8.0. The vulnerability resides within the dynamic filter-parsing engine, specifically inside the 'convolution' filter parameter processing logic. Due to overlapping and nested quantifiers in the regular expression used to parse matrix values, a remote, unauthenticated attacker can supply a specially crafted, malformed filter payload inside a request URL. This causes Python's standard NFA-based regular expression engine to undergo exponential backtracking, exhausting CPU resources and leading to a complete Denial of Service.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 3 hours ago•CVE-2026-54737
7.3

CVE-2026-54737: Prototype Pollution in @phun-ky/defaults-deep

CVE-2026-54737 is a high-severity Prototype Pollution vulnerability in the @phun-ky/defaults-deep npm library prior to version 2.0.5. Due to unsafe recursive object merging, unauthenticated attackers can supply structured payloads that modify the properties of Object.prototype, compromising the runtime process state.

Alon Barad
Alon Barad
6 views•5 min read
•about 4 hours ago•CVE-2026-54729
8.7

CVE-2026-54729: SSRF Protection Bypass in dssrf-js via NXDOMAIN Resolution Discrepancy

CVE-2026-54729 is a critical Server-Side Request Forgery (SSRF) bypass vulnerability in the dssrf-js Node.js library prior to version 1.0.5. The flaw occurs because the library's DNS validation mechanism incorrectly treats domains like 'localhost' as safe when the configured upstream DNS resolver returns NXDOMAIN. Since the system's HTTP client later falls back to OS-level resolution (resolving 'localhost' to '127.0.0.1'), attackers can bypass validation and access internal loopback addresses.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 11 hours ago•CVE-2026-67437
7.5

CVE-2026-67437: Unauthenticated Denial of Service via OAuth2 State Memory Exhaustion in OliveTin

An uncontrolled resource consumption vulnerability (CWE-400) in OliveTin allows unauthenticated remote attackers to exhaust server memory and trigger a denial of service (DoS). By repeatedly initiating the OAuth2 login flow without completing it, attackers can force the server to allocate state variables in an unbounded in-memory map. This heap-based resource exhaustion eventually causes the host operating system to terminate the OliveTin process via the Out-Of-Memory (OOM) killer.

Amit Schendel
Amit Schendel
7 views•8 min read
•about 12 hours ago•CVE-2026-67439
4.3

CVE-2026-67439: Incorrect Authorization Leading to Log Leak in OliveTin

An incorrect authorization vulnerability (CWE-863) exists in OliveTin prior to version 3000.17.0. The flaw allows authenticated users who are authorized to execute commands but restricted from viewing logs to bypass this restriction. By utilizing synchronous endpoints, attackers can directly access execution outputs containing sensitive system data, credentials, and environmental configurations.

Alon Barad
Alon Barad
7 views•5 min read