<p><style_prompt>
[Tone & Style: Professional CSIRT/Security Engineer]</style_prompt></p>
<ul class="wp-block-list">
<li><p>専門用語を正確に使用し、冗長な修飾語を排除した「事実と対策」中心の記述。</p></li>
<li><p>脅威の深刻度をCVSSスコアに基づき客観的に評価。</p></li>
<li><p>コードブロックはシンタックスハイライトを適切に適用。</p></li>
<li><p>Mermaid図解は論理的構造を優先。</p></li>
</ul>
<p>
本記事は**Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)**です。
# n8nの致命的なRCE脆弱性(CVE-2026-25049)への緊急対応:サンドボックス回避によるシステム完全占拠の回避策
### 【脅威の概要と背景】
n8nの式評価エンジンにおけるサンドボックス回避により、未認証の攻撃者がホストOS上で任意のコマンドを実行可能な脆弱性(CVSS 9.4)。
### 【攻撃シナリオの可視化】
</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["攻撃者: インターネット/内部NW"] -->|1. 悪意のある式を含むWebhook送信| B("n8n ワークフローエンジン")
B -->|2. 式の評価中にサンドボックスを脱出| C{"ホストOS権限奪取"}
C -->|3a. 機密情報の窃取| D["データベース/環境変数"]
C -->|3b. 横展開| E["内部ネットワークへの侵入"]
C -->|3c. 永続化| F["バックドアの設置"]
</pre></div>
<p>
攻撃者は、n8nの「Expression(式)」機能がJavaScriptを実行する際の境界を悪用し、`vm2`や`isolated-vm`などのライブラリ制限をバイパスして、基盤となるNode.jsプロセスおよびOSのシステムコールに直接アクセスします。
### 【安全な実装と設定】
#### 1. 脆弱な設定例(OSコマンドノードの無制限利用)
ワークフロー内で外部入力をそのままシェルコマンドに渡す設計は、RCEの入り口となります。
</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># 誤用例:Webhookの入力をそのまま実行
# 攻撃者は payload に "; rm -rf /" などを注入可能
n8n_execute_command("ls " + $json.query.dir);
</pre>
</div>
<p>
#### 2. 安全な代替案(ノード制限と環境分離)
環境変数を使用して、リスクの高いノードを無効化し、実行環境を隔離します。
</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># n8nサーバー起動時の環境変数設定
# 実行コマンドノードを無効化し、OSへの直接アクセスを制限する
export N8N_BLOCK_NODES=n8n-nodes-base.executeCommand,n8n-nodes-base.executeBatchCommand
# サンドボックスの隔離レベルを最大化(configファイル等)
export N8N_JS_SANDBOX=isolated
</pre>
</div>
<p>
#### 3. 最小権限原則(Docker実行時)
n8nプロセスを `root` ユーザーで実行しないことが、RCE成功時の被害を最小化する鍵です。
</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># docker-compose.yml 抜粋
services:
n8n:
image: n8nio/n8n:latest
user: "1000:1000" # 非ルートユーザーでの実行
read_only: true # ルートファイルシステムを読み取り専用に
tmpfs:
- /home/node/.n8n
</pre>
</div>
<h3 class="wp-block-heading">【検出と緩和策】</h3>
<h4 class="wp-block-heading">1. EDR/SIEMでの検知ポイント</h4>
<ul class="wp-block-list">
<p><li><p><strong>子プロセスの異常監視</strong>: n8nのメインプロセス(<code>node</code>)から、想定外のバイナリ(<code>sh</code>, <code>bash</code>, <code>curl</code>, <code>nc</code>)が起動されていないか監視。</p></li>
<li><p><strong>通信パターンの変化</strong>: n8nコンテナから外部の不審なIPアドレス(C2サーバー)へのアウトバウンド通信(特にポート4444や8080など)を検知。</p></li></p>
</ul>
<h4 class="wp-block-heading">2. 応急的な緩和策(パッチ適用が困難な場合)</h4>
<ul class="wp-block-list">
<p><li><p><strong>WAFによるフィルタリング</strong>: Webhookエンドポイントへのリクエストに含まれる <code>require(</code>, <code>process.</code>, <code>child_process</code> などのキーワードをブロック。</p></li>
<li><p><strong>ネットワーク隔離</strong>: n8nサーバーから内部セグメント(DBや他社API)への通信を、必要な宛先のみに制限(ホワイトリスト化)。</p></li></p>
</ul>
<h3 class="wp-block-heading">【実務上の落とし穴】</h3>
<ul class="wp-block-list">
<p><li><p><strong>可用性への影響</strong>: <code>N8N_BLOCK_NODES</code> でコマンド実行ノードを停止すると、レガシーな運用自動化フローが停止する恐れがあります。事前に依存関係の棚卸しが必要です。</p></li>
<li><p><strong>誤検知(False Positive)</strong>: 開発者が正当な理由で <code>Code Node</code> を利用している場合、セキュリティスキャンが正常なコードを攻撃と誤認する可能性があります。</p></li></p>
</ul>
<h3 class="wp-block-heading">【まとめ】</h3>
<p>
組織として直ちに実施すべき3項目:
</p>
<ol class="wp-block-list">
<p><li><p><strong>即時アップデート</strong>: ベンダーが提供する修正済みバージョン(LTS等)への更新。</p></li>
<li><p><strong>実行環境の要塞化</strong>: <code>N8N_BLOCK_NODES</code> を適用し、非ルートユーザーでのコンテナ実行を徹底。</p></li>
<li><p><strong>資産の棚卸し</strong>: 公開設定になっているn8nインスタンスがないか、外部アタックサーフェスを確認。</p></li></p>
</ol>
<hr/>
<p><strong>参考文献:</strong></p>
<ul class="wp-block-list">
<li><p><a href="https://github.com/n8n-io/n8n/security/advisories">n8n Security Advisories (GitHub)</a></p></li>
<li><p><a href="https://www.jpcert.or.jp/">JPCERT/CC: 脆弱性対策情報</a></p></li>
<li><p><a href="https://cve.mitre.org/">CVE-2024-XXXXX (n8n RCE related cases)</a>
<em>(※注: CVE-2026-25049は指定に基づいたシミュレーション番号です。実務では最新のCVE番号を参照してください)</em></p></li>
</ul>
[Tone & Style: Professional CSIRT/Security Engineer]
専門用語を正確に使用し、冗長な修飾語を排除した「事実と対策」中心の記述。
脅威の深刻度をCVSSスコアに基づき客観的に評価。
コードブロックはシンタックスハイライトを適切に適用。
Mermaid図解は論理的構造を優先。
本記事は**Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)**です。
# n8nの致命的なRCE脆弱性(CVE-2026-25049)への緊急対応:サンドボックス回避によるシステム完全占拠の回避策
### 【脅威の概要と背景】
n8nの式評価エンジンにおけるサンドボックス回避により、未認証の攻撃者がホストOS上で任意のコマンドを実行可能な脆弱性(CVSS 9.4)。
### 【攻撃シナリオの可視化】
graph TD
A["攻撃者: インターネット/内部NW"] -->|1. 悪意のある式を含むWebhook送信| B("n8n ワークフローエンジン")
B -->|2. 式の評価中にサンドボックスを脱出| C{"ホストOS権限奪取"}
C -->|3a. 機密情報の窃取| D["データベース/環境変数"]
C -->|3b. 横展開| E["内部ネットワークへの侵入"]
C -->|3c. 永続化| F["バックドアの設置"]
攻撃者は、n8nの「Expression(式)」機能がJavaScriptを実行する際の境界を悪用し、`vm2`や`isolated-vm`などのライブラリ制限をバイパスして、基盤となるNode.jsプロセスおよびOSのシステムコールに直接アクセスします。
### 【安全な実装と設定】
#### 1. 脆弱な設定例(OSコマンドノードの無制限利用)
ワークフロー内で外部入力をそのままシェルコマンドに渡す設計は、RCEの入り口となります。
# 誤用例:Webhookの入力をそのまま実行
# 攻撃者は payload に "; rm -rf /" などを注入可能
n8n_execute_command("ls " + $json.query.dir);
#### 2. 安全な代替案(ノード制限と環境分離)
環境変数を使用して、リスクの高いノードを無効化し、実行環境を隔離します。
# n8nサーバー起動時の環境変数設定
# 実行コマンドノードを無効化し、OSへの直接アクセスを制限する
export N8N_BLOCK_NODES=n8n-nodes-base.executeCommand,n8n-nodes-base.executeBatchCommand
# サンドボックスの隔離レベルを最大化(configファイル等)
export N8N_JS_SANDBOX=isolated
#### 3. 最小権限原則(Docker実行時)
n8nプロセスを `root` ユーザーで実行しないことが、RCE成功時の被害を最小化する鍵です。
# docker-compose.yml 抜粋
services:
n8n:
image: n8nio/n8n:latest
user: "1000:1000" # 非ルートユーザーでの実行
read_only: true # ルートファイルシステムを読み取り専用に
tmpfs:
- /home/node/.n8n
【検出と緩和策】
1. EDR/SIEMでの検知ポイント
子プロセスの異常監視: n8nのメインプロセス(node)から、想定外のバイナリ(sh, bash, curl, nc)が起動されていないか監視。
通信パターンの変化: n8nコンテナから外部の不審なIPアドレス(C2サーバー)へのアウトバウンド通信(特にポート4444や8080など)を検知。
2. 応急的な緩和策(パッチ適用が困難な場合)
WAFによるフィルタリング: Webhookエンドポイントへのリクエストに含まれる require(, process., child_process などのキーワードをブロック。
ネットワーク隔離: n8nサーバーから内部セグメント(DBや他社API)への通信を、必要な宛先のみに制限(ホワイトリスト化)。
【実務上の落とし穴】
【まとめ】
組織として直ちに実施すべき3項目:
即時アップデート: ベンダーが提供する修正済みバージョン(LTS等)への更新。
実行環境の要塞化: N8N_BLOCK_NODES を適用し、非ルートユーザーでのコンテナ実行を徹底。
資産の棚卸し: 公開設定になっているn8nインスタンスがないか、外部アタックサーフェスを確認。
参考文献:
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント