Lopseg/cve-2026-33067
GitHub: Lopseg/cve-2026-33067
提供 Nuclei 模板,用于非破坏性地检测 Langflow ≤ 1.8.2 中因未授权公共构建端点直接传入 exec() 而导致的远程代码执行漏洞。
Stars: 0 | Forks: 0
# CVE-2026-33017 — Langflow 未授权 RCE Nuclei 模板
[](#)
[](#)
[](#)
用于检测 **CVE-2026-33017** 的 Nuclei 模板 — 这是 **Langflow ≤ 1.8.2** 中的一个未授权
远程代码执行漏洞,可通过公共 flow-build 端点触发:
```
POST /api/v1/build_public_tmp/{flow_id}/flow
```
存在漏洞的处理器接受攻击者控制的 `data` 流程图,并在构建图时
将 `data.nodes[].data.node.template.code.value` 直接传入 Python
`exec()` 中,且没有任何沙箱保护。修复方案(≥ 1.9.0)从处理器的函数签名中删除了
`data` 参数,因此已修补的构建版本会在 FastAPI 的验证层直接拒绝此类请求并返回 HTTP 422。
## 模板判定逻辑
该模板是**非破坏性**的。它会向一个**零 UUID** 的 flow ID 发送一个无害的 payload,因此即使在存在漏洞的主机上也无法触发 `exec()`。
它仅通过 HTTP 响应特征来区分存在漏洞的处理器和已修补的处理器。
| 阶段 | 请求 | 告知的信息 |
|------:|---------|-------------------|
| 1 | `GET /api/v1/version` | 确认目标是 Langflow 并提取其构建版本。 |
| 2 | 带有包含 `data` 字段和无效 `template.code.value` 的请求体发起 `POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow` | 路由判定如下。 |
阶段 2 的路由判定:
| 状态 | Body 包含 | 判定结果 |
|-------:|---------------|---------|
| `404` | `flow` / `public` | **存在漏洞** — 处理器接受了 `data`,随后因为 UUID 是伪造的导致查找失败。 |
| `200` | `job_id` / `build` / `task` | **存在漏洞** — 处理器接受了 `data` 并进入了构建路径。 |
| `5xx` | `exec` / `Component` / `traceback` | **存在漏洞** — 处理器在失败前已到达 exec 代码执行路径。 |
| `422` | `Field required` / `extra` / `data` | **已修补** — 处理器函数签名不再接受 `data`。 |
真实的 RCE 确认仍然需要 目标上存在一个真实的 **PUBLIC flow UUID** 以及一个 **带外交互回调**(DNS/HTTP)。此处故意不包含该步骤 — 此模板仅作为安全预检,用于决定运行主动漏洞利用是否有意义。
## 使用方法
单一主机:
```
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
```
从列表中批量扫描:
```
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
```
带有调试输出(查看原始请求/响应):
```
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
```
在运行前在本地验证模板:
```
nuclei -validate -t CVE-2026-33017.yaml
```
## 示例输出
存在漏洞的目标:
```
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
```
已修补的目标 — 不产生任何发现(422 响应不匹配任何规则)。
## 发现候选目标
用于发现 Langflow 主机的常见查询(请仅对您已被授权测试的资产使用):
- Shodan: `http.title:"Langflow"`
- FOFA: `app="Langflow"`
- Google: `intitle:"Langflow" inurl:"/flows"`
## 漏洞详情
- **CVE**: CVE-2026-33017
- **CWE**: CWE-94 (代码生成控制不当)
- **CVSS 3.1**: 9.3 — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`
- **受影响版本**: Langflow ≤ 1.8.2
- **修复版本**: Langflow ≥ 1.9.0
- **攻击向量**: 网络,未授权,无需用户交互
- **影响**: 以 Langflow 进程用户身份执行远程代码
### 根本原因 (简述)
在存在漏洞的构建版本中,公共处理器的声明大致如下:
```
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value reaches exec() in the
# Component build path
```
`data` 是攻击者可控的。修补后的处理器完全移除了该参数
并强制 `data=None`,这就是为什么在修补后的构建版本中,包含 `data` 请求体字段的请求会被拒绝并返回 422。
## 修复建议
1. 将 Langflow 升级至 **≥ 1.9.0**。
2. 如果无法立即升级,请在反向代理层面阻止对 `/api/v1/build_public_tmp/` 的访问。
3. 设置 `LANGFLOW_AUTO_LOGIN=False`,配置超级用户凭据,并轮换 `LANGFLOW_SECRET_KEY`。
4. 审计现有的 flow — `access_type=PUBLIC` 的 flow 是攻击者会在 URL 中瞄准的目标。
## 参考文献
- GitHub 安全公告:
- SonicWall 分析文章:
- 修补后的处理器源码:
## 法律与披露
发布此模板仅用于**防御性安全和授权测试**。在大多数司法管辖区,针对您不拥有或未获得明确书面测试许可的系统运行该模板是违法的,并且违反了平台的服务条款。
使用此模板即表示您同意:
- 您将仅扫描您拥有或被明确授权测试的资产(漏洞赏金范围、签署的渗透测试合同、内部资产清单)。
- 作者不对滥用行为负责。
- 本模板按“原样”提供,不提供任何保证。
## 作者
**lopseg** —
欢迎提交 Pull request 和 issue。
## 许可证
MIT
标签:AV绕过, CISA项目, CVE-2026-33017, CVSS 9.3, CWE-94, exec(), FastAPI, Google, Langflow, Maven, Nuclei, POC, Python, RCE, 无后门, 无服务器架构, 未授权访问, 模板, 漏洞验证, 编程工具, 网络安全, 远程代码执行, 逆向工具, 隐私保护