用于检测 CVE-2026-33017 的 Nuclei 模板——这是 Langflow ≤ 1.8.2 中存在的一个未认证远程代码执行漏洞,可通过公共 flow 构建端点访问:
POST /api/v1/build_public_tmp/{flow_id}/flow
存在漏洞的处理程序接受攻击者控制的 data 流程(flow)图,并在图构建期间将 data.nodes[].data.node.template.code.value 直接传入 Python exec(),且没有沙箱隔离。修复版本(≥ 1.9.0)将该 data 参数从处理程序签名中移除,因此已修补的构建会在 FastAPI 的校验层以 HTTP 422 拒绝同一请求。
该模板是非破坏性的。它针对一个全零 UUID 的 flow ID 发送惰性(inert)载荷,因此在易受攻击的主机上也无法触达 exec()。它仅通过 HTTP 响应特征来区分存在漏洞的处理程序与已修补的处理程序。
| 阶段 | 请求 | 结果说明 |
|---|---|---|
| 1 | GET /api/v1/version | 确认目标是 Langflow 并提取构建版本。 |
| 2 | POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000000/flow,请求体包含 字段以及一个惰性的 |
阶段 2 的路由判定:
真正的 RCE 确认仍然需要 (a) 目标上存在一个真实的公共 flow UUID,以及 (b) 一个带外回调(DNS/HTTP)。该步骤有意未包含在此模板中——此模板是安全预检查,用于判断运行主动利用是否有意义。
单主机扫描:
nuclei -t CVE-2026-33017.yaml -u https://target.example.com
从列表批量扫描:
nuclei -t CVE-2026-33017.yaml -l targets.txt -rl 20 -c 10
带调试输出(查看原始请求/响应):
nuclei -t CVE-2026-33017.yaml -u https://target.example.com -debug-req -debug-resp
运行前在本地校验模板:
nuclei -validate -t CVE-2026-33017.yaml
存在漏洞的目标:
[CVE-2026-33017] [http] [critical] https://target.example.com [vulnerable-flow-not-found] ["1.8.2","base"]
已修补的目标——不产生任何发现(422 响应不匹配任何规则)。
Langflow 主机的常见发现查询(仅可用于你有权测试的资产):
http.title:"Langflow"app="Langflow"intitle:"Langflow" inurl:"/flows"AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H在存在漏洞的构建中,公共处理程序大致声明如下:
@router.post("/build_public_tmp/{flow_id}/flow")
async def build_public_flow(flow_id: UUID, data: FlowDataRequest | None = None, ...):
...
await verify_public_flow_and_get_user(flow_id, ...)
...
# data.nodes[].data.node.template.code.value 在
# Component 构建路径中传入 exec()
data 由攻击者控制。已修补的处理程序将该参数完全移除并强制 data=None,这就是为什么在已修补的构建中,包含 data 主体字段的请求会被以 422 拒绝。
/api/v1/build_public_tmp/。LANGFLOW_AUTO_LOGIN=False,配置超级用户凭据,并轮换 LANGFLOW_SECRET_KEY。access_type=PUBLIC 的流程正是攻击者在 URL 中会针对的目标。本模板发布仅用于防御性安全及授权测试。在大多数司法管辖区,针对你不拥有或没有明确书面许可的系统运行该模板属于违法行为,并且违反平台服务条款。
使用本模板即表示你同意:
lopseg — https://github.com/lopseg
欢迎提交 Pull Request 和 issue。
MIT
datatemplate.code.value| 路由判定见下表。 |
| 状态 | 响应体包含 | 判定 |
|---|
404 | flow / public | 存在漏洞(VULNERABLE) —— 处理程序接受了 data,随后因 UUID 是伪造的而查找失败。 |
200 | job_id / build / task | 存在漏洞(VULNERABLE) —— 处理程序接受了 data 并进入构建路径。 |
5xx | exec / Component / traceback | 存在漏洞(VULNERABLE) —— 处理程序在失败前已到达 exec 代码路径。 |
422 | Field required / extra / data | 已修补(PATCHED) —— 处理程序签名不再接受 data。 |