Langflow公开分享Flow功能无需认证,攻击者可注入任意Python代码执行,14万+GitHub星项目受影响,可导致服务器完全失陷。
Langflow 中存在一个漏洞,允许未经授权的远程代码执行(RCE)。
该漏洞源于一项功能——允许用户在不登录的情况下运行共享流程。该端点接收攻击者提供的流程数据且未做任何验证,直接执行其中包含的代码——这意味着攻击者可以在无需任何身份验证的情况下在服务器上执行任意代码。
Langflow 是一个开源工具,用于通过连接聊天输入、模型调用、文档检索、API 请求和输出显示等模块来可视化构建 AI 工作流。
此漏洞影响那些将流程公开暴露的 Langflow 部署。运行公开流程无需身份验证,因此攻击者只需要目标流程的标识符就能在服务器上执行任意代码——这可能导致完整的系统沦陷。
Langflow 有一个公开流程功能,允许其他人在不登录的情况下运行工作流——设计初衷是为了对外展示 Demo 或聊天机器人。就其本身而言,这是一个合法的设计。
其背后的端点:
POST /api/v1/build_public_tmp/{flow_id}/flow
该端点故意不进行身份验证。问题在于,请求还接受一个可选的 data 参数。
正确的方式是,运行公开流程应该只加载和执行存储在数据库中的流程定义。调用方可以说"运行这个流程",但不能决定流程的实际内容。
然而,当请求中存在 data 参数时,端点会使用请求体中的值,而不是数据库中的值。原本意味着"运行这个 flow_id"的请求,实际上变成了"运行这个 flow_id,但用我此刻发送的数据替换实际执行的内容"。

Langflow 的流程数据由节点(组件)组织而成,每个节点都可以通过自定义组件功能嵌入 Python 代码片段。这使得攻击者可以在 data 参数中夹带一个包含任意 Python 代码的节点。

build_public_tmp() — 端点处理函数;无身份验证检查,原样接收 data。
create_graph() — 本应强制"公开流程只从数据库读取",但如果 data 存在,它会从攻击者提供的数据构建图。
eval_custom_component_code() — 提取并执行每个节点的 Python 代码,将攻击者注入的片段视为合法的节点代码。
prepare_global_scope() → exec() — 提取的代码直接传给 exec()。无沙箱、无输入验证、无白名单。进入 exec() 的代码以服务器进程相同的权限运行。
核心问题不在于某个单一的 bug 函数——而是一条被打破的信任边界。build_public_tmp → create_graph 本应假定"此请求未经过身份验证,因此只信任数据库中的值",而 data 参数打破了这个假定。eval_custom_component_code 和 exec() 被设计为处理已可信的流程数据,因此两者都没有独立的验证逻辑。
因此,GitHub 安全公告的修复并没有尝试为 exec() 加沙箱——而是完全从端点中移除了 data 参数,强制公开流程只能走 build_graph_from_db() 路径。修复的核心思路是防止危险代码进入执行路径,而不是等它已经在那儿了再去拦截。
目标实例上至少要有一个公开流程(这在 Demo 或聊天机器人部署中很常见)
或者,如果默认的 AUTO_LOGIN=true 是开启的,攻击者可以通过未认证的自动登录路径直接创建一个公开流程
公开流程的 UUID(通常在分享链接中暴露,很容易获取)
无需任何凭据
升级到 Langflow 1.9.0+ — 唯一经过验证的修复方案。(部分报告声称存在一个过渡性的 1.8.x 补丁,但复现测试表明该版本仍可被利用。)
如果无法立即升级:禁用公开流程功能,或除非必要否则不要使用;检查 AUTO_LOGIN 默认值并在不必要时将其禁用;不要将 Langflow API 直接暴露在公网——将其置于带身份验证的代理或防火墙之后;添加 WAF/代理规则,检测并阻止包含 data 参数的 build_public_tmp 请求
禁用公开流程功能,或除非必要否则不要使用
检查 AUTO_LOGIN 默认值并在不必要时将其禁用
不要将 Langflow API 直接暴露在公网——将其置于带身份验证的代理或防火墙之后
添加 WAF/代理规则,检测并阻止包含 data 参数的 build_public_tmp 请求