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·39 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

•about 1 hour ago•GHSA-68W4-83FH-F2W8
8.8

GHSA-68W4-83FH-F2W8: Privilege Escalation and Administrative Password Oracle in pyLoad-ng

An authorization bypass and credential oracle vulnerability in pyload-ng allows authenticated users with minimal or no privileges to brute-force the administrator password. This is achieved through sensitive API methods exposed globally combined with a non-constant-time password hash comparison algorithm.

Alon Barad
Alon Barad
4 views•7 min read
•about 2 hours ago•GHSA-R44W-V6GF-X3P6
8.1

Authentication Bypass in pyLoad API Key Caching Mechanism (GHSA-R44W-V6GF-X3P6)

An authentication bypass vulnerability in pyLoad allows unauthenticated remote attackers to gain administrative API access. The vulnerability is caused by a logical flaw in the API key cache validation lookup, where authentication states are cached using only the public key identifier, skipping cryptographic token verification on cache hits.

Alon Barad
Alon Barad
9 views•7 min read
•about 3 hours ago•CVE-2026-107728
7.5

CVE-2026-107728: Authorization Bypass in Strawberry GraphQL Permission Validation

An authorization bypass vulnerability in Strawberry GraphQL between versions 0.217.0 and 0.326.1 occurs when a synchronous permission handler returns an awaitable object (such as an unawaited coroutine). Due to Python's truthiness rules, the unawaited coroutine is evaluated as True, leading to an immediate bypass of security policies.

Amit Schendel
Amit Schendel
9 views•5 min read
•about 4 hours ago•CVE-2026-107727
3.7

CVE-2026-107727: Connection-Level Denial of Service via State Leak in Strawberry GraphQL Legacy WS Handler

An uncontrolled resource consumption vulnerability in Strawberry GraphQL allows unauthenticated remote attackers to trigger a Denial of Service on persistent WebSocket connections using the legacy graphql-ws protocol. When the server enforces max_subscriptions_per_connection, naturally terminating subscriptions are not cleared from memory registries, leading to exhaustion of connection slots.

Alon Barad
Alon Barad
10 views•6 min read
•about 5 hours ago•CVE-2026-107723
8.1

CVE-2026-107723: Silent Claim-Validator Bypass in NearForm fast-jwt via Array Payload Type Confusion

A high-severity type-confusion vulnerability exists in NearForm fast-jwt prior to version 6.3.0. The vulnerability allows attackers to bypass crucial claim validation steps (such as expiration, issuer, audience, and subject validations) by presenting a validly signed JSON Web Token structured as a JSON array instead of a JSON object. This occurs because the library's decoder fails to reject JSON arrays during type evaluation.

Alon Barad
Alon Barad
10 views•6 min read
•about 6 hours ago•CVE-2026-107721
5.9

CVE-2026-107721: Time Validation Bypass in NearForm fast-jwt due to Loose Temporal Option Validation

NearForm fast-jwt prior to version 6.3.0 is vulnerable to an input validation flaw where configuring verifier properties (such as clockTolerance, clockTimestamp, and cacheTTL) with non-finite values like Infinity or NaN allows attackers to bypass temporal claim validations, including expiration (exp) and activation (nbf) boundaries. This validation bypass can result in unauthorized session persistence and cache poisoning.

Amit Schendel
Amit Schendel
9 views•6 min read