Flowise: RCE via CSVAgent csvFile data URI base64 segment is interpolated into Python source without validation
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.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-69264
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 7 Nov 2026, 06:41 UTC · Revision 1
Source evidence
Flowise: RCE via CSVAgent csvFile data URI base64 segment is interpolated into Python source without validation
core-osv · Original sourcePublished 4 Aug 2026, 17:22 UTC
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.
osv:CVE-2026-69264
Complete source record
{
"id": "856430baf0b9d528bd47bc1dc42106b497ecbcbae8a84110d5ff9a254d9ff2b4",
"url": "https://osv.dev/vulnerability/CVE-2026-69264",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Flowise: RCE via CSVAgent csvFile data URI base64 segment is interpolated into Python source without validation",
"summary": "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.",
"evidence": "osv:CVE-2026-69264",
"products": [],
"severity": "critical",
"structured": {
"id": "CVE-2026-69264",
"aliases": [
"CVE-2026-69264",
"GHSA-4j8x-x6v7-w9rq"
],
"metrics": [
{
"type": "CVSS_V4",
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/flowiseai/flowise",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "09f099dbfda179e439ec677d06ad737375899eef"
},
{
"fixed": "f4e2794f6a576b94578f2fdafbf49c2fb304626c"
}
],
"database_specific": {
"extracted_events": [
{
"cpe": "cpe:2.3:a:flowiseai:flowise:*:*:*:*:*:*:*:*",
"range": [
{
"introduced": "0"
},
{
"fixed": "3.1.3"
}
],
"source": "CPE_RANGE"
},
{
"range": [
{
"fixed": "f4e2794f6a576b94578f2fdafbf49c2fb304626c"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "09f099dbfda179e439ec677d06ad737375899eef"
}
],
"source": "REFERENCES_TAG",
"original_tag": "flowise@3.1.3"
}
]
}
}
],
"versions": [
"flowise@3.1.2",
"flowise-ui@3.1.2",
"flowise-components@3.1.2",
"flowise@3.1.1",
"flowise-ui@3.1.1",
"flowise-components@3.1.1",
"flowise@3.1.0",
"flowise-ui@3.1.0",
"flowise-components@3.1.0",
"pre-langchain-v1",
"flowise@3.0.13",
"flowise-ui@3.0.13",
"flowise-components@3.0.13",
"flowise@3.0.12",
"flowise-ui@3.0.12",
"flowise-components@3.0.12",
"flowise@3.0.11",
"flowise-ui@3.0.11",
"flowise-components@3.0.11",
"flowise@3.0.10",
"flowise-ui@3.0.10",
"flowise-components@3.0.10",
"flowise@3.0.9",
"flowise-ui@3.0.9",
"flowise-components@3.0.9",
"flowise@3.0.8",
"flowise-ui@3.0.8",
"flowise-components@3.0.8",
"flowise@3.0.7",
"flowise-ui@3.0.7",
"flowise-components@3.0.7",
"flowise@3.0.6",
"flowise-ui@3.0.6",
"flowise-components@3.0.6",
"flowise@3.0.5",
"flowise-ui@3.0.5",
"flowise-components@3.0.5",
"flowise@3.0.4",
"flowise-ui@3.0.4",
"flowise-components@3.0.4",
"flowise@3.0.3",
"flowise-ui@3.0.3",
"flowise-components@3.0.3",
"flowise@3.0.2",
"flowise-ui@3.0.2",
"flowise-components@3.0.2",
"flowise@3.0.1",
"flowise-ui@3.0.1",
"flowise-components@3.0.1",
"flowise@3.0.0",
"flowise-ui@3.0.0",
"flowise-components@3.0.0",
"flowise@2.2.8",
"flowise-ui@2.2.8",
"flowise-components@2.2.8",
"flowise@2.2.7-patch.1",
"flowise-ui@2.2.7-patch.1",
"flowise-components@2.2.7-patch.1",
"flowise@2.2.7",
"flowise-ui@2.2.7",
"flowise-components@2.2.7",
"flowise@2.2.6-hotfix.1",
"flowise@2.2.6",
"flowise-ui@2.2.6",
"flowise-components@2.2.6",
"flowise@2.2.5",
"flowise-ui@2.2.5",
"flowise-components@2.2.5",
"flowise@2.2.4",
"flowise-ui@2.2.4",
"flowise-components@2.2.4",
"flowise@2.2.3",
"flowise-ui@2.2.3",
"flowise-components@2.2.3",
"flowise@2.2.2",
"flowise-ui@2.2.2",
"flowise-components@2.2.2",
"flowise@2.2.1",
"flowise-ui@2.2.1",
"flowise-components@2.2.1",
"flowise@2.2.0",
"flowise-ui@2.2.0",
"flowise-components@2.2.0",
"flowise@2.1.5",
"flowise-ui@2.1.5",
"flowise-components@2.1.5",
"flowise@2.1.4",
"flowise-ui@2.1.4",
"flowise-components@2.1.4",
"flowise@2.1.3",
"flowise-ui@2.1.3",
"flowise-components@2.1.3",
"flowise@2.1.2",
"flowise-ui@2.1.2",
"flowise-components@2.1.2",
"flowise@2.1.1",
"flowise-ui@2.1.1",
"flowise-components@2.1.1",
"flowise@2.1.0",
"flowise-ui@2.1.0",
"flowise-components@2.1.0",
"flowise@2.0.7",
"flowise-ui@2.0.7",
"flowise-components@2.0.7",
"flowise@2.0.6",
"flowise-ui@2.0.6",
"flowise-components@2.0.6",
"flowise@2.0.5",
"flowise-ui@2.0.5",
"flowise-components@2.0.5",
"flowise@2.0.4",
"flowise-ui@2.0.4",
"flowise-components@2.0.4",
"flowise@2.0.3",
"flowise-ui@2.0.3",
"flowise-components@2.0.3",
"flowise@2.0.2",
"flowise-ui@2.0.2",
"flowise-components@2.0.2",
"flowise@1.8.4",
"flowise-ui@1.8.4",
"flowise-components@1.8.6",
"flowise@1.8.3",
"flowise-ui@1.8.3",
"flowise-components@1.8.4",
"flowise@1.8.2",
"flowise-ui@1.8.2",
"flowise-components@1.8.3",
"flowise@1.8.1",
"flowise-ui@1.8.1",
"flowise-components@1.8.1",
"flowise@1.8.0",
"flowise-ui@1.8.0",
"flowise-components@1.8.0",
"flowise@1.7.2",
"flowise-ui@1.7.2",
"flowise-components@1.7.2",
"flowise@1.7.1",
"flowise-ui@1.7.1",
"flowise-components@1.7.1",
"flowise@1.7.0",
"flowise-ui@1.7.0",
"flowise-components@1.7.0",
"flowise@1.6.6",
"flowise-ui@1.6.6",
"flowise-components@1.6.8",
"flowise@1.6.5",
"flowise-ui@1.6.5",
"flowise-components@1.6.7",
"flowise@1.6.4",
"flowise-ui@1.6.4",
"flowise-components@1.6.6",
"flowise@1.6.3",
"flowise-ui@1.6.3",
"flowise-components@1.6.5",
"flowise@1.6.2",
"flowise-ui@1.6.2",
"flowise-components@1.6.4",
"flowise@1.6.1",
"flowise-ui@1.6.1",
"flowise-components@1.6.3",
"flowise@1.6.0",
"flowise-ui@1.6.0",
"flowise-components@1.6.2",
"flowise@1.5.1",
"flowise-ui@1.5.1",
"flowise-components@1.6.1",
"flowise@1.5.0",
"flowise-ui@1.5.0",
"flowise-components@1.6.0",
"flowise@1.4.12",
"flowise-ui@1.4.9",
"flowise-components@1.5.3",
"flowise@1.4.11",
"flowise-ui@1.4.8",
"flowise-components@1.5.2",
"flowise@1.4.10",
"flowise-ui@1.4.7",
"flowise-components@1.5.1",
"flowise@1.4.9",
"flowise@1.4.8",
"flowise-ui@1.4.6",
"flowise-components@1.5.0",
"flowise@1.4.7",
"flowise-ui@1.4.5",
"flowise-components@1.4.9",
"flowise-components@1.4.8",
"flowise@1.4.6",
"flowise-ui@1.4.4",
"flowise-components@1.4.7",
"flowise@1.4.5",
"flowise-ui@1.4.3",
"flowise@1.4.4",
"flowise-ui@1.4.2",
"flowise-components@1.4.6",
"flowise@1.4.2",
"flowise-components@1.4.2",
"flowise@1.4.1",
"flowise-components@1.4.1",
"flowise@1.4.0",
"flowise-ui@1.4.0",
"flowise-components@1.4.0",
"flowise@1.3.9",
"flowise-ui@1.3.7",
"flowise-components@1.3.11",
"flowise-components@1.3.10",
"flowise@1.3.8",
"flowise-ui@1.3.6",
"flowise-components@1.3.9",
"flowise@1.3.7",
"flowise-ui@1.3.5",
"flowise-components@1.3.8",
"flowise@1.3.6",
"flowise-ui@1.3.4",
"flowise-components@1.3.7",
"flowise@1.3.5",
"flowise-ui@1.3.3",
"flowise-components@1.3.5",
"flowise@1.3.4",
"flowise-ui@1.3.2",
"flowise-components@1.3.4",
"flowise@1.3.3",
"flowise-ui@1.3.1",
"flowise-components@1.3.3",
"flowise@1.3.2",
"flowise-components@1.3.2",
"flowise@1.3.1",
"flowise-components@1.3.1",
"flowise@1.3.0",
"flowise-ui@1.3.0",
"flowise-components@1.3.0",
"flowise@1.2.16",
"flowise-ui@1.2.15",
"flowise-components@1.2.17",
"flowise@1.2.15",
"flowise-ui@1.2.14",
"flowise-components@1.2.16",
"flowise@1.2.14",
"flowise-ui@1.2.13",
"flowise-components@1.2.15",
"flowise@1.2.13",
"flowise-ui@1.2.12",
"flowise-components@1.2.14",
"flowise@1.2.11",
"flowise-ui@1.2.10",
"flowise-components@1.2.12",
"flowise@1.2.9",
"flowise-components@1.2.10",
"flowise@1.2.8",
"flowise-ui@1.2.7",
"flowise-components@1.2.9",
"flowise@1.2.7",
"flowise-ui@1.2.6",
"flowise-components@1.2.8",
"flowise@1.2.6",
"flowise-ui@1.2.5",
"flowise-components@1.2.7",
"flowise@1.2.5",
"flowise-ui@1.2.4",
"flowise-components@1.2.6",
"flowise@1.2.4",
"flowise-ui@1.2.3",
"flowise-components@1.2.5",
"flowise@1.2.3",
"flowise-ui@1.2.2",
"flowise-components@1.2.4",
"flowise-components@1.2.3",
"flowise@1.2.2",
"flowise-ui@1.2.1",
"flowise-components@1.2.2",
"flowise@1.2.1",
"flowise-ui@1.2.0",
"flowise-components@1.2.1",
"flowise@1.1.1",
"flowise-components@1.1.1",
"flowise@1.1.0",
"flowise-ui@1.1.0",
"flowise-components@1.1.0",
"flowise@1.0.1",
"flowise@1.0.0",
"flowise-ui@1.0.0",
"flowise-components@1.0.0"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-69264.json"
}
}
],
"modified": "2026-10-28T02:30:49.906388529Z",
"provider": "osv",
"references": [
"https://github.com/FlowiseAI/Flowise/releases/tag/flowise@3.1.3",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/69xxx/CVE-2026-69264.json",
"https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-4j8x-x6v7-w9rq",
"https://nvd.nist.gov/vuln/detail/CVE-2026-69264",
"https://github.com/FlowiseAI/Flowise/commit/f4e2794f6a576b94578f2fdafbf49c2fb304626c",
"https://github.com/FlowiseAI/Flowise/pull/6499"
],
"provider_metadata": {
"cwe_ids": [
"CWE-94",
"CWE-95"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/69xxx/CVE-2026-69264.json"
}
},
"related_cves": [
{
"value": "CVE-2026-69264",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 518532,
"published_at": "2026-08-04T17:22:36.676+00:00"
}