CVE-2026-69264
Flowise CSVAgent allows unauthenticated RCE via CSV data URI injection.
- CVSS 9.4
- 94
- Input Validation and Sanitization
- Remote
Prior to 3.1.3, Flowise CSVAgent interpolates an attacker-controlled segment of the csvFile data URI directly into a Python source-code template that is then executed by Pyodide. Because Pyodide is loaded with the default js bridge to globalThis, which on Node.js exposes eval and dynamic import, the attacker can break out of the Python string literal, hand a JavaScript string to js.eval, dynamically import Node built-in modules such as fs and child_process, and execute arbitrary file I/O or OS commands as the Flowise process. The two validator paths around this code, validatePythonCodeForDataFrame and validateCustomReadCSVFunction, are never applied to the bootstrap template. A workspace user with chatflows:create or agentflows/chatflows update permission can plant a CSV Agent node with a crafted csvFile; once the chatflow is exposed via POST /api/v1/prediction/:id, any unauthenticated request triggers host remote code execution. This issue is fixed in version 3.1.3.
- CWE
- 94
- CVSS base score
- 9.4
- Published
- 2026-08-04
- OWASP
- A03 Injection
- Orthogonal defect classification
- Checking
- Code defect classification
- Missing Check
- Category
- Input Validation and Sanitization
- Subcategory
- Command Injection
- Accessibility scope
- Remote
- Impact
- Arbitrary Code Execution
- Affected component
- Flowise
- Fixed by upgrading
- Yes
Solution
Upgrade Flowise to version 3.1.3 or later.
Vulnerable code sample
def get_base64_data_from_uri(uri: str) -> str:
"""Simplified simulation of extracting data from a data URI."""
if uri.startswith('data:text/csv;base64,'):
return uri.split(',', 1)[1]
return ''
def create_csv_agent_code(csv_file_data_uri: str) -> str:
"""
Generates Python code for the CSVAgent to be run in Pyodide.
"""
b64_data = get_base64_data_from_uri(csv_file_data_uri)
# VULNERABLE: Attacker-controlled data is directly formatted into a code template.
python_code = f"""
import js
import pandas as pd
from io import StringIO
import base64
# The untrusted data is placed inside a string literal, allowing injection.
b64_csv_content = '{b64_data}'
csv_content = base64.b64decode(b64_csv_content).decode('utf-8')
df = pd.read_csv(StringIO(csv_content))
# ... agent logic ...
"""
return python_codePatched code sample
def get_base64_data_from_uri(uri: str) -> str:
"""Simplified simulation of extracting data from a data URI."""
if uri.startswith('data:text/csv;base64,'):
return uri.split(',', 1)[1]
return ''
def create_csv_agent_code(csv_file_data_uri: str) -> str:
"""
Generates Python code for the CSVAgent to be run in Pyodide.
"""
b64_data = get_base64_data_from_uri(csv_file_data_uri)
# FIX: Input is escaped to prevent an attacker from breaking out of the string literal.
safe_b64_data = b64_data.replace("\\", "\\\\").replace("'", "\\'")
python_code = f"""
import js
import pandas as pd
from io import StringIO
import base64
# The data, now sanitized, is safely placed inside the string literal.
b64_csv_content = '{safe_b64_data}'
csv_content = base64.b64decode(b64_csv_content).decode('utf-8')
df = pd.read_csv(StringIO(csv_content))
# ... agent logic ...
"""
return python_codePayload
data:text/csv,A,B\n', import js; js.eval("import('child_process').then(c => c.execSync('touch /tmp/pwned'))");#
Cite this entry
@misc{vaitp:cve202669264,
title = {{Flowise CSVAgent allows unauthenticated RCE via CSV data URI injection.}},
author = {Bogaerts, Fr\'ed\'eric and Ivaki, Naghmeh and Fonseca, Jos\'e},
year = {2026},
note = {VAITP Python Vulnerability Dataset, entry CVE-2026-69264},
howpublished = {\url{https://netpack.pt/vaitp/vulnerability/CVE-2026-69264/}}
}
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 ::
