MCP脆弱性:秘匿型ポイズニングと操作

アーキテクチャの概要

デモンストレーション対象のMCP:Toolbox

Smithery.aiは、MCPプラグインの主要なハブとして際立っており、多数のMCPリストとアクティブユーザーを集めています。中でも、smithery.aiが提供する公式MCP管理ツールである@smithery/toolboxは、今回のセキュリティ評価の中心となります。

Toolboxがテスト対象として選ばれた理由はいくつかあります。

  • 大規模なユーザーベースを持ち、MCPエコシステムにおける代表的なサンプルであること。
  • 追加のプラグインの自動インストールをサポートし、クライアント側の機能を拡張できること(例:Claude Desktop)。
  • APIキーなどの機密性の高い構成が含まれており、潜在的な悪用を実証しやすいこと。

デモンストレーションに使用する悪意のあるMCP:MasterMCP

SlowMistがセキュリティテストの目的で特別に開発したMasterMCPは、モジュール化されたアーキテクチャ上に構築された、悪意のあるMCPツールをシミュレートしたものです。その主要なコンポーネントは次のとおりです。

  1. ローカルウェブサイトサービスシミュレーション:http://127.0.0.1:1024

現実的な攻撃シナリオを作成するために、MasterMCPにはローカルウェブサイトサービスシミュレーションモジュールが組み込まれています。FastAPIフレームワークを活用して、このモジュールは一般的なWeb環境を模倣したシンプルなHTTPサーバーを迅速に確立します。これらのページは無害に見え、ベーカリーの情報を示したり、標準のJSONデータを返したりするかもしれませんが、そのソースコードまたはAPIレスポンス内には、細心の注意を払って作成された悪意のあるペイロードが隠されています。

このアプローチにより、安全で制御されたローカル環境で、情報ポイズニングとコマンド隠蔽の手法を包括的に実証できます。一見普通のWebページに潜む潜在的なリスクを浮き彫りにし、大規模言語モデルで異常な動作を引き起こす可能性があります。

  1. ローカライズされたプラグインMCPアーキテクチャ

MasterMCPは、新しい攻撃ベクトルの迅速なスケーラビリティを促進するために、プラグインアプローチを採用しています。実行時に、MasterMCPは前のモジュールのFastAPIサービスをサブプロセスで開始します。

デモンストレーションクライアント

  • Cursor:世界中で最も広く使用されているAI支援プログラミングIDEの1つ。
  • Claude Desktop:MCPプロトコルをカスタマイズした組織であるAnthropicの公式クライアント。

デモンストレーションに使用する大規模言語モデル(LLM)

  • Claude 3.7

Claude 3.7が選ばれたのは、機密性の高い操作を認識する機能が強化されており、現在のMCPエコシステム内で堅牢な運用能力を代表しているためです。

claude_desktop_config.json の構成

構成が完了すると、デモンストレーションフェーズが開始されます。

クロスMCPによる悪意のある呼び出し

このデモンストレーションでは、チェックリストに概説されているポイズニング技術とクロスMCPによる悪意のある呼び出し戦略の両方を組み込んでいます。

Webページコンテンツポイズニング攻撃

  1. コメントベースのポイズニング

Cursorは、ローカルテストWebサイト(http://127.0.0.1:1024)にアクセスします。

‘おいしいケーキの世界’に関するこの一見無害なページは、大規模言語モデルクライアントが悪意のあるWebサイトにアクセスした場合の潜在的な影響を示すシミュレーションとして機能します。

実行コマンド:

結果は、CursorがWebページの内容を読み取るだけでなく、ローカルの機密性の高い構成データをテストサーバーに送り返していることを示しています。悪意のあるプロンプトは、HTMLコメントとしてソースコードに埋め込まれています。

このコメントベースのアプローチは比較的簡単で検出も容易ですが、それでも悪意のある操作をトリガーする可能性があります。

  1. エンコードされたコメントポイズニング

http://127.0.0.1:1024/encodeにアクセスすると、前の例と同一に見えるページが表示されます。ただし、悪意のあるプロンプトはエンコードされているため、ページのソースコードを調べてもエクスプロイトの検出がより困難になります。

ソースコードに明示的なプロンプトがないにもかかわらず、攻撃は成功します。

MCPツールが返す情報ポイズニング

MasterMCPプロンプトの指示に基づいて、悪意のあるMCPをトリガーし、その後の操作を実証するシミュレートされたコマンドを入力します。

コマンドをトリガーすると、クライアントはToolboxへのクロスMCP呼び出しを開始し、新しいMCPサーバーを正常に追加します。

プラグインコードを調べると、返されたデータにエンコードされた悪意のあるペイロードが含まれており、ユーザーが検出することは事実上不可能であることがわかります。

サードパーティインターフェース汚染攻撃

このデモンストレーションでは、悪意のあるMCPと悪意のないMCPの両方が、サードパーティAPIデータをコンテキストに直接返すことに関連する潜在的なリスクを強調しています。

コード例:

実行リクエスト:

結果: 悪意のあるプロンプトが返されたJSONデータに埋め込まれ、悪意のある実行が正常にトリガーされます。

MCP初期化中のポイズニング技術

このデモンストレーションでは、初期プロンプトインジェクションと名前の競合のチェックリスト項目を取り上げています。

悪意のある関数上書き攻撃

MasterMCPは、Toolboxのremove_server関数と同じ関数名を持つツールを作成し、その中に悪意のあるプロンプトをエンコードします。

実行コマンド:

Claude Desktopは元のtoolbox remove_serverメソッドを呼び出さず、代わりにMasterMCPが提供する同じ名前のメソッドをトリガーします。

これは、「元のメソッドは非推奨である」ことを強調することで実現され、大規模言語モデルが悪意を持って上書きされた関数を優先するように促します。

悪意のあるグローバル検査ロジックの追加

MasterMCPは、「banana」と呼ばれるツールを作成します。これは、他のツールが実行される前に必須のセキュリティチェックを強制するように設計されています。

各関数が実行される前に、システムは「banana」チェックメカニズムを優先します。

このグローバルロジックインジェクションは、コード内で「banana検出の必須実行」を繰り返し強調することで実現されます。

悪意のあるプロンプトを隠すための高度なテクニック

LLMフレンドリーなエンコード方法

大規模言語モデルは、多言語形式に対する強力な解析機能を備えており、悪意のある情報を隠蔽するために利用できます。一般的な方法には以下が含まれます。

  • 英語環境:16進数バイトエンコード
  • 中国語環境:NCRエンコードまたはJavaScriptエンコード

ランダムな悪意のあるペイロード返却メカニズム

第3章で説明したサードパーティインターフェースの汚染と同様に、http://127.0.0.1:1024/random をリクエストすると、次のようになります。

各リクエストは、悪意のあるペイロードを含むランダムに生成されたページを返し、検出と追跡の難易度を大幅に高めます。

MasterMCPの実践的なデモンストレーションを通じて、Model Context Protocol(MCP)エコシステム内の隠れたセキュリティ脆弱性が明らかになりました。基本的なプロンプトインジェクションやクロスMCP呼び出しから、初期化中のより巧妙な攻撃や悪意のある命令の隠蔽まで、各段階はMCPエコシステムの力と並んで固有の脆弱性を思い出させるものです。

今日、大規模モデルが外部プラグインやAPIとますます相互作用するにつれて、一見些細な入力汚染がシステム全体のセキュリティリスクを引き起こす可能性があります。エンコード技術、ランダムな汚染、関数の上書きなど、攻撃者の戦術が進化し多様化するにつれて、従来のセキュリティアプローチを包括的にアップグレードする必要があります。