A critical IDOR vulnerability (CVSS 9.9) in Langflow's /api/v1/responses endpoint allows any authenticated user to execute flows owned by other users by simply supplying the victim's flow UUID in the request payload — no additional privileges required beyond a valid account. The scope-change flag in the CVSS vector (S:C) signals cross-tenant blast radius: in any multi-tenant Langflow deployment, every user's proprietary AI workflows, processed data, and LLM API budget are exposed to every authenticated peer. No public exploit code has been released and the vulnerability is absent from CISA KEV, but the documented PoC is a single curl command — trivial for any developer-level attacker. Upgrade to Langflow 1.9.1 immediately; if patching is blocked, lock /api/v1/responses to single-tenant or trusted-IP access via your reverse proxy as an interim control.
What is the risk?
Critical exposure in multi-tenant deployments. CVSS 9.9 with Scope Changed means exploitation crosses security boundaries beyond the attacker's own account. Attack Complexity is Low and only Low Privileges (any valid account) are required — near-zero-friction exploitation. The PoC is fully documented in the public security advisory. Although no confirmed in-the-wild exploitation exists, Langflow is widely deployed in enterprise AI orchestration contexts, and agentic flows with tool access (database queries, API calls, file I/O) compound the impact dramatically. Self-hosted single-tenant instances face limited exposure; any shared-platform deployment is fully compromised at the authorization layer.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Langflow | pip | < 1.9.1 | 1.9.1 |
Do you use Langflow? You're affected.
How severe is it?
What is the attack surface?
What should I do?
5 steps-
PATCH IMMEDIATELY
Upgrade to Langflow 1.9.1 — the fix enforces user ownership checks on both UUID and endpoint_name lookup branches, returning 404 (not 403) to avoid flow existence disclosure.
-
INTERIM WORKAROUND
If patching is blocked, restrict /api/v1/responses and /api/v2/workflow to single-tenant deployments or allowlisted IP ranges via reverse proxy deny rules.
-
DETECT
Audit API access logs for /api/v1/responses requests where the authenticated user ID does not match the owner of the referenced flow UUID; alert on any cross-user flow execution pattern.
-
AUDIT
Enumerate all flows and cross-reference execution logs to identify historical unauthorized access prior to patching.
-
ROTATE CREDENTIALS
If any victim flow invoked external services (LLM APIs, databases, cloud resources), rotate those credentials as a precaution.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-55255?
A critical IDOR vulnerability (CVSS 9.9) in Langflow's /api/v1/responses endpoint allows any authenticated user to execute flows owned by other users by simply supplying the victim's flow UUID in the request payload — no additional privileges required beyond a valid account. The scope-change flag in the CVSS vector (S:C) signals cross-tenant blast radius: in any multi-tenant Langflow deployment, every user's proprietary AI workflows, processed data, and LLM API budget are exposed to every authenticated peer. No public exploit code has been released and the vulnerability is absent from CISA KEV, but the documented PoC is a single curl command — trivial for any developer-level attacker. Upgrade to Langflow 1.9.1 immediately; if patching is blocked, lock /api/v1/responses to single-tenant or trusted-IP access via your reverse proxy as an interim control.
Is CVE-2026-55255 actively exploited?
No confirmed active exploitation of CVE-2026-55255 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-55255?
1. PATCH IMMEDIATELY: Upgrade to Langflow 1.9.1 — the fix enforces user ownership checks on both UUID and endpoint_name lookup branches, returning 404 (not 403) to avoid flow existence disclosure. 2. INTERIM WORKAROUND: If patching is blocked, restrict /api/v1/responses and /api/v2/workflow to single-tenant deployments or allowlisted IP ranges via reverse proxy deny rules. 3. DETECT: Audit API access logs for /api/v1/responses requests where the authenticated user ID does not match the owner of the referenced flow UUID; alert on any cross-user flow execution pattern. 4. AUDIT: Enumerate all flows and cross-reference execution logs to identify historical unauthorized access prior to patching. 5. ROTATE CREDENTIALS: If any victim flow invoked external services (LLM APIs, databases, cloud resources), rotate those credentials as a precaution.
What systems are affected by CVE-2026-55255?
This vulnerability affects the following AI/ML architecture patterns: LLM orchestration platforms, agent frameworks, multi-tenant AI deployments, flow-based AI pipelines, agentic AI systems with tool access.
What is the CVSS score for CVE-2026-55255?
CVE-2026-55255 has a CVSS v3.1 base score of 9.9 (CRITICAL).
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0012 Valid Accounts AML.T0034 Cost Harvesting AML.T0040 AI Model Inference API Access AML.T0049 Exploit Public-Facing Application AML.T0053 AI Agent Tool Invocation Compliance Controls Affected
What are the technical details?
Original Advisory
## Summary Insecure Direct Object Reference (IDOR) vulnerability in `/api/v1/responses` endpoint allows an authenticated attacker to execute any flow belonging to another user by specifying the victim's flow ID in the request. ## Details The vulnerability exists in the `get_flow_by_id_or_endpoint_name` helper function in [`src/backend/base/langflow/helpers/flow.py` (lines 399-414)](https://github.com/langflow-ai/langflow/blob/v1.9.0/src/backend/base/langflow/helpers/flow.py#L399C1-L414C67). When a flow is accessed via UUID (flow_id), the function queries the database directly without verifying if the authenticated user owns that flow: ```python # src/backend/base/langflow/helpers/flow.py:399-414 async def get_flow_by_id_or_endpoint_name(flow_id_or_name: str, user_id: str | UUID | None = None) -> FlowRead: async with session_scope() as session: try: flow_id = UUID(flow_id_or_name) # When using UUID, query directly WITHOUT checking user_id flow = await session.get(Flow, flow_id) # ❌ No user_id check! except ValueError: endpoint_name = flow_id_or_name stmt = select(Flow).where(Flow.endpoint_name == endpoint_name) # Only when using endpoint_name is user_id checked if user_id: stmt = stmt.where(Flow.user_id == uuid_user_id) ``` This function is used by the `/api/v1/responses` endpoint (defined in [`src/backend/base/langflow/api/v1/openai_responses.py:589`](https://github.com/langflow-ai/langflow/blob/v1.9.0/src/backend/base/langflow/api/v1/openai_responses.py#L589)). ## PoC (Proof of Concept) ```bash # Attacker (user A) with API_KEY_A tries to execute victim (user B)'s flow curl -X POST "http://localhost:7860/api/v1/responses" \ -H "x-api-key: sk-ATTACKER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "VICTIM_FLOW_ID", "input_value": "test", "stream": false }' # Returns 200 and executes the victim's flow ``` ## Impact Any authenticated user can: 1. Execute any flow in the system by knowing its flow ID 2. Access potentially sensitive data processed by victim's flows 3. Consume victim's resources ## Fixes Fixed in **PR #12832** (`fix(security): close IDOR in get_flow_by_id_or_endpoint_name`), merged 2026-04-22, released in **Langflow 1.9.1**. The helper normalizes `user_id` once and enforces ownership on **both** lookup branches (UUID *and* `endpoint_name`): ```python flow_id = UUID(flow_id_or_name) flow = await session.get(Flow, flow_id) if flow is not None and uuid_user_id is not None and flow.user_id != uuid_user_id: flow = None # cross-user lookup falls through to the shared 404 ``` Key points: - Cross-user lookups return **404** (not 403), so flow existence is not disclosed via a 403-vs-404 oracle. - `/api/v1/responses` and `/api/v2/workflow` pass `user_id` explicitly, so fixing the helper closes them directly; the `/api/v1/run*` routes were additionally moved from a bare `Depends(get_flow_by_id_or_endpoint_name)` to auth-aware wrapper dependencies (defense in depth). - A malformed `user_id` now fails closed (404 instead of a raw 500). - Webhook routes intentionally keep the unscoped lookup (public by design / explicit ownership check elsewhere). - Regression tests cover the cross-user UUID case and reproduce the original PoC against `/api/v1/responses`. ## Acknowledgements Thanks to the security researchers who responsibly disclosed this vulnerability: * @yzeirnials * @johnatzeropath * @LeftenantZero * @Zwique
Exploitation Scenario
An attacker registers a low-privilege account on a shared enterprise Langflow deployment — or compromises an existing user account via phishing. They enumerate flow UUIDs through shared workspace features, exported flow files, network traffic observation in collaborative sessions, or sequential UUID guessing. Using their own valid API key, the attacker posts to /api/v1/responses with the victim's flow UUID as the 'model' parameter. The unpatched helper executes the flow without validating ownership and returns HTTP 200 with full output. For agentic flows connected to internal databases, S3 buckets, or customer CRM systems, the attacker gains transitive read/write access to all resources the victim's flow can reach — without ever directly authenticating to those downstream systems.
Weaknesses (CWE)
CWE-639 — Authorization Bypass Through User-Controlled Key: The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.
- [Architecture and Design] For each and every data access, ensure that the user has sufficient privilege to access the record that is being requested.
- [Architecture and Design, Implementation] Make sure that the key that is used in the lookup of a specific user's record is not controllable externally by the user or that any tampering can be detected.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:L References
Timeline
Related Vulnerabilities
CVE-2026-33309 9.9 langflow: Path Traversal enables file access
Same package: langflow CVE-2024-37014 9.8 Langflow: unauthenticated RCE via custom component API
Same package: langflow CVE-2026-27966 9.8 langflow: Code Injection enables RCE
Same package: langflow CVE-2026-33017 9.8 langflow: Code Injection enables RCE
Same package: langflow CVE-2024-42835 9.8 Langflow: Unauthenticated RCE via PythonCodeTool
Same package: langflow