MCPサーバーのセキュリティリスクの分類とTool Poisoning Attackの考察
背景
この記事を読んで、MCPのセキュリティについてより体系的な解説が可能ではないかと考えました。
さらに、最近公開されたMCPサーバーのTool機能を標的とする攻撃手法「Tool Poisoning Attacks」にも関心があったため、今回のテーマとして取り上げます。
この記事の目的
本稿では、まずMCPの基本構造とデータフローについて解説し、その仕組みに内在するセキュリティリスクを「ソースの信頼性」「アクセス権限の範囲」「使用コンテキスト」という3つの視点から体系的に分類・整理します。さらに、これらのリスクが引き起こす可能性のある攻撃パターンについて考察し、最近発見されたMCPへの攻撃手法「Tool Poisoning Attack」の概要と潜在的な脅威について詳述します。 一連の説明を通して、MCPに関する基本理解、MCPサーバーのセキュリティリスクの体系的分析、MCPサーバーのTools機能に対する新たな攻撃手法への洞察、リスク連鎖の認識の視点を読者が得ることを目的としています。
なお、具体的なMCPサーバーマーケットプレイスの信頼性に関する詳細は本稿では扱いません。 該当情報にご興味のある方は、MCPサーバーの承認や追加プロセスについて解説した以下の記事をご参照ください。 zenn.dev
MCPの仕組み
MCPの概要
MCP (Model Context Protocol) とは、外部のツールやリソースとAIをシームレス連携するためのオープンインターフェースです。 MCPは、Claudeなどを開発しているAnthropic社が2024/11/26にリリースしました。
GitHub上でMCPのドキュメントや各種言語のSDKの開発が活発に行われています。 github.com
MCPのデータフロー
MCPはクライアント・サーバー方式で設計されており、以下のようなデータフローで動作します。
sequenceDiagram
participant Client as MCPとホストとクライアント
participant Server as MCPサーバー
participant External as 外部サービス
Client->>Server: MCPリクエスト送信(例: ツール呼び出し)
Server->>External: 外部APIまたはサービスを呼び出す
External-->>Server: 結果を返す
Server-->>Client: 結果を整形して返却
- MCPホスト: MCPを通してデータにアクセスしたいツールのこと
- Claude DesktopやClineなど
- MCPクライアント: サーバーと1:1で接続されるクライアント
- Claude Desktop内部に存在する(はず...)
- MCPサーバー: MCPに基づいた特定の機能を露出する簡易プログラム
- Claude Desktopの場合、Claude Desktopは起動時にMCPサーバーを子プロセスとして立ち上げます
- 外部サービス: インターネット越しにアクセスできる外部サービス
- SlackやFigmaなど
MCPの機能
MCPはLLMから利用できる機能としてResources, Tools, Prompts, Roots, Samplingを機能として備えています。 以下、各機能について詳しく解説します(この辺理解が甘いです...)。
- Resources: MCPサーバーがクライアントに公開するデータやコンテンツのこと
- Prompts: MCPサーバーが定義する再利用可能なプロンプトテンプレートとワークフローのこと
- Tools: MCPサーバーがクライアントに公開する実行可能な機能のこと
- Roots: サーバーが操作できる境界を定義するもの
- Sampling: MCPサーバーがクライアントを通してLLMに補完をリクエストできる強力な機能
なお、MCPの各機能は仕様上定められていますが、実際にサポートされるかどうかは各MCPクライアントに依存します。 例えばClaude DesktopはSampling, Rootsをサポートしていないようです。 Model Context Protocol / Example ClientsのページにてMCPの機能のサポート状況がリスト化されています。
MCPサーバーのセキュリティリスク分類とその悪用パターン
本節では、MCPサーバーに潜むセキュリティリスクを、「ソースの信頼性」「アクセス権限の範囲」「使用コンテキスト」という3つの観点から体系的に整理します。
1. ソースの信頼性: 誰が作ったか
- 安全性を評価するための視点
- 悪用パターン
- 対策例
2. アクセス権限の範囲: 何ができるか
- 安全性を評価するための視点
- ファイルシステムやネットワークリソースへのアクセス: どのリソースにアクセス可能か
- システムコマンド実行: 実行可能なコマンドの範囲と制限
- 悪用パターン
- 対策例
- 最小権限の原則に基づくアクセス制御の実装
- サンドボックス化
- ログの定期確認と異常検知システムの導入
3. 使用コンテキスト: どう使われるか
- 安全性を評価するための視点
- プロンプト内容: ユーザーがどのような指示・入力を行うか
- AIへの入力情報: AIが参照する情報の内容とその処理方法
- プロンプトインジェクション対策: 入力データのサニタイジングと検証の実施状況
- 悪用パターン
- プロンプトインジェクション: AIモデルが隠れた悪意ある指示に従い、不正操作を実行
- 情報引き出し: ユーザーとの会話を操作し、機密情報を抽出する
- セキュリティ境界の混乱: 安全性を装いながら、複数の無害な命令が組み合わさって悪意ある動作を誘発
- ユーザー行動の記録: 入力パターンや利用状況を不正に収集、外部送信
- 権限の誤解誘導: 「読み取りのみ」と偽りながら、実際には変更や実行を行う
- 対策例
- ユーザーインターフェース上で、AIが参照する情報とユーザーに見える情報を明確に分離
- 入力データの厳格なサニタイジングと検証の実施
- 異常な操作や連鎖攻撃を検知するためのリアルタイム監視システムの構築
Tool Poisoning Attacksの概要
2025/04/01にInvariantlabsによってTool Poisoning Attacks(以下TPA)と呼ばれる攻撃手法が発見・公開されました。本節は、記事の内容に基づきTPAの概要を説明します。 オリジナルの記事ではTPAの発見について述べており、実際にTPAが利用されたかに関しては記述されていないです。
TPAは、MCPサーバーにおける重大なセキュリティ脆弱性です。具体的には、悪意のある指示がユーザーには見えないが、AIモデルには認識されるMCPツールの説明文に埋め込まれることで発生します。
攻撃の仕組み
- 隠し命令の埋め込み: 攻撃者は、ユーザーには単純に見えるツールの中に、AIモデルだけが認識できる隠し悪意命令を埋め込みます。
- 例: 単純な加算ツールの説明文に、特定のファイル(SSHキーや設定ファイルなど)の内容を読み取り、外部に送信するよう指示する隠し命令が記述されることがあります。
- 実行プロセス: AIモデルは、ツールの完全な説明文を参照し、隠された命令に従って動作します。一方、ユーザーインターフェース上ではツール名や引数が簡略化され、悪意のある命令の存在がユーザーに伝わりません。
TPAの危険性
- 機密データの漏洩: 隠し命令に従うことで、機密ファイルの内容が外部に送信される可能性がある。
- エージェントの挙動のハイジャック: 攻撃者がAIモデルの動作を制御し、ユーザーの意図とは異なる不正なアクションを実行させる危険性がある。
- 信頼インフラへの影響: 悪意あるサーバーを通じ、他の信頼されたサーバーのルールや指示が上書きされ、エージェントが不正動作に誘導される可能性がある。
- ユーザー認識との乖離: ユーザーが目にする情報と、AIモデルが実際に処理する指示との間にギャップが生じ、悪意のある行為が隠蔽される。
関連する攻撃手法
オリジナルの記事では2つのツールの説明文の改変手法が紹介されており、これらの手法を利用することでTPAを実行できます。
MCP Rug Pull
クライアントがツールを承認した後、悪意あるサーバーがツール説明文を変更することで、当初は安全なツールが後に不正動作を引き起こす手法です。
MCP Tool Shadowing:
信頼されたツールの動作を改ざんするため、悪意あるサーバーがツール説明文を操作し、別の不正な動作を誘発する手法です。
TPAの対策
記事では以下の3つの具体的な対策を提起しています。
- 明確なUIパターンの導入: ツールの説明文において、ユーザーに表示される部分とAIモデルが参照する部分を明確に区別する。
- ツール・パッケージのピン留め: MCPサーバーおよびツールのバージョンを固定し、更新時にハッシュやチェックサムを用いて整合性を確認する。
- クロスサーバー保護: 複数のMCPサーバー間で厳格な境界管理とデータフロー制御を実施する。
公開されたばかりの攻撃手法なので、主要なプロバイダーであるAnthropic, OpenAI、またZaiperなどがどのような対応をするかは2025/04/06時点では不明です。 また個々人のユーザーができる対策としては、やはり信頼できるMCPサーバーのみ利用する、もしくは全てのMCPサーバーを自作するといったところではないでしょうか。
MCPサーバーのセキュリティリスクの分類・悪用パターンから見たTPA
本節では、先に示した3つのセキュリティリスク(ソースの信頼性、アクセス権限の範囲、使用コンテキスト)の観点から、TPAがどのように悪用されるかを独自に考察します。
- ソースの信頼性
- アクセス権限の範囲
- クレデンシャル盗難: 隠し命令により、SSH鍵や認証情報などの機密データが外部に漏洩する可能性があり、これにより不正な権限拡大が起こるリスクが存在します。
- 使用コンテキスト
- プロンプトインジェクションと情報引き出し: TPAは、ユーザーに表示されない形でAIモデルへ悪意ある指示を注入するため、通常の操作とは異なるプロンプトが実行され、結果として機密情報の抽出や不正操作が誘発される危険性があります。
これらのリスク要素は単独ではなく、連鎖的に作用する可能性があります。 たとえば、偽装MCPによる初期侵入が、クレデンシャル盗難やプロンプトインジェクションを通じたさらなる権限拡大、不正操作につながるシナリオが考えられます。 これにより、TPAはMCP全体の信頼性を大きく損なう脅威となります。
おわりに
この記事の執筆を通してMCPの仕様に関する理解、潜んでいるセキュリティリスクについて見識が深まりました。 Tool Poisoning Attacksは、現状のMCPエコシステムの安全性に対して大きな問いを投げかけています。 元々野良MCPサーバーを使わない派でしたが、この記事を通して改めてその危険性を認識することができました。
本稿は可能な限り事実確認を行い執筆いたしましたが、誤りや不明点がありましたら、コメントにてご指摘いただければ幸いです。
関連記事
MCPの公式ドキュメントの説明 modelcontextprotocol.io
他にどのようなMCPクライアントやサーバーがあるのか気になる方は、GitHubにてpunkpeyeさんがホストしているページを参考にすると良いと思います。
記事を書いている途中で見つけたMCPの現状、セキュリティ上の脅威、および今後のの研究方向性に関すプレプリントです。後で読んでみたいと思います。