VAITP Dataset

← Back to the dataset

CVE-2026-73601

Authenticated RCE in Flowise Custom MCP node via env var manipulation.

  • CVSS 9.0
  • 95
  • Input Validation and Sanitization
  • Remote

Flowise versions before 3.1.3 contain a remote code execution vulnerability in the Custom MCP node when CUSTOM_MCP_PROTOCOL is set to stdio, allowing authenticated users to execute arbitrary commands by manipulating environment variables and command arguments. Attackers can abuse PYTHONWARNINGS and BROWSER environment variables with python3, or leverage the root working directory with node to bypass validation and execute system commands.

CWE
95
CVSS base score
9.0
Published
2026-08-13
OWASP
A03 Injection
Orthogonal defect classification
Checking
Code defect classification
Incorrect Check
Category
Input Validation and Sanitization
Subcategory
Command Injection
Accessibility scope
Remote
Impact
Arbitrary Code Execution
Affected component
Flowise

Solution

Upgrade Flowise to version 3.1.3 or later.

Vulnerable code sample

import os
import subprocess

def execute_custom_mcp_node(command, user_args, user_env, protocol):
    if protocol != 'stdio':
        # This vulnerability only applies to the 'stdio' protocol
        return None

    # Inherit parent environment and merge potentially malicious user variables
    env = os.environ.copy()
    if user_env:
        env.update(user_env)

    # VULNERABLE: User-controlled environment variables and arguments are passed to a subprocess without sanitization.
    process = subprocess.Popen(
        [command] + user_args,
        env=env,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,
    )

    stdout, stderr = process.communicate()
    return stdout, stderr

Patched code sample

import os
import subprocess
import shlex

def execute_custom_mcp_node(command, user_args, user_env, protocol):
    if protocol != 'stdio':
        # This vulnerability only applies to the 'stdio' protocol
        return None

    # Create a minimal, safe environment, ignoring user-provided variables.
    env = {
        'PATH': os.environ.get('PATH', '/usr/local/bin:/usr/bin:/bin')
    }

    # FIX: Use a controlled environment and sanitize command arguments with shlex.quote.
    sanitized_args = [shlex.quote(arg) for arg in user_args]
    
    process = subprocess.Popen(
        [command] + sanitized_args,
        env=env,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,
    )

    stdout, stderr = process.communicate()
    return stdout, stderr

Payload

{
  "command": "python3",
  "args": [],
  "env": {
    "PYTHONWARNINGS": "all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:all:-c=__import__('os').system('touch /tmp/pwned')"
  }
}

Cite this entry

@misc{vaitp:cve202673601,
  title        = {{Authenticated RCE in Flowise Custom MCP node via env var manipulation.}},
  author       = {Bogaerts, Fr\'ed\'eric and Ivaki, Naghmeh and Fonseca, Jos\'e},
  year         = {2026},
  note         = {VAITP Python Vulnerability Dataset, entry CVE-2026-73601},
  howpublished = {\url{https://netpack.pt/vaitp/vulnerability/CVE-2026-73601/}}
}
Introducing the "VAITP dataset": a specialized repository of Python vulnerabilities and patches, meticulously compiled for the use of the security research community. As Python's prominence grows, understanding and addressing potential security vulnerabilities become crucial. Crafted by and for the cybersecurity community, this dataset offers a valuable resource for researchers, analysts, and developers to analyze and mitigate the security risks associated with Python. Through the comprehensive exploration of vulnerabilities and corresponding patches, the VAITP dataset fosters a safer and more resilient Python ecosystem, encouraging collaborative advancements in programming security.

The supreme art of war is to subdue the enemy without fighting.

Sun Tzu – “The Art of War”

:: Shaping the future through research and ingenuity ::