介绍
n8n 是一个开源工作流程自动化平台,旨在通过可视化方式连接应用程序和服务,实现任务自动化。用户可以构建由节点组成的工作流程,每个节点代表一个操作,例如发出 API 请求、处理数据或发送电子邮件。n8n 经常用于自动化重复性操作任务以及集成安全工具和 SaaS 平台。以下是一个简单的示例工作流程,它允许我们安排向 NVD CVE API 发送 HTTP GET 请求,使用 JavaScript 格式化输出,然后通过电子邮件和 Slack 频道发送报告。

n8n 平台通常以三种主要配置进行部署:
自托管实例:组织将 n8n 部署在本地或私有云环境中,以实现完全控制和数据主权
云托管 (n8n.cloud):提供共享基础设施的托管服务
内部自动化工具:部署在企业网络内部,用于自动化内部和外部系统之间的业务流程
0.211.0 至 1.120.3 版本包含工作流表达式评估系统中的一个关键远程代码执行 (RCE) 漏洞。如果被利用,此漏洞允许经过身份验证的攻击者执行系统级命令,可能导致数据泄露、服务中断或系统完全被攻陷,所有操作都将以 n8n 进程的权限执行。
我们将讨论此漏洞的技术细节,演示如何通过 Web 浏览器进行漏洞利用,并探讨检测策略。
此漏洞已在 1.120.4、1.121.1 和 1.122.0 版本中修复。为确保系统安全,强烈建议更新到这些已修复的版本之一。
技术背景
在深入探讨漏洞利用之前,我们先来回顾一下 n8n。它基于 Node.js 构建,使用 JavaScript 来实现平台内部逻辑和用户工作流程逻辑。其架构包括:
- 工作流执行引擎:负责协调基于节点的工作流执行的核心计算组件
- 表达式求值系统:处理用双花括号括起来的动态表达式,{{ }}这些表达式在工作流执行期间会被求值为 JavaScript 代码。
- 代码节点:允许用户编写自定义 JavaScript 或 Python 代码作为工作流步骤,从而扩展平台功能
- 400 多个原生集成:预构建的连接器,可连接到构成工作流节点的各种 API 和服务。
该漏洞存在于 n8n 的工作流表达式求值系统中。在工作流配置过程中,已认证用户提供的表达式会在不安全的执行环境中进行求值。核心安全缺陷是一个表达式注入漏洞,它允许已认证的攻击者以 n8n 进程的权限执行任意 JavaScript 代码。具体而言:
- n8n 将用双花括号括起来的用户输入{{ }}作为 JavaScript 代码进行处理,而没有进行足够的沙箱或输入验证。
- 表达式求值器缺乏适当的上下文隔离,使得攻击者能够逃逸预期的求值沙箱。
- 身份验证无法有效防止此漏洞,因为任何经过身份验证的用户都可以利用它。
请考虑来自wioui的以下工作有效载荷。
{{ (function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })() }}
在这些层层叠叠的花括号内,你可以看到…… (function(){ ... })()。这种模式会创建一个匿名函数并立即执行。攻击者会尝试在保持执行上下文不变的情况下封装一些复杂的逻辑。为了便于阅读,匿名函数如下所示:
function () {
return this.process.mainModule.require('child_process').execSync('id').toString()
}
让我们仔细看看,以便更好地理解这个漏洞。当函数 () { ... } 被调用时,它开始执行 return 语句。如果您不熟悉函数,return 语句会返回一个值,这需要对它后面的表达式进行求值。在这种情况下,求值从 this 开始。
该漏洞利用了 this.process.mainModule。让我们来分解一下:
this 指的是 Node.js 执行上下文中的全局对象
process 是一个 Node.js 全局对象,提供对系统进程的访问
mainModule 引用 Node.js 应用程序的根模块
此方法旨在绕过典型的 JavaScript 沙箱限制,通过访问 Node.js 内部机制(根模块),而这些机制通常对用户表达式是不可用的。需要注意的是,如果沙箱机制配置得当,它应该能够将表达式执行上下文与 Node.js 运行时环境隔离开来。
现在已经访问到了 mainModule 对象,我们可以看到 .require('child_process')。这里使用了 require(),即 Node.js 的模块加载函数,来加载 child_process 模块,这是一个用于执行系统命令的 Node.js 核心模块。需要注意的是,用户表达式不应该
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)



