摘要
Langflow OSS 是一款开源的可视化 AI 工作流构建平台。在 1.0.0 至 1.10.1 版本中,其公共流构建端点 POST /api/v1/build_public_tmp/{flow_id}/flow 依赖一份不完整的组件黑名单来阻止危险代码执行。由于黑名单遗漏了 CSVAgent 等具备服务端 Python 执行能力的 Agent 组件,已认证用户可预先配置一个公共流,随后任意未认证攻击者仅需触发该流的构建即可在 Langflow 服务进程中执行任意 Python 代码,导致远程代码执行(RCE)。
该漏洞编号为 CVE-2026-13448,影响 Langflow OSS 1.0.0 至 1.10.1 版本,已在 1.10.2 版本中修复。源报告未提供 CVSS 评分或严重等级。
漏洞根因
Langflow 允许将工作流(flow)的访问类型设置为 PUBLIC,使其他用户无需认证即可触发该流的构建与执行。为防止公共流执行危险代码,Langflow 在公共构建路径上部署了校验函数 validate_public_flow_no_code_execution()(定义于 src/lfx/src/lfx/utils/flow_validation.py,由 src/backend/base/langflow/api/v1/chat.py 调用)。该校验采用黑名单机制,阻止公共流中包含已知的代码执行组件。
然而,该黑名单仅覆盖以下组件:
- 代码执行类:PythonREPLComponent、PythonREPLTool、PythonCodeStructuredTool、Smart Transform
- 流引用类:RunFlow、SubFlow、FlowTool
黑名单遗漏了多个同样能够在服务端执行任意 Python 代码的 Agent 组件,其中包括 CSVAgent。CSVAgent 基于 langchain_experimental 包实现,内部使用 PythonAstREPLTool,当其 allow_dangerous_code 参数设为 True 时,可在 Langflow 服务进程中执行 Python 代码。此外,CodeActAgentSmolagents 和 OpenDsStarAgent 同样不在黑名单之列,但据源报告所述,这两个组件的运行时依赖未包含在官方镜像中,因此未在已演示的攻击链中使用。
攻击链与前置条件
该攻击分为两个阶段:流配置阶段与触发阶段。
流配置阶段(需认证): 一个持有合法 Langflow 账户的用户创建一个工作流,其中包含两个关键组件——一是 OpenAIModel 组件,其 openai_api_base 参数指向攻击者控制的 OpenAI 兼容端点;二是 CSVAgent 组件,设置 agent_type 为 zero-shot-react-description 并启用 allow_dangerous_code=True。随后为 CSVAgent 上传一个小型 CSV 文件,并将该流的访问类型设为 PUBLIC。
触发阶段(无需认证): 未认证攻击者向 POST /api/v1/build_public_tmp/{flow_id}/flow 发送请求。由于 CSVAgent 不在黑名单中,公共构建校验予以放行。在构建过程中,CSVAgent 向攻击者控制的伪 LLM 端点发送请求,该端点返回一个 ReAct 步骤,指定动作为 python_repl_ast,动作输入为任意 Python 代码。PythonAstREPLTool 随即在 Langflow 服务进程内执行该代码,实现远程代码执行。
该攻击链的前置条件包括:攻击者需拥有一个合法 Langflow 账户以完成流配置,但漏洞触发请求本身无需任何认证;攻击者需运营一个 Langflow 服务可达的 OpenAI 兼容 LLM 端点;流中需上传 CSV 文件并设为 PUBLIC 访问类型;langchain_experimental 包需在 Langflow 安装环境中可用。
影响范围
受影响版本为 Langflow OSS 1.0.0 至 1.10.1(对应 Docker Hub 标签 langflowai/langflow:1.0.0 至 1.10.1,GitHub 标签 v1.0.0 至 v1.10.1)。源报告仅说明了版本范围的两端,未逐一列举其间各中间发布版本。
该漏洞的核心影响为未认证远程代码执行:当未认证的公共构建请求被触发时,任意 Python 代码在 Langflow 服务进程或容器内执行,以 Langflow 服务账户的权限运行,可导致服务端完全沦陷。攻击链中唯一需要认证的环节是初始的流配置;漏洞触发请求本身不携带任何认证信息。
检测与处置
检测方面,建议采取以下措施:
- 监控对
POST /api/v1/build_public_tmp/{flow_id}/flow端点的未认证请求(即不携带Authorization头的请求),此类请求可能表明攻击者正在尝试触发公共流构建。 - 在已升级至 1.10.2 的环境中,被拒绝的公共流构建请求将返回 HTTP 4xx 状态码,并提示代码执行组件不被允许或抛出
PublicFlowValidationError。可针对此类拒绝事件设置告警,以检测利用尝试。 - 审计现有
PUBLIC流中是否包含未被旧版黑名单覆盖的 Agent 组件,如 CSVAgent、CodeActAgentSmolagents、OpenDsStarAgent 等。 - 监控 Langflow 服务进程的出站连接,关注指向非标准 OpenAI 兼容 API 端点的异常连接,这可能表明攻击者正通过伪 LLM 驱动代码执行。
处置方面,建议采取以下措施:
- 升级至 Langflow 1.10.2。在该版本中,包含代码执行组件的公共流将在任何组件执行之前被
PublicFlowValidationError拒绝。 - 若无法立即升级,应限制对
/api/v1/build_public_tmp/端点的网络访问,并禁用或严格审计PUBLIC流。 - 审查并收紧流校验黑名单,确保覆盖所有具备服务端代码执行能力的 Agent 组件,而非仅限原有清单中的条目。