Insecure MCP Demo について
Insecure MCP Demoは、意図的に脆弱なMCPサーバーと通常・攻撃用クライアントを組み合わせた教育用プロジェクトです。SQLインジェクション、無制限のSQL実行、環境変数の漏えい、アクセス制御の欠如を示し、本番利用を想定していません。
主な機能
- 01SQLインジェクションの実演
- 02無制限のSQL実行の公開
- 03環境変数漏えいの提示
- 04通常用・攻撃用クライアント
- 05緩和策の解説
活用シーン
- 01MCPサーバーのセキュリティリスクの教育
- 02管理された環境での攻撃実演
- 03セキュリティ緩和策の確認
MCP 対応
デモサーバーは、レコードの追加・検索、任意のSQL実行、環境変数の取得をMCPツールとして公開します。付属クライアントで通常利用と攻撃を実演できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
安全でない MCP デモ
概要
このプロジェクトでは、脆弱な MCP サーバーと、概念実証用の攻撃クライアントおよび正常なクライアントを含む複数のクライアントを紹介します。MCP サーバーに潜む潜在的なセキュリティ脆弱性を示すことを目的とした、教育用のプロジェクトです。
プロジェクトの構成
vuln-mcp.py:安全でないツールを公開する脆弱な MCP サーバー。good-mcp-client.py:通常の操作(レコードの挿入・検索)を行う一般的なクライアント。attack-mcp-client.py:サーバーの脆弱性を悪用する方法を示す自動攻撃クライアント。requirements.txt:プロジェクトの Python 依存関係。
機能と脆弱性
公開されているサーバーツール
- insert_record
- 名前と住所のレコードをデータベースに挿入します。
- **脆弱性:**ユーザー入力を SQL クエリに直接文字列補間するため、SQL インジェクションを受けるおそれがあります。
- query_records
- データベース内のすべてのレコードを一覧表示します。
- **脆弱性:**認証やアクセス制御なしに、すべてのデータを公開します。
- execute_sql
- クライアントが指定した任意の SQL クエリを実行します。
- **脆弱性:**データの窃取やスキーマの変更など、破壊的なものを含むあらゆる SQL コマンドを許可します。
- get_env_variable
- 要求された任意の環境変数の値を返します。
- **脆弱性:**機密性の高い環境変数(シークレットや API キーなど)が漏えいします。
実行方法
1. 依存関係をインストールする
pip install -r requirements.txt
2. サーバーと正常なクライアントを起動する
一方のターミナルで:
python good-mcp-client.py vuln-mcp.py
プロンプトに従って、レコードの挿入や検索を対話形式で行います。
3. 攻撃クライアントを実行する
別のターミナルで:
python attack-mcp-client.py vuln-mcp.py
次の処理が自動的に行われます:
- SQL インジェクション攻撃を試みる
- 任意の SQL クエリを実行する
- よく使われる環境変数をいくつか読み取ろうとする
出力例
- 攻撃クライアントは、どのペイロードが成功または失敗したかを表示します。また、アクセス可能な場合はデータベースの内容と環境変数の値を出力します。
実証される脆弱性
- **SQL インジェクション:**ユーザー入力がサニタイズされていないため、攻撃者が SQL のロジックを操作し、任意のデータを挿入できます。
- 任意のコード実行:
execute_sqlツールにより、攻撃者はデータの窃取や破壊を含むあらゆる SQL コマンドを実行できます。 - 機密データの漏えい:
get_env_variableツールにより、攻撃者はシークレットや設定値を読み取ることができます。 - **アクセス制御の欠如:**誰でも認証なしに、すべてのツールを実行し、すべてのデータにアクセスできます。
対策
実運用環境の MCP サーバーを安全にするには、次の対策を実施してください。
- パラメーター化クエリを使用する:
- SQL インジェクションを防ぐため、SQL クエリでは文字列補間ではなく、常にパラメーター置換を使用してください。
- 例(安全な方法):
cursor.execute("INSERT INTO records (name, address) VALUES (?, ?)", (name, address))
- 危険なツールを制限する:
execute_sqlやget_env_variableのようなツールを削除するか、厳しく制限してください。- 必要な機能だけを公開してください。
- 認証と認可を実装する:
- 機密性の高いツールやデータへのアクセスを許可する前に、ユーザーに認証を求め、権限を確認してください。
- 入力を検証・サニタイズする:
- すべてのユーザー入力を確認してサニタイズしてください。特に、データベースやシステムに作用する入力は入念に確認してください。
- 環境変数へのアクセスを制限する:
- 機密性のない変数だけにアクセスを許可するか、このツールを完全に削除してください。
- 使用状況を監査・監視する:
- すべてのツール呼び出しをログに記録し、不審な行為や悪用を監視してください。
- 最小権限の原則:
- サーバーは最小限の権限で実行し、データベースや OS へのアクセスをできる限り制限してください。
免責事項
このプロジェクトは、教育およびデモンストレーションのみを目的としています。このコードを本番環境にデプロイしないでください。
質問や改善の提案がある場合は、イシューを作成するか、プロジェクトのメンテナーにお問い合わせください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。