← Back to Feed CACHED · 2026-07-01 11:38:59 · CACHE_KEY CVE-2026-10134
CVE-2026-10134 · CWE-94 · Disclosed 2026-06-30

IBM Langflow OSS 1

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Unauth RCE in an internet-facing AI orchestrator. Vendor score is right. Patch before Friday, hunt now."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Discover exposed Langflow instances

Attacker enumerates internet-facing Langflow using Shodan/Censys/FOFA fingerprints (favicon hash, /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.
Conditions required:
  • Internet-reachable Langflow instance
  • Default HTTP(S) service exposed on 7860 or reverse-proxied
Where this breaks in practice:
  • Instances behind SSO reverse proxies with pre-auth enforcement are not directly reachable
  • Internal-only deployments require prior foothold
Detection/coverage: Shodan/Censys queries for langflow product string; GreyNoise tagging expected within days of PoC release.
STEP 02

Enumerate a PUBLIC flow_id

Attacker requests /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.
Conditions required:
  • At least one flow marked PUBLIC on the target
  • Anonymous read of the flows index
Where this breaks in practice:
  • Hardened deployments with zero public flows are not exploitable via path (B)
  • Some fronting proxies strip the /build_public_tmp route
Detection/coverage: Access log spike on /api/v1/flows from single source; low base rate makes this easy to alert on.
STEP 03

POST malicious build payload to unauth endpoint

Attacker sends 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.
Conditions required:
  • Endpoint reachable
  • Valid public flow_id from step 2
Where this breaks in practice:
  • 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
Detection/coverage: Signature IDs from March 2026 (CVE-2026-33017) will fire on this endpoint pattern; enable them.
STEP 04

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.
Conditions required:
  • Payload executes without sandboxing
  • Standard Python stdlib available (subprocess, socket)
Where this breaks in practice:
  • gVisor/Kata sandboxed containers narrow post-exploitation
  • Read-only rootfs limits persistence
Detection/coverage: EDR on the node will flag Python spawning /bin/sh, curl, wget, or reverse-shell syscalls.
STEP 05

Loot secrets, pivot, and mine

Historical Langflow campaigns (Flodrix botnet, cryptojacking) exfiltrate .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.
Conditions required:
  • Egress to attacker C2
  • Reachable IMDS/cloud metadata or mounted secrets
Where this breaks in practice:
  • IMDSv2 with hop-limit=1 blocks proxy-based token theft
  • Egress allow-lists restrict data exfil
Detection/coverage: Cloud audit logs for anomalous STS/AssumeRole; egress netflow to known cryptomining pools.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo 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 availabilityNo 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.
EPSSNot yet scored (freshly disclosed 2026-06-30). Expect rapid climb into the >0.90 / 99th percentile band consistent with prior Langflow CVEs.
KEV statusNot listed as of 2026-07-01. CISA added CVE-2026-33017 within days of active exploitation; expect the same trajectory here.
CVSS vectorCVSS: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 versionsIBM Langflow OSS 1.0.0 through 1.9.3 inclusive.
Fixed versionsIBM Langflow OSS 1.9.4 (per IBM Security Bulletin node/7277559). No distro backports — Langflow is a pip/Docker-installed application.
Exposure dataShodan historically shows ~7,000+ internet-facing Langflow instances during the March 2026 wave; Censys corroborates. Assume most have not been re-hardened.
Disclosure2026-06-30 via IBM Security Bulletin (Langflow OSS was acquired/absorbed under IBM branding).
ReporterCredited via IBM PSIRT bulletin; the underlying sink was first surfaced in the March 2026 Horizon3/Sysdig research on CVE-2026-33017.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.6/10)

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.

HIGH technical accuracy of the sink and endpoint
HIGH affected version range
MEDIUM in-the-wild exploitation timeline (extrapolated from -33017 precedent)

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:N is 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. Un-publish every PUBLIC flow — Query the flows table and set is_public=false for every row. This closes path (B) entirely and buys you the runway to patch cleanly.
  3. 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 (nginx location, HAProxy ACL, Cloudflare custom rule). This is a same-day mitigation independent of Langflow config.
  4. 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.
  5. 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.
  6. Hunt for post-exploitation IOCs — Grep webserver logs for POSTs to /api/v1/build_public_tmp/, look for python spawning sh, curl, wget, or outbound connections to known cryptomining pools, and check IMDS access anomalies. Preserve the pod filesystem before restart.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Treat this like CVE-2026-33017 round two. Under the noisgate mitigation SLA, CRITICAL means mitigate within 3 days — realistically, Monday morning you pull every Langflow instance behind an SSO reverse proxy, un-publish all PUBLIC flows, and add a WAF deny rule on /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

  1. IBM Security Bulletin (node/7277559)
  2. GHSA-vwmf-pq79-vjvx — Langflow unauth RCE advisory
  3. BitNinja — CVE-2026-10134 alert
  4. Sysdig TRT — CVE-2026-33017 weaponized in 20 hours (precedent)
  5. The Hacker News — Langflow flaw triggers attacks in 20 hours
  6. SecurityWeek — Langflow exploited hours after disclosure
  7. VentureBeat — 7,000 Langflow servers under attack
  8. SonicWall — Langflow AI code injection to RCE analysis
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.