Langflow: PythonREPLComponent executes unsandboxed Python code, enabling authenticated RCE and privilege escalation
What fixes it
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
Summary
Langflow's built-in Python interpreter components — PythonREPLComponent (Python Interpreter) and the legacy PythonREPLToolComponent (Python REPL Tool) — executed arbitrary user- or model-supplied Python code inside flows without effective sandboxing. Because the code ran in-process with the privileges of the Langflow service, any authenticated user who could edit and run a flow could achieve remote code execution and, from there, escalate privileges to superuser (e.g. by opening a database session and flipping is_superuser) or compromise the host.
This issue is fixed as of 1.10.1, with additional hardening through 1.12.3. See *Remediation* below.
Affected
- Package:
langflow(PyPI), and the underlyinglfxpackage that ships the component. - Vulnerable versions:
< 1.10.1. - Patched:
1.10.1(core fix). Upgrade to>= 1.12.3for the complete hardening series.
Details
The root cause is code injection (CWE-94/CWE-95): the component passed raw input to LangChain's PythonREPL, which is explicitly *not* a security sandbox.
Two distinct weaknesses existed before 1.10.1:
- Unrestricted builtins (default deployments).
get_globals()built theexecglobals from theglobal_importsallow-list but never set__builtins__. CPython'sexec()then auto-injected the fullbuiltinsmodule, leaving__import__,open,eval,execand the whole import machinery reachable regardless of the allow-list — e.g.__import__("os").system(...)or__import__("subprocess").check_output([...]). This made the "only modules in Global Imports can be used" guarantee false, and it applied even with the default configuration (allow_custom_components=True).
- No server-policy gate (locked-down deployments). Even a deployment hardened with
allow_custom_components=Falsecould still run interpreter code, because the components did not consult that policy before executing.
Both let an authenticated user run the reported PoC, which opens a DB session and sets is_superuser = True on their account, or writes to the filesystem / runs OS commands with the service's privileges.
PoC (as reported)
- Authenticate as a normal user.
- Create a flow with the
PythonREPLComponent. - Execute Python that imports Langflow internals and elevates the account:
import asyncio
from sqlmodel import select
from langflow.services.database.models.user.model import User
from langflow.services.deps import session_scope
async def escalate():
async with session_scope() as session:
stmt = select(User).where(User.username == 'testuser')
user = (await session.exec(stmt)).first()
if user:
user.is_superuser = True
session.add(user)
await session.commit()
asyncio.run(escalate())Impact
Any authenticated user could:
- Execute arbitrary Python / OS commands with the Langflow service's privileges (RCE).
- Escalate their own account to superuser via direct database access.
- Read/modify data and configuration, and potentially pivot to the underlying host.
Remediation
Upgrade to Langflow 1.10.1 or later (preferably >= 1.12.3). The interpreter components were hardened with layered, defense-in-depth controls, applied in run_python_repl() before any code is executed:
- Restricted builtins —
get_globals()injects a curatedsafe_builtins()mapping, removing__import__,eval,exec,compile,open,input,globals/locals/vars,getattr/setattr, etc. (#13397) - AST validation —
validate_code_safety()rejects inlineimport/from ... import, dunder/escape-gadget attribute access (__class__,__subclasses__,__globals__, frame/traceback introspection) and format-string dunder traversal. (#13397) - Server-policy gate —
ensure_code_execution_enabled()refuses to run whenallow_custom_components=Falseorblock_code_interpreter_components=True, and fails closed if the settings stack cannot be resolved. (#13700 — this advisory — and #14375) - Allow-listed module proxies — imported modules are exposed via a proxy that blocks reaching
sys.modules["os"]through a module's transitive import graph. (#15198) - Optional hardware isolation — configure
LANGFLOW_SANDBOX_BACKENDto run interpreter code in an isolated microVM instead of in-process. (#14400)
Upstream fix references: #13397, #13700 (carries this GHSA), #14375, #14400, #15198.
Hardening recommendations for operators
- Keep Langflow updated (>= 1.12.3).
- For locked-down deployments, set
LANGFLOW_ALLOW_CUSTOM_COMPONENTS=false(orLANGFLOW_BLOCK_CODE_INTERPRETER_COMPONENTS=true) to disable the interpreter entirely. - For deployments that must run untrusted code, configure
LANGFLOW_SANDBOX_BACKENDfor microVM isolation. - Run the Langflow service as an unprivileged user with least-privilege database credentials.
Text from GitHub Advisory Database
Affected versions 53
- langflow, pip< 1.10.1GitHub
- Langflow OSSaffected: 1.0.0 through 1.9.3CVE List
- langflow, PyPIfrom first release, fixed in 1.10.1OSV
- langflow, PyPI0.0.31OSV
- langflow, PyPI0.0.32OSV
- langflow, PyPI0.0.33OSV
- langflow, PyPI0.0.40OSV
- langflow, PyPI0.0.44OSV
- langflow, PyPI0.0.45OSV
- langflow, PyPI0.0.46OSV
- langflow, PyPI0.0.52OSV
- langflow, PyPI0.0.53OSV
- langflow, PyPI0.0.54OSV
- langflow, PyPI0.0.55OSV
- langflow, PyPI0.0.56OSV
- langflow, PyPI0.0.57OSV
- langflow, PyPI0.0.58OSV
- langflow, PyPI0.0.61OSV
- langflow, PyPI0.0.62OSV
- langflow, PyPI0.0.63OSV
- langflow, PyPI0.0.64OSV
- langflow, PyPI0.0.65OSV
- langflow, PyPI0.0.66OSV
- langflow, PyPI0.0.67OSV
- langflow, PyPI0.0.68OSV
- langflow, PyPI0.0.69OSV
- langflow, PyPI0.0.70OSV
- langflow, PyPI0.0.71OSV
- langflow, PyPI0.0.72OSV
- langflow, PyPI0.0.73OSV
- langflow, PyPI0.0.74OSV
- langflow, PyPI0.0.75OSV
- langflow, PyPI0.0.76OSV
- langflow, PyPI0.0.78OSV
- langflow, PyPI0.0.79OSV
- langflow, PyPI0.0.80OSV
- langflow, PyPI0.0.81OSV
- langflow, PyPI0.0.83OSV
- langflow, PyPI0.0.84OSV
- langflow, PyPI0.0.85OSV
- langflow, PyPI0.0.86OSV
- langflow, PyPI0.0.87OSV
- langflow, PyPI0.0.88OSV
- langflow, PyPI0.0.89OSV
- langflow, PyPI0.1.0OSV
- langflow, PyPI0.1.2OSV
- langflow, PyPI0.1.3OSV
- langflow, PyPI0.1.4OSV
- langflow, PyPI0.1.5OSV
- langflow, PyPI0.1.6OSV
- langflow, PyPI0.1.7OSV
- langflow, PyPI0.2.0OSV
- langflow, PyPI0.2.1OSV
References 7
- github.com/langflow-ai/langflow/commit/2754c84aad1306f463db1c3bbb3e8ffbe85da77dFixvia GitHub
- github.com/langflow-ai/langflow/releases/tag/v1.10.1Fixvia GitHub
- ibm.com/support/pages/node/7277242Fixvia CVE List
- github.com/langflow-ai/langflow/security/advisories/GHSA-8qpj-27x8-pwpqAdvisoryvia GitHub
- github.com/advisories/GHSA-8qpj-27x8-pwpqAdvisoryvia GitHub
- nvd.nist.gov/vuln/detail/CVE-2026-10561Referencevia GitHub
- github.com/langflow-ai/langflow/pull/13700Referencevia GitHub