The Langflow public-flow endpoint hands attackers a Python interpreter with no login prompt
CVE-2026-10134 is an unauthenticated remote code execution flaw in IBM Langflow OSS versions 1.0.0 through 1.9.3. The PythonCodeStructuredTool component executes attacker-controlled Python via exec(self.tool_code, globals(), local_namespace) at flow-build time. Two paths reach the sink: (A) an authenticated POST /api/v1/build/{flow_id}/flow with a session token, and (B) — the dangerous one — POST /api/v1/build_public_tmp/{flow_id}/flow, which accepts builds without any Authorization header once a flow is marked PUBLIC. The result: a single unauthenticated HTTP request yields code execution as the Langflow process user, in the container/host it runs on.
The vendor's CRITICAL / 10.0 with vector AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H is accurate and, if anything, understated by the base metrics. This is a near-identical repeat of the March 2026 Langflow story (CVE-2026-33017), which Sysdig observed being weaponized within 20 hours of disclosure, with ~7,000 exposed instances scanned. Langflow's target audience — data/ML teams standing up agentic RAG pipelines — routinely exposes it directly to the internet with default configs. No downgrade is warranted.
5 steps from start to impact.
Discover exposed Langflow instances
/health response, static asset paths). Post-CVE-2026-33017, mass-scanning infrastructure and fingerprints for Langflow are already commoditized. Expect the same botnets to pivot to the new endpoint within hours.- Internet-reachable Langflow instance
- Default HTTP(S) service exposed on 7860 or reverse-proxied
- Instances behind SSO reverse proxies with pre-auth enforcement are not directly reachable
- Internal-only deployments require prior foothold
langflow product string; GreyNoise tagging expected within days of PoC release.Enumerate a PUBLIC flow_id
/api/v1/flows/public (or crawls the UI) to obtain a flow_id for any flow marked public. On default installs, tutorial/demo flows are frequently published as PUBLIC. Tools like httpx + ffuf will enumerate this in seconds.- At least one flow marked PUBLIC on the target
- Anonymous read of the flows index
- Hardened deployments with zero public flows are not exploitable via path (B)
- Some fronting proxies strip the
/build_public_tmproute
/api/v1/flows from single source; low base rate makes this easy to alert on.POST malicious build payload to unauth endpoint
POST /api/v1/build_public_tmp/{flow_id}/flow with a JSON body containing a PythonCodeStructuredTool node whose tool_code is arbitrary Python. Curl one-liner is enough — no auth, no CSRF token. Public exploit generators (Nuclei template, Python one-shot on GitHub) are the expected weaponization.- Endpoint reachable
- Valid public flow_id from step 2
- WAF rules from CVE-2026-33017 signatures (Cloudflare, F5 iRules, SonicWall) may block naive payloads
- Egress-restricted containers make reverse shell staging harder but not impossible
Achieve RCE as Langflow process user
exec() runs the payload with the privileges of the Langflow service account. In most deployments this is a container user, but the container typically has network egress, mounted secrets (OpenAI/Anthropic/Bedrock API keys, vector DB creds, S3 keys), and often the Docker socket or Kubernetes service-account token.- Payload executes without sandboxing
- Standard Python stdlib available (subprocess, socket)
- gVisor/Kata sandboxed containers narrow post-exploitation
- Read-only rootfs limits persistence
/bin/sh, curl, wget, or reverse-shell syscalls.Loot secrets, pivot, and mine
.env, IMDS creds, LLM API keys (high-dollar resale value on abuse markets), and connected vector DB/S3 credentials. From a Kubernetes pod, the mounted service-account token often permits lateral movement to other workloads. Coin miners and Tsunami/Kaiten variants have been the follow-on payloads in prior Langflow waves.- Egress to attacker C2
- Reachable IMDS/cloud metadata or mounted secrets
- IMDSv2 with hop-limit=1 blocks proxy-based token theft
- Egress allow-lists restrict data exfil
The supporting signals.
| In-the-wild status | No confirmed ITW for -10134 yet as of 2026-07-01, but this is a near-clone of CVE-2026-33017 which was weaponized within 20 hours of disclosure (Sysdig TRT). Assume days-to-exploit is measured in hours. |
|---|---|
| PoC availability | No public PoC repo for -10134 at time of writing; the vendor advisory itself contains sink function and endpoint path — enough for competent attackers to reproduce trivially. Nuclei template highly likely within 72h. |
| EPSS | Not yet scored (freshly disclosed 2026-06-30). Expect rapid climb into the >0.90 / 99th percentile band consistent with prior Langflow CVEs. |
| KEV status | Not listed as of 2026-07-01. CISA added CVE-2026-33017 within days of active exploitation; expect the same trajectory here. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — network reachable, no auth, no user interaction, changed scope, full CIA impact. Textbook 10.0. |
| Affected versions | IBM Langflow OSS 1.0.0 through 1.9.3 inclusive. |
| Fixed versions | IBM Langflow OSS 1.9.4 (per IBM Security Bulletin node/7277559). No distro backports — Langflow is a pip/Docker-installed application. |
| Exposure data | Shodan historically shows ~7,000+ internet-facing Langflow instances during the March 2026 wave; Censys corroborates. Assume most have not been re-hardened. |
| Disclosure | 2026-06-30 via IBM Security Bulletin (Langflow OSS was acquired/absorbed under IBM branding). |
| Reporter | Credited via IBM PSIRT bulletin; the underlying sink was first surfaced in the March 2026 Horizon3/Sysdig research on CVE-2026-33017. |
noisgate verdict.
This is unauthenticated, network-reachable, single-request RCE in a product class (AI agent orchestrators) that is routinely stood up on public IPs by data-science teams outside the standard change window. The single decisive factor is zero-auth network RCE in a product with documented public exposure and a fresh precedent (CVE-2026-33017) of 20-hour weaponization.
Why this verdict
- Zero prerequisites — path (B) requires no session token, no user interaction, no local access. Vendor CVSS
AV:N/AC:L/PR:N/UI:Nis accurate. - Role multiplier — agent orchestrator with mounted secrets: Langflow's deployment role IS the high-value role. Instances routinely hold LLM API keys, vector DB creds, cloud IAM credentials, and Kubernetes service-account tokens. Chain outcome = credential looting + lateral pivot; blast radius = tenant-scale minimum, cloud-account-scale realistically.
- Precedent: CVE-2026-33017 (March 2026) was the same product, same class of bug, exploited in 20 hours, KEV-listed, and ~7,000 instances were mass-scanned. Baseline population of exposed instances is not hypothetical.
- No friction floor: even if only 10% of installs mark a flow PUBLIC, the vendor default demo flows are frequently public, and path (A) still works against any authenticated attacker — a broad category on multi-tenant Langflow-as-a-service.
- No compensating vendor control: no built-in sandboxing on
PythonCodeStructuredTool; the design intent of the component is to execute code, so a partial fix is impossible.
Why not higher?
Score is 9.6, not a raw 10.0, because path (B) requires at least one PUBLIC flow to exist on the target — a small but real filter. Hardened deployments with zero public flows require path (A), which adds an authenticated-user prerequisite. This is a rounding-error downgrade, not a real one.
Why not lower?
Downgrading to HIGH would require either meaningful auth requirements (there are none on path B), a narrow affected version range (there isn't — 1.0.0 through 1.9.3 is the entire modern product line), or evidence of low exposure (Shodan disagrees). The prior -33017 wave demonstrated all three of those excuses are wrong for this product class.
What to do — in priority order.
- Take Langflow off the public internet immediately — Front it with an SSO reverse proxy (Cloudflare Access, Tailscale, Pomerium, oauth2-proxy) that enforces authentication BEFORE any request reaches Langflow. Do this within the noisgate CRITICAL 3-day mitigation SLA — realistically today.
- Un-publish every PUBLIC flow — Query the flows table and set
is_public=falsefor every row. This closes path (B) entirely and buys you the runway to patch cleanly. - Block
/api/v1/build_public_tmp/at the WAF/ingress — Add a deny rule on the exact path prefix at your reverse proxy or WAF (nginxlocation, HAProxy ACL, Cloudflare custom rule). This is a same-day mitigation independent of Langflow config. - Upgrade to Langflow 1.9.4+ — The actual remediation. Deploy within the noisgate CRITICAL 90-day remediation SLA, but treat this as a 7-day target given the -33017 precedent.
- Rotate every secret Langflow could reach — Assume compromise. Rotate LLM API keys, vector DB creds, cloud IAM keys, and any Kubernetes service-account tokens mounted into the Langflow pod. Do this in parallel with the mitigation.
- Hunt for post-exploitation IOCs — Grep webserver logs for POSTs to
/api/v1/build_public_tmp/, look for python spawningsh,curl,wget, or outbound connections to known cryptomining pools, and check IMDS access anomalies. Preserve the pod filesystem before restart.
- Network-level MFA in front of the app — doesn't help if MFA is enforced at the UI but the API path is direct.
- EDR alone — Python interpreters running arbitrary code is Langflow's normal behavior; EDR will not distinguish attacker payloads from legitimate flows without tuning.
- Rate-limiting — one request is enough for full RCE.
- Container isolation without egress restriction — the process user gets code exec regardless; if the container has network egress and mounted secrets, isolation only slows lateral movement.
Crowdsourced verification payload.
Run on the Langflow host or container (or an auditor workstation with HTTP access to the target). Invoke as ./check-cve-2026-10134.sh https://langflow.internal.example.com. Requires only curl and jq; no privileges needed beyond network reach to the target.
#!/usr/bin/env bash
# noisgate check for CVE-2026-10134 — Langflow unauth RCE
# Usage: ./check-cve-2026-10134.sh <base_url>
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "Usage: $0 <langflow_base_url>" >&2
exit 2
fi
# Strip trailing slash
TARGET="${TARGET%/}"
# 1. Fetch version banner
VER_JSON=$(curl -sk --max-time 10 "$TARGET/api/v1/version" 2>/dev/null || true)
VERSION=$(echo "$VER_JSON" | jq -r '.version // empty' 2>/dev/null)
if [[ -z "$VERSION" ]]; then
echo "UNKNOWN: could not read /api/v1/version from $TARGET"
exit 3
fi
echo "Detected Langflow version: $VERSION"
# 2. Version comparison — vulnerable if 1.0.0 <= v <= 1.9.3
vuln_range() {
local v="$1"
# Compare using sort -V
local low="1.0.0" high="1.9.3"
if [[ "$(printf '%s\n' "$low" "$v" | sort -V | head -n1)" == "$low" ]] && \
[[ "$(printf '%s\n' "$v" "$high" | sort -V | tail -n1)" == "$high" ]]; then
return 0
fi
return 1
}
# 3. Probe the vulnerable endpoint (safe probe — no exec payload)
HTTP_CODE=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 10 \
-X POST "$TARGET/api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow" \
-H 'Content-Type: application/json' -d '{}' 2>/dev/null || echo "000")
echo "build_public_tmp probe HTTP status: $HTTP_CODE"
if vuln_range "$VERSION"; then
# Endpoint reachable if not 404/403/401
if [[ "$HTTP_CODE" != "404" && "$HTTP_CODE" != "403" && "$HTTP_CODE" != "401" && "$HTTP_CODE" != "000" ]]; then
echo "VULNERABLE: version $VERSION in affected range AND unauth endpoint reachable"
exit 1
else
echo "VULNERABLE: version $VERSION in affected range (endpoint filtered upstream but code is present — patch anyway)"
exit 1
fi
fi
echo "PATCHED: version $VERSION is outside affected range 1.0.0-1.9.3"
exit 0
If you remember one thing.
/api/v1/build_public_tmp/. Under the noisgate remediation SLA, upgrade to Langflow 1.9.4 within 90 days, but given the 20-hour weaponization precedent on the prior CVE, target a 7-day patch window. In parallel, rotate every credential the Langflow process could touch (LLM keys, cloud IAM, vector DB, K8s SA tokens) and hunt logs for POSTs to the vulnerable endpoint since 2026-06-30. If any Langflow instance was internet-facing during that window without the WAF rule, assume compromise until proven otherwise.Sources
- IBM Security Bulletin (node/7277559)
- GHSA-vwmf-pq79-vjvx — Langflow unauth RCE advisory
- BitNinja — CVE-2026-10134 alert
- Sysdig TRT — CVE-2026-33017 weaponized in 20 hours (precedent)
- The Hacker News — Langflow flaw triggers attacks in 20 hours
- SecurityWeek — Langflow exploited hours after disclosure
- VentureBeat — 7,000 Langflow servers under attack
- SonicWall — Langflow AI code injection to RCE analysis
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.