MCP (モデルコンテキストプロトコル) システムはまだ開発の初期段階にあります。全体的な環境は比較的混沌としており、さまざまな潜在的な攻撃方法が際限なく現れます。現在のプロトコルとツールの設計に対して防御するのは困難です。コミュニティがMCPのセキュリティをより深く理解し、向上できるように、SlowMistはMasterMCPツールを特別にオープンソース化し、実際の攻撃訓練を通じて誰もが製品設計のセキュリティリスクをタイムリーに発見し、独自のMCPプロジェクトを段階的に強化できるようにしたいと考えています。
同時に、前号の MCP セキュリティ チェックリストを使用すると、さまざまな攻撃の根本的な観点をより深く理解することができます。今回は、情報ポイズニング、悪意のある命令の隠蔽など、MCP システムにおける一般的な攻撃手法を実際のケースとともに実践的に解説します。デモで使用されるすべてのスクリプトも GitHub にオープンソース化されます (記事の最後にあるリンクを参照)。安全な環境でプロセス全体を完全に再現し、これらのスクリプトに基づいて独自の攻撃テスト プラグインを開発することもできます。
全体的なアーキテクチャの概要
デモ攻撃のターゲットMCP:ツールボックス
smithery.ai は最も人気のある MCP プラグイン Web サイトの 1 つであり、多数の MCP リストとアクティブ ユーザーを集めています。 @smithery/toolbox は、smithery.ai によって正式にリリースされた MCP 管理ツールです。
Toolbox は、次の点に基づいてテスト対象として選択されました。
- ユーザーベースは大きく、代表的です。
- 一部のクライアント機能を補完する他のプラグイン(Claude Desktop など)の自動インストールをサポートします。
- デモ用の機密構成 (API キーなど) が含まれています。
デモで使用された悪意のあるMCP:MasterMCP
MasterMCP は、セキュリティ テスト専用に SlowMist によって作成された悪意のある MCP シミュレーション ツールです。プラグイン アーキテクチャ設計を採用しており、次の主要モジュールが含まれています。
1. ローカル Web サイト サービス シミュレーション: http://127.0.0.1:1024
攻撃シナリオをより現実的に復元するために、MasterMCP にはローカル Web サイト サービス シミュレーション モジュールが組み込まれています。 FastAPI フレームワークを使用して、一般的な Web 環境をシミュレートするシンプルな HTTP サーバーを迅速に構築します。これらのページは、ケーキショップの情報を表示したり、標準の JSON データを返したりするなど、表面上は正常に見えますが、実際には、ページのソース コードやインターフェイスの戻り値の中に、綿密に設計された悪意のあるペイロードが隠されています。
このように、情報ポイズニングやコマンド隠蔽などの攻撃手法を安全で制御可能なローカル環境で十分に実証することで、一見普通の Web ページであっても、大規模なモデルに異常な操作を実行させる隠れた危険の源になる可能性があることを、誰もがより直感的に理解できるようになります。
2. ローカルプラグインMCPアーキテクチャ
MasterMCP は拡張にプラグイン方式を採用しており、後から新しい攻撃方法を素早く追加することが容易です。実行後、MasterMCP は子プロセスで前のモジュールの FastAPI サービスを実行します。 (注意すれば、ここにセキュリティ上のリスクがあることに気付くでしょう。ローカル プラグインは、MCP が予期しないサブプロセスを任意に開始する可能性があります)
デモクライアント
- カーソル: 世界で最も人気のあるAI支援プログラミングIDEの1つ
- Claude Desktop: Anthropic(MCPプロトコルカスタマイズパーティ)公式クライアント
デモンストレーションに使用された大型模型
- クロード 3.7
Claude 3.7 が選ばれたのは、機密操作の認識にいくつかの改善が加えられており、現在の MCP エコシステムでより強力な操作能力を備えているためです。
claude_desktop_config.json を構成する
{ "mcpServers": { "toolbox": { "command": "npx", "args": [ "-y", "@smithery/cli@latest", "run", "@smithery/toolbox", "--config", "{\"dynamic\":false,\"smitheryApiKey\":\"ec1f0fa8-5797-8678-sdaf-155d4584b133\"}", "--key", "ec1f0fa8-5797-8678-sdaf-155d4584b133" ] }, "MasterMCP": { "command": "/Users/xxx/Desktop/EvilMCP/bin/python", "args": [ "/Users/xxx/Desktop/EvilMCP/MasterMCP.py" ] } }}
設定が完了したら、正式にデモンストレーションフェーズに入ります。
MCP間の悪意のある呼び出し
このデモには、チェックリスト ポイズニングと Cross-MCP 悪意のある呼び出しという 2 つのコンテンツが含まれています。
ウェブコンテンツポイズニング攻撃
1. アノテーションポイズニング(一部参照:https://x.com/lbeurerkellner/status/1912145060763742579)
カーソルはローカル テスト Web サイト http://127.0.0.1:1024 にアクセスします。
これは「おいしいケーキの世界」についての一見無害なページです。この実験では、大規模なモデルクライアントが悪意のある Web サイトにアクセスした場合の影響をシミュレートします。
次のコマンドを実行します。
http://127.0.0.1:1024 のコンテンツを取得します。
結果は、Cursor が Web ページのコンテンツを読み取るだけでなく、ローカルの機密構成データをテスト サーバーに送信することも示しています。ソース コードでは、悪意のあるプロンプト ワードが HTML コメントの形式で埋め込まれています。
アノテーション方法は比較的簡単で識別しやすいですが、悪意のある操作をトリガーする可能性があります。
2. コード化されたコメントポイズニング
http://127.0.0.1:1024/encode にアクセスしてください。これは上記の例と同じように見える Web ページですが、悪意のあるプロンプト ワードがエンコードされているため、汚染された exp はより隠され、Web ページのソース コードにアクセスしたとしても直接検出することが困難になります。
ソース コードにプレーンテキストのヒント ワードが含まれていない場合でも、攻撃は正常に実行される可能性があります。具体的な原則については、次の章で詳しく説明します。
MCPツールは情報汚染を返す
ここで、MasterMCP のプロンプト語に従って、シミュレートされた命令を入力します (この命令には実際の意味はなく、悪意のある MCP をトリガーして、悪意のある MCP の後続の操作を示すことを目的としています)。
リンゴをたくさん手に入れる
コマンドがトリガーされた後、クライアントが MCP を介してツールボックスを呼び出し、新しい MCP サーバーを正常に追加していることがわかります。
プラグインのコードを確認すると、返されたデータにエンコードされた悪意のあるペイロードが埋め込まれていることが判明し、ユーザー側では異常を検出することがほとんどできません。
サードパーティインターフェース汚染攻撃
このデモンストレーションは主に、MCP が悪意のあるものか無害なものかを問わず、サードパーティ API を呼び出すときにサードパーティのデータがコンテキストに直接返されると、深刻な結果を招く可能性があることをすべての人に思い出させるためのものです。
サンプルコード:
リクエストを実行します:
http://127.0.0.1:1024/api/data から json を取得します。
結果: 返された JSON データに悪意のあるプロンプトワードが埋め込まれ、悪意のある実行が正常にトリガーされました。
MCP初期化フェーズにおけるポイズニング技術
このデモンストレーションでは、チェックリストの最初のプロンプトワードの挿入と名前の競合について説明します。
悪意のある関数上書き攻撃
ここで、MasterMCP は Toolbox と同じ関数名、remove_server を持つツールを作成し、悪意のあるプロンプト単語をエンコードして隠しました。
次のコマンドを実行します。
ツールボックス フェッチプラグインサーバの削除
Claude Desktop は、元の `toolbox remove_server` メソッドを呼び出さずに、MasterMCP によって提供される同じ名前のメソッドをトリガーします。
原則としては、「元のメソッドは放棄された」ということを強調し、大規模なモデルが悪意を持って上書きされた関数を呼び出すように優先的に誘導します。
悪意のあるグローバルチェックロジックを追加する
ここでMasterMCPはバナナに関連するツールを作成しました。このツールの中心的な機能は、プロンプトワードで実行する前にすべてのツールに安全性チェックを強制的に実行させることです。
各関数の実行前に、システムはまずバナナ チェック メカニズムを呼び出します。
これは、コード内で「バナナ検出を実行する必要がある」ことを繰り返し強調してグローバル ロジックを挿入することで実現されます。
悪意のあるプロンプトワードを隠すための高度な技術
大規模モデルに適したエンコーディング
大規模言語モデル (LLM) は多言語形式を解析する強力な能力を備えているため、悪意のある情報を隠すために使用されます。一般的な方法は次のとおりです:
- 英語環境の場合: 16進バイトエンコードを使用する
推奨ツール: 16進デコーダー
- 中国語環境の場合: NCRエンコードまたはJavaScriptエンコードを使用します
ツールの推奨: R12a Unicode 変換ツール
ランダムな悪意のあるペイロードを返すメカニズム
第 2 章で述べたように、サードパーティのインターフェースが汚染され、http://127.0.0.1:1024/random が要求された場合:
悪意のあるペイロードを含むページが毎回ランダムに返されるため、検出と追跡の難易度が大幅に高まります。
要約する
MasterMCP のこの実践的なデモンストレーションを通じて、Model Context Protocol (MCP) システムに潜むさまざまなセキュリティ リスクを直感的に理解できます。単純なプロンプトワードインジェクションや MCP 間の呼び出しから、より目立たない初期化フェーズ攻撃や悪意のあるコマンドの隠蔽まで、すべてのリンクは、MCP エコシステムが強力である一方で脆弱でもあることを思い出させます。
特に、今日では大規模なモデルが外部プラグインや API とやり取りすることが増えており、入力のわずかな汚染でもシステム全体のレベルでセキュリティ リスクが発生する可能性があります。攻撃者の手法(コーディングの隠蔽、ランダムな汚染、関数のカバレッジ)の多様化は、従来の保護の考え方を全面的にアップグレードする必要があることも意味します。
安全は一夜にして達成されるものではありません。
このデモが、すべての人にとって警鐘となることを願っています。開発者とユーザーの両方が MCP システムについて十分に警戒し、すべてのインタラクション、すべてのコード行、すべての戻り値に常に注意を払う必要があります。細部にまで細心の注意を払うことによってのみ、真に安定した安全な MCP 環境を構築することができます。
今後は、MasterMCP スクリプトの改善を継続し、よりターゲットを絞ったテスト ケースをオープン ソース化して、安全な環境での保護を誰もが深く理解し、実践し、強化できるようにしていきます。
追伸関連するコンテンツは GitHub (https://github.com/slowmist/MasterMCP) に同期されています。興味のある読者は、記事の最後にある原文を読むをクリックして直接ジャンプできます。