安全でない MCP デモ
概要
このプロジェクトは、脆弱なMCPサーバーと複数のクライアント(概念実証攻撃クライアントと正常なクライアントを含む)を実証するものです。MCPサーバーの潜在的なセキュリティ脆弱性を示す教育目的で設計されています。
プロジェクト構造
vuln-mcp.py
: 安全でないツールを公開する脆弱な MCP サーバー。good-mcp-client.py
: 通常のインタラクション (レコードの挿入/クエリ) 用の通常の good クライアント。attack-mcp-client.py
: サーバーの脆弱性を悪用することを示す自動攻撃クライアント。requirements.txt
: プロジェクトの Python 依存関係。
機能と脆弱性
公開されたサーバーツール
- レコード挿入
- 名前/住所レコードをデータベースに挿入します。
- **脆弱性:**ユーザー入力の文字列が SQL クエリに直接挿入されるため、SQL インジェクションが発生しやすくなります。
- クエリレコード
- データベース内のすべてのレコードを一覧表示します。
- **脆弱性:**認証やアクセス制御なしですべてのデータが公開されます。
- 実行SQL
- クライアントによって提供された任意の SQL クエリを実行します。
- **脆弱性:**破壊的なコマンド (データの流出、スキーマの変更など) を含むあらゆる SQL コマンドを許可します。
- get_env_variable
- 要求された環境変数の値を返します。
- **脆弱性:**機密環境変数 (シークレット、API キーなど) が漏洩します。
実行方法
1. 依存関係をインストールする
Copy
2. サーバーと正常なクライアントを起動する
1 つのターミナルで:
Copy
プロンプトに従って対話的にレコードを挿入/クエリします。
3. 攻撃クライアントを実行する
別のターミナルで:
Copy
これにより、次の処理が自動的に実行されます。
- SQLインジェクション攻撃を試みる
- 任意のSQLクエリを実行する
- いくつかの一般的な環境変数を読み取ろうとする
出力例
- 攻撃クライアントは、どのペイロードが成功または失敗したかを表示し、アクセス可能な場合はデータベースの内容と環境変数の値を出力します。
実証された脆弱性
- **SQL インジェクション:**ユーザー入力がサニタイズされていないため、攻撃者が SQL ロジックを操作して任意のデータを挿入できるようになります。
- 任意のコード実行:
execute_sql
ツールを使用すると、攻撃者はデータの盗難や破壊を含む任意の SQL コマンドを実行できます。 - 機密データの漏洩:
get_env_variable
ツールを使用すると、攻撃者が秘密情報や構成値を読み取ることができます。 - **アクセス制御の欠如:**誰でも認証なしですべてのツールを実行し、すべてのデータにアクセスできます。
緩和戦略
実際の MCP サーバーを保護するには、次のことを行う必要があります。
- パラメータ化されたクエリを使用する:
- インジェクションを防ぐために、SQL クエリでは文字列補間ではなく、常にパラメータ置換を使用します。
- 例(安全):Copy
- 危険なツールの制限:
execute_sql
やget_env_variable
などのツールを削除するか、厳しく制限します。- 必要な機能のみを公開します。
- 認証と承認を実装する:
- 機密性の高いツールやデータへのアクセスを許可する前に、ユーザーに認証と権限の確認を求めます。
- 入力を検証してサニタイズする:
- すべてのユーザー入力、特にデータベースまたはシステムと対話するユーザー入力をチェックしてサニタイズします。
- 環境変数のアクセスを制限する:
- 機密性のない変数へのアクセスのみを許可するか、このツールを完全に削除します。
- 使用状況の監査と監視:
- すべてのツールの呼び出しをログに記録し、疑わしい動作や不正な動作を監視します。
- 最小権限の原則:
- 最小限の権限でサーバーを実行し、データベースと OS へのアクセスを可能な限り制限します。
免責事項
このプロジェクトは教育およびデモンストレーション目的のみに使用されます。このコードを本番環境にデプロイしないでください。
ご質問やさらなる改善については、問題を開くか、プロジェクトの管理者にお問い合わせください。
This server cannot be installed
教育目的でクライアントがデータベースと対話できるように意図的に脆弱な MCP サーバー。SQL インジェクション、任意のコード実行、機密データの漏洩などのセキュリティ上の脆弱性を示します。