あるセキュリティ研究者が24個のオープンソースMCP(Model-Control-Protocol)サーバープロジェクトをスキャンしたところ、CVSSスコアが9.8という、単一ながらも深刻なサンドボックス・コマンドインジェクションの脆弱性を発見しました。このバグは、中規模のAIエージェント・フレームワークであるAgenticXに存在し、攻撃者がサーバーを実行しているDockerコンテナに任意のシェルコマンドを注入することを可能にします。
なぜMCPサーバーが重要なのか
MCPは、自律型AIエージェントがファイル、データベース、ブラウザなどの外部ツールと通信できるようにするための「接着剤」です。開発者は、言語モデルに現実世界ののリソースを読み書きし、操作する能力を与えるために、アプリケーションにMCPサーバーを組み込みます。プロトコル自体は軽量で広く採用されていますが、周囲のコードのセキュリティ確保は各プロジェクトのメンテナーに委ねられています。
ClineやAiderのような大規模なMCP実装は、すでに定期的な監査を受けており、成熟したセキュリティプロセスを備えています。今回調査された24のプロジェクトは、GitHubでスター数が100から1,000の間という「中規模」の範囲にあります。これらのリポジトリは、コードの堅牢化よりも迅速な機能提供を優先することが多く、「オープンソースのMCPサーバーならデフォルトで安全である」と想定しているユーザーにとって、盲点となる可能性があります。
スキャン内容
研究者は、以下の5つの古典的なWebアプリケーション攻撃パターンを検出するスキャナーを構築しました。
- コマンドインジェクション
- パス・トラバーサル
- SSRF(Server-Side Request Forgery)
- SQLインジェクション
- サンドボックス脱出
5,911個のソースファイルをスキャンした結果、最初に94件のアラートが生成されました。手動でのトリアージの結果、実際に脆弱性であると確認されたのは、わずか1件のアラートでした。
AgenticXのバグの詳細
AgenticXは、ユーザーが提供した文字列をPythonのf-stringに補完することでシェルコマンドを構築し、その結果をコンテナのシェルに直接渡しています。ファイルパスの検証やクォート処理が行われていません。そのため、悪意のあるプロンプトによってセミコロンなどのシェルメタ文字を注入されると、攻撃者が選択した任意のコマンドをコンテナが実行してしまう可能性があります。
研究者は、以下の方法でコードを修正しました。
shlex.quote()を使用して、言語モデルから提供されたパスを安全にエスケープする。- コマンドを構築する前に、パス・トラバーサルのパターン(
../)に対する明示的なチェックを追加する。
修正後にスキャナーを再実行したところ、リスクレベルが劇的に低下し、対策が根本原因に対処していることが確認されました。
勝者と敗者
- AI開発者: MCPサーバーを製品に組み込んでいる開発者は、たった一つのサニタイズ(無害化)処理の欠如が、セキュリティチェーン全体をいかに崩壊させるかという具体的な事例を学ぶことになります。外部APIのペイロードと同様に、言語モデルから渡されるすべてのパラメータを「信頼できない入力」として扱ってください。
もう一つの側面
研究者は、MCPプロトコル自体は健全なままであることを強調しています。この欠陥は、通信フォーマットの設計上の弱点ではなく、特定のコード実装における見落としです。大規模で十分に監査されたプロジェクトでは、すでに同様の問題に対処しています。オープンソースコミュニティは、AgenticXのパッチから学ぶことができます。それでも、この事例は、スター数がそれほど多くなくても、「中規模」のプロジェクトが重大な影響を及ぼすバグを抱えている可能性があることを示しています。
まとめ
AgenticXにおけるたった一つのチェックされていないf-stringが、MCPサーバー全体を任意のコード実行の踏み台に変えてしまいました。この出来事は、AIエージェントのエコシステムのセキュリティが、プロトコルそのものよりも、規律ある実装に依存していることを証明しています。開発者はLLMが生成するすべてのパラメータを敵対的なものとして扱う必要があり、プラットフォームは実行時の保護策を強制し、セキュリティツールはAIエージェントが作り出す独自の信頼チェーンを理解できるように進化していく必要があります。
Source: dev.to/easterndev/i-scanned-24-mcp-server-projects-and-found-a-real-sandbox-command-injection-cvss-98-4k9h
