技術 約6分で読めます

FlowiseのCustomMCPノードにCVSS 10.0のRCE脆弱性、12,000超のインスタンスが攻撃にさらされている

いけさん目次

AIエージェントのワークフローをノーコードで構築できるオープンソースプラットフォーム「Flowise」に、CVSS 10.0(満点)のリモートコード実行(RCE)脆弱性が見つかった。CVE-2025-59528として採番されたこの脆弱性は2025年9月に公開・パッチ済みだが、VulnCheckの調査で実際の悪用が確認されており、いまだ12,000以上のインスタンスがインターネットに露出している。

MCPサーバーの脆弱性というと、先日のオープンソースMCPサーバー50件スキャンで報告されたように入力バリデーション欠如やコマンドインジェクションが広範に存在することが分かっている。今回のFlowiseの脆弱性はまさにその典型例で、MCPサーバー設定の入力値が一切検証されずにコード実行まで到達するというものだった。

脆弱性の仕組み

FlowiseにはCustomMCPノードという機能がある。外部のMCP(Model Context Protocol)サーバーに接続するための設定をユーザーが入力し、Flowiseがその設定を解析してMCPサーバーとの通信を確立する仕組みだ。

問題は設定文字列の解析方法にあった。CustomMCP.tsの convertToValidJSONString 関数(262〜270行目)で、ユーザーが入力した mcpServerConfig 文字列を解析する際、JSON.parse() ではなくJavaScriptの Function() コンストラクタを使っていた。

Function('return ' + inputString)()

Function() コンストラクタは eval() と機能的に同等で、渡された文字列をJavaScriptコードとして実行する。つまり、JSON設定のつもりで渡された文字列が任意のJavaScriptコードとして動く。しかもNode.jsのフルランタイム権限で実行されるため、child_process(OS コマンド実行)や fs(ファイルシステム操作)といった危険なモジュールにもアクセスできる。

なぜ Function()eval() は危険なのか

JavaScriptには文字列をコードとして実行する手段がいくつかある。

手段動作リスク
JSON.parse()JSONデータのみを解析。コードは実行しない安全
JSON5.parse()JSON5形式を解析。コードは実行しない安全
eval()文字列をJavaScriptコードとして実行任意コード実行
Function()文字列から関数を生成して実行。eval() と同等任意コード実行
new vm.Script()V8のコンテキストでコード実行。サンドボックス化は限定的設定次第で危険

今回の修正では Function()JSON5.parse() に置き換えられた。JSON5はJSON互換の厳密なデータフォーマットパーサーで、コメントや末尾カンマなどの拡張構文を許容しつつ、コード実行は一切行わない。

攻撃チェーン

攻撃者がこの脆弱性を悪用する流れを図示する。

graph TD
    A[攻撃者] -->|POST リクエスト送信| B["/api/v1/node-load-method/customMCP"]
    B -->|mcpServerConfig パラメータ| C["コントローラー<br/>getSingleNodeAsyncOptions"]
    C -->|変数置換 220行目<br/>フィルタリングなし| D["サービスレイヤー"]
    D -->|文字列を渡す| E["convertToValidJSONString<br/>262-270行目"]
    E -->|"Function('return ' + input)()"| F["任意のJavaScript実行"]
    F --> G["child_process.execSync<br/>OSコマンド実行"]
    F --> H["fs モジュール<br/>ファイル読み書き"]
    F --> I["process.env<br/>環境変数・認証情報窃取"]

攻撃のペイロード(実際に送信される悪意あるコード)はIIFE(即時実行関数式)をオブジェクトリテラルで包む形式をとる。

({x:(function(){ require('child_process').execSync('id') })()})

この文字列が Function('return ' + ...)() に渡されると、return ({x:(function(){...})()}) として評価・実行される。HTTPのPOSTリクエスト1発で済むため、攻撃の複雑さは極めて低い。

認証の問題

FlowiseのAPIはデフォルトでは認証なしで動作する。APIキーの設定は任意であり、設定していないインスタンスに対しては完全に未認証で攻撃できる。CVSSベクトルの PR:N(権限不要)はこれを反映している。

CVSSベクトルの内訳

CVSS 10.0という満点スコアの内訳を見ると、なぜこれほど深刻なのかが分かる。

メトリクス意味
攻撃元区分(AV)ネットワークリモートから攻撃可能
攻撃条件の複雑さ(AC)特殊な条件不要
必要な特権レベル(PR)なし認証不要
ユーザー関与(UI)なし被害者の操作不要
スコープ(S)変更ありFlowise以外のシステムにも影響が波及
機密性(C)全データ漏洩の可能性
完全性(I)任意のデータ改ざん可能
可用性(A)サービス停止可能

ベクトル文字列は CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H。CWEは CWE-94(コード生成の不適切な制御、コードインジェクション)に分類されている。

12,000超のインスタンスが露出中

VulnCheckの調査によると、12,000以上のFlowiseインスタンスがインターネットに直接露出している。攻撃者にとっては「標的を選び放題」の状態だ。

実際の悪用活動も確認されている。VulnCheckによれば、攻撃トラフィックは単一のStarlink IPアドレスから発信されていた。観測された侵害後の活動は以下の通り。

  • idwhoamihostname コマンドによるシステム偵察
  • 環境変数の収集(APIキー、データベース認証情報の窃取)
  • netcatやPythonによるリバースシェルの確立
  • 窃取したクラウド認証情報を使ったラテラルムーブメント(横展開、ネットワーク内の他のシステムへの侵入拡大)
  • AI設定ファイルや会話ログのデータ窃取

EPSSスコア(Exploit Prediction Scoring System)は84.07%で、99.28パーセンタイルに位置する。30日以内に悪用される確率が84%という数字は、この脆弱性が「理論上の危険」ではなく「いま現実に悪用されている」ことを裏付けている。なお、2026年4月時点でCISAのKEVカタログ(Known Exploited Vulnerabilities、悪用が確認された脆弱性の一覧)にはまだ追加されていない。

n8nの脆弱性との類似性

ワークフロー自動化ツールで式評価(expression evaluation)がRCEに直結するパターンは、n8nの複数RCE脆弱性でも見られた。n8nのCVE-2025-68613(CVSS 9.9)はCISA KEVに追加済みで、24,700以上のインスタンスが露出していた。

共通するのは「ユーザー入力をコードとして評価する」設計の危険性だ。n8nではvm2サンドボックスを経由した式評価がバイパスされ、Flowiseでは Function() コンストラクタがJSON解析の代わりに使われていた。どちらもローコード/ノーコードのAIツール・自動化ツールで、「ユーザーが自由に設定を書ける」機能が攻撃面になっている。

影響を受けるバージョンと対策

項目内容
影響バージョン2.2.7-patch.1 以上 3.0.6 未満
修正バージョン3.0.6
発見者Kim SooHyun(@im-soohyun
アドバイザリ公開2025年9月13日(GitHub)
NVD公開2025年9月22日

3.0.6へのアップデートが最優先だが、それ以外にも以下の対策を推奨する。

  • API認証の有効化 — APIキーまたはBearerトークンを必ず設定する。デフォルトの認証なし状態で運用しない
  • ネットワークアクセスの制限 — Flowiseをインターネットに直接公開しない。VPNやリバースプロキシで内部ネットワークに限定する
  • HTTPログの監視 — POSTリクエストのボディに process.mainModulechild_processrequireexecSyncFunction が含まれていないか監視する
  • Egressフィルタリング — 許可されていないアウトバウンド接続を検出・遮断する

パッチ適用から半年以上が経過しているにもかかわらず12,000以上のインスタンスが未パッチのまま露出しているのは、AIツールの急速な普及と運用管理のギャップを端的に示している。Flowiseのようなセルフホスト型AIプラットフォームを運用しているなら、バージョン確認は今すぐやるべきだ。