ネクストステップMCPセキュリティ:【第1回】MCPアーキテクチャの深層解析 - セキュリティホールはどこに潜むのか？

## はじめに
**「ネクストステップMCPセキュリティ: 仕組みの弱点と堅牢化への航路」** と題して、全20回にわたる新しいブログシリーズを開始します。本シリーズは、以前の「[MCP (Model Context Protocol) のセキュリティ](https://qiita.com/QueryPie/items/6211cdc6d7c55697221d)」シリーズでMCPの基本を学ばれた皆様を対象に、より深くMCPのセキュリティに焦点を当て、その仕組みの弱点や、それらをいかに堅牢化していくかについて掘り下げていきます。

デジタル技術の進化は、私たちに計り知れない恩恵をもたらす一方で、常に新たなセキュリティリスクを生み出してきました。特に、AIと外部システムを連携させる「MCP（Model Context Protocol）」のような新しいプロトコルは、その複雑性と柔軟性ゆえに、設計段階からセキュリティを考慮しなければならない多くの課題を内包しています。

第1回となる本記事では、**「MCPアーキテクチャの深層解析 - セキュリティホールはどこに潜むのか？」** と題し、MCPの内部構造と各コンポーネント間の相互作用を詳細に分析します。これにより、アーキテクチャレベルでセキュリティ脆弱性がどのように発生しうるのかを理解し、その設計段階から考慮すべきセキュリティ原則について解説していきます。

AIと外部世界を結ぶ架け橋であるMCPを、安全に、そして最大限に活用していくための第一歩として、その基盤となるアーキテクチャを深く理解していきましょう。

## 1. MCPアーキテクチャの深層解析
MCPのセキュリティ課題を理解するためには、まずその内部構造と通信フローを正確に把握することが不可欠です。MCPは、単一のサーバーやクライアントで完結するものではなく、複数のコンポーネントが連携して機能する分散システムとして捉えることができます。

#### 1.1. MCPの主要コンポーネントと通信フロー
MCPシステムは、概ね以下の主要コンポーネントから構成されます。

- **AIモデル（LLM: Large Language Model）:**
    - ユーザーからの要求やコンテキストを受け取り、処理を行うAIの中核部分です。多くの場合、大規模言語モデルがこれに該当します。
    - 自ら直接外部システムと通信するのではなく、Context ManagerやMCP Serverを介して外部リソースやツールを利用します。
- **Context Manager（コンテキストマネージャー）:**
    - AIモデルがタスクを実行するために必要な「コンテキスト（文脈情報）」を管理するコンポーネントです。
    - 対話履歴、ユーザーの好み、過去の行動、外部から取得した情報など、多岐にわたるコンテキストを収集・整理し、AIモデルに最適な形で提供します。
    - また、AIモデルからのツール利用要求を解釈し、適切なMCP Serverへ転送する役割も担います。
- **MCP Server（モデルコンテキストプロトコルサーバー / ツールサーバー）:**
    - 外部のツールやデータソースへのゲートウェイとなるコンポーネントです。
    - Context Managerから受け取ったリクエストを、外部ツールやデータソースが理解できる形式に変換し、実行結果をContext Managerに返します。
    - 「リソース（ファイルやデータベースなどAIが参照できるデータ）」や「ツール（API呼び出しなどAIが実行できるアクション）」を定義し、提供します。
- **External Tools/Data Sources（外部ツール・データソース）:**
    - データベース、SaaSアプリケーション（例: Salesforce, Slack, GitHub）、API、ファイルシステムなど、MCP Serverを介してAIモデルがアクセスする実際の情報源や実行環境です。

これらのコンポーネントは、以下のような通信フローで連携します。

**MCPシステムにおける情報の流れ (概念図)**

![スクリーンショット 2025-06-12 午後5.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058228/60c59006-2961-4ee1-a102-8a063e43a1e4.png)


この図は、ユーザーの要求がAIモデルからContext Manager、MCP Serverを経由して外部システムに到達し、その結果が逆順でユーザーに戻る基本的な流れを示しています。

#### 1.2. 各コンポーネント間の相互作用の詳細分析
各コンポーネント間の相互作用は、MCPシステムの機能性とセキュリティに大きく影響します。

- **AIモデルとContext Manager間:**
    - AIモデルは、その処理能力の限界から、全てのコンテキストを内部で保持することはできません。Context Managerは、AIモデルが必要とする時に必要なコンテキストを動的に提供することで、AIモデルの能力を拡張します。
    - このやり取りでは、AIモデルが何を要求しているのか、Context Managerがどのようなコンテキストを提供しているのかが重要になります。不適切なコンテキスト提供は、AIの誤った判断や行動につながる可能性があります。例えば、ユーザーが不適切なプロンプトを Context Manager に送ることで、Context Manager が AI モデルに誤ったコンテキストを与え、結果として AI モデルが意図しない行動を取る可能性があります。
- **Context ManagerとMCP Server間:**
    - この区間は、AIの「意図」を具体的な「操作」に変換する重要な橋渡し役です。Context ManagerはAIモデルの要求を解釈し、MCPプロトコルに基づいてMCP Serverへリクエストを送信します。
    - MCP Serverは、そのリクエストを受け取り、定義されたツールやリソースに対応する処理を実行します。この際、Context Managerが送るリクエストが、意図しないツール呼び出しやパラメータの悪用を引き起こさないかが重要なセキュリティポイントとなります。例えば、Context Managerが本来アクセスを許可されていないツールを呼び出そうとしたり、ツールのパラメータに不正な値を注入しようとしたりするリスクが考えられます。
- **MCP Serverと外部ツール/データソース間:**
    - MCP Serverは、外部ツールのAPIキーや認証情報、データベースへの接続情報などを管理し、これらのリソースへのアクセスを代行します。
    - この部分のセキュリティが甘いと、MCP Serverが侵害された際に、接続されている全ての外部システムに不正アクセスされる「単一障害点」となるリスクがあります。これは、集中管理された認証情報が攻撃者に悪用される一般的なリスクとして知られています。

## 2. アーキテクチャレベルでのセキュリティ脆弱性の発生要因
MCPのアーキテクチャは、その設計自体に潜在的なセキュリティ脆弱性の発生要因を内包しています。

#### 2.1. 設計上の複雑性
MCPシステムは複数の分散コンポーネントと多様なインタフェースから構成されるため、全体の構造が複雑になりがちです。この複雑性こそが、セキュリティの脆弱性を見落とす主要な要因となります。例えば、各コンポーネント間の通信プロトコル、データ形式、エラー処理の連携ミスなどがセキュリティホールを生む可能性があります。複雑なシステムほど、脆弱性の発見と修正が困難になる傾向があります。

#### 2.2. コンテキストの広範な利用
MCPの核となる「コンテキスト」は、AIの振る舞いを大きく左右する重要な情報です。このコンテキストが、設計段階で不適切に扱われると、以下のような脆弱性につながります。

- **コンテキスト汚染:** 意図しないデータがコンテキストとしてAIモデルに注入され、AIの判断が歪められる。これは、AIが不正な情報に基づいて行動する原因となり得ます。例えば、悪意のあるユーザーが送った情報が、Context Managerによって正しいコンテキストとして誤って扱われ、AIモデルに渡されることで、AIが誤った情報に基づいて判断を下す可能性があります。
- **コンテキスト漏洩:** 機密性の高いコンテキスト情報が、許可されていないコンポーネントや外部に漏洩する。ユーザーの個人情報や、AIが処理した企業の機密データなどがこれに該当します。

#### 2.3. 信頼境界の曖昧さ
従来のシステムでは、ネットワークの「内側」と「外側」で信頼境界が比較的明確でした。しかし、MCPのような分散アーキテクチャでは、複数のコンポーネントが異なる信頼レベルで連携するため、どこまでを信頼し、どこからを信頼しないかの境界が曖昧になりがちです。これにより、一度内部に侵入された場合に、攻撃者が横展開しやすくなるリスクがあります。これは、ゼロトラストの原則（後述）が重要になる理由の一つです。

#### 2.4. 異種システム間の連携
MCPは、AIモデルと多種多様な外部システム（データベース、SaaS、IoTデバイスなど）を連携させます。これらのシステムはそれぞれ異なるセキュリティ要件、脆弱性、パッチ適用状況を持つため、最も弱いリンクが全体のセキュリティリスクとなる可能性があります。異なるデータ形式やプロトコル間の変換ロジックに不備があると、データ改ざんやインジェクション攻撃の温床となることも考えられます。

#### 2.5. 動的な挙動（エージェント性）
AIモデルが自律的に外部ツールを呼び出し、アクションを実行する「エージェント性」は、MCPの強力な特徴です。しかし、この動的な挙動は、予期せぬツール呼び出しや、意図しない操作につながるリスクをはらんでいます。AIが自律的に判断を下す際、その判断の基となるコンテキストやルールに不備があれば、セキュリティリスクが顕在化します。例えば、AIが過学習や予期せぬ振る舞いにより、許可されていない操作を実行しようとする可能性も考慮すべきです。

![2. アーキテクチャレベルでのセキュリティ脆弱性の発生要因 - visual selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058228/ba5b7a6f-8dfb-4cae-8499-fc1f411e4d59.png)


## 3. 設計段階から考慮すべきセキュリティ原則
これらのアーキテクチャレベルの脆弱性を未然に防ぐためには、開発プロセスの初期段階、つまり「設計段階」からセキュリティを組み込むことが極めて重要です。ここでは、MCPシステムを堅牢にするための基本的なセキュリティ原則を紹介します。

#### 3.1. 最小権限の原則 (Principle of Least Privilege)
- **説明:** 各コンポーネント（AIモデル、Context Manager、MCP Server）や、MCP Serverがアクセスする外部ツール・データソースに対して、その機能遂行に **必要最小限の権限** のみを与えるという原則です。権限が多すぎると、たとえ一部が侵害されただけでも被害が拡大するリスクがあります。
- **MCPへの適用:** 例えば、MCP Serverは、特定の外部ツールに対してデータの読み取り権限しか必要ないにもかかわらず、書き込み権限まで与えてしまうと、万が一MCP Serverが侵害された場合に被害が拡大します。AIモデルも、Context Managerから必要以上のコンテキスト情報を受け取らないように設計すべきです。

#### 3.2. セキュアバイデザイン (Security by Design)
- **説明:** ソフトウェア開発ライフサイクル（SDLC）の**全てのフェーズ**、特に設計段階からセキュリティを考慮し、システムに組み込むというアプローチです。セキュリティを後から「付け足す」のではなく、最初から「設計する」ことを意味します [1]。
- **MCPへの適用:** MCPシステムを構築する際には、コンポーネント間の通信方式、データフロー、認証・認可の仕組み、エラー処理、ロギングなどを設計する段階で、セキュリティリスクを特定し、その対策を盛り込むべきです。これにより、設計上の脆弱性を早期に発見し、修正することが可能になります。

#### 3.3. 防御の多層化 (Defense in Depth)
- **説明:** 一つのセキュリティ防御層が破られても、次の防御層で攻撃を食い止められるように、複数の異なるセキュリティ対策を組み合わせる原則です。まるで城を囲む複数の壁のように、どこか一つの防御が破られても、他の防御がシステム全体を守ります。
- **MCPへの適用:** 例えば、ネットワークレベルでのファイアウォール、コンポーネント間の厳格な認証・認可メカニズム、データの暗号化、入力検証、そして継続的な監視・ログ分析など、様々なレイヤーでセキュリティ対策を講じることで、全体としてのセキュリティを向上させます。

#### 3.4. 信頼しない設計（ゼロトラスト原則）の適用
- **説明:** 「社内ネットワークは安全である」という従来の考え方を捨て、「**何も信頼しない。常に検証する**」という前提でシステムを設計する原則です。内部ネットワークからのアクセスであっても、常に厳格な認証と認可、そして継続的な監視を行います [2]。
- **MCPへの適用:** 各コンポーネント間の通信は、たとえ内部ネットワーク内であっても認証を必須とし、アクセス制御を厳格に行うべきです。Context ManagerからMCP Serverへのリクエスト、MCP Serverから外部ツールへのアクセスなど、あらゆる境界で検証を徹底します。これにより、攻撃者が内部に侵入した場合でも、横展開を防ぎやすくなります。

#### 3.5. 堅牢な入力検証とサニタイズ
- **説明:** 外部（ユーザー、他のコンポーネント、外部システムなど）からシステムに入力されるデータは、**決して信用せず**、その形式、内容、サイズなどを厳格に検証し、必要に応じて無害化（サニタイズ）する原則です。これにより、不正なデータやコードの注入を防ぎます。
- **MCPへの適用:** Context ManagerがAIモデルや外部システムから受け取るコンテキストデータ、MCP ServerがContext Managerから受け取るツール呼び出しのパラメータなど、全ての入力に対して徹底した検証を行う必要があります。これにより、SQLインジェクションやコマンドインジェクション（不正なコードを注入してシステムを操作しようとする攻撃）などを防ぐことができます。

#### 3.6. 監査証跡とロギング
- **説明:** システム内で発生する全ての重要な操作やイベントを詳細に記録（ロギング）し、後からその記録を追跡・分析できる状態にする原則です。これにより、セキュリティインシデント発生時の原因究明や、異常な振る舞いの検知が可能になります。
- **MCPへの適用:** AIモデルがどのツールをいつ呼び出したか、Context ManagerがどのコンテキストをどのAIモデルに提供したか、MCP Serverがどの外部ツールにアクセスしたかなど、詳細なログを取得し、セキュアに保存することが重要です。ログは、問題発生時の「証拠」として、また将来の脅威分析のための「データ」として機能します。

![3. 設計段階から考慮すべきセキュリティ原則 - visual selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4058228/cb37d326-adb9-4dfb-b10e-393844f98f77.png)


## まとめ
本記事では、MCPの内部アーキテクチャを深掘りし、AIモデル、Context Manager、MCP Server、外部ツール・データソースといった主要コンポーネント間の相互作用について解説しました。そして、そのアーキテクチャレベルに潜むセキュリティ脆弱性の発生要因、特に「コンテキスト」の取り扱いがもたらすリスクや、動的な挙動の課題を指摘しました。

さらに、これらの脆弱性を未然に防ぐために、設計段階から「最小権限の原則」「セキュアバイデザイン」「防御の多層化」「ゼロトラスト原則」「堅牢な入力検証」「監査証跡とロギング」といった重要なセキュリティ原則を適用することの重要性を強調しました。

MCPが提供する未来の便利さを享受するためには、その基盤を理解し、初期段階からセキュリティを考慮した堅牢なシステムを構築することが不可欠です。

次回の【第2回】では、MCPセキュリティの最も特徴的な脅威の一つである「コンテキスト汚染攻撃」に焦点を当て、AIの記憶を狙う新たな攻撃手法とその全貌について詳しく解説していきます。お楽しみに！

#### 参考文献:

[1] Open Web Application Security Project (OWASP). "Secure by Design". https://owasp.org/www-community/Secure_by_Design (参照日: 2025年4月18日).

[2] National Institute of Standards and Technology (NIST). "NIST Special Publication 800-207: Zero Trust Architecture". https://doi.org/10.6028/NIST.SP.800-207 (参照日: 2025年4月18日).