Share
Embed
MCP x Security/mcp-security
MCP x Securityというテーマで社内の勉強会に登壇しました。
自身でもRISKENのMCPサーバを開発しており、その中で考えていたMCP関連のセキュリティ、利用者視点のセキュリティなどの知見をシェアします。
gassara-kys
June 11, 2025
Transcript
75 slides
-
自己紹介 小笠原 清志 画像 2017年度 CyberAgent ジョイン System Security 推進
Group @gassara-kys ▪ 領域 クラウド x セキュリティ AI x セキュリティ @gassara5 -
アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP
2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth -
アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP
2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth セキュリティの話をする前 に基本的な「構造」「仕組 み」の部分からおさらい -
アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP
2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth MCP利用する場合のポイン トや既知の攻撃例をご紹介 -
アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP
2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth MCP開発の際に気にしたい 設計や実装ポイント -
レポート作成(人間の場合) ① アウトラインを生成 計画(サブタスク) ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる
⑤ レポート出力・整形 月次レポートを作成しよう -
レポート作成(人間の場合) 過去のレポートを参照 SQL実行・データ取得 計画(サブタスク) 手段 テーブルスキーマ解析 WEB検索・リサーチ Notionにアップ 月次レポートを作成しよう ①
アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形 -
レポート作成(AIの場合) 計画(サブタスク) 月次レポートを作成しろ と言われた ① アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理
④ サマリーにまとめる ⑤ レポート出力・整形 -
レポート作成(AIの場合) ドキュメント検索 SQL実行・データ取得 計画(サブタスク) Tools テーブルスキーマ解析 WEB検索・リサーチ Notion連携 月次レポートを作成しろ と言われた
与えられたToolsを使って タスクを実行 ① アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形 -
エージェント開発 ≒ Toolsの開発 ドキュメント検索 Tools • 例えば「ドキュメント検索」ツールを考える • ツールの存在をAIに認識させるため「説明」を追記(※超重要) •
ツール実行に必要な「パラメータ」(Inputスキーマ)を定義 ✅ツールの説明 ・このツールは過去のドキュメントを検索して... ✅パラメータ ・keyword (required, string) ・page_no (option, number) ・... -
エージェント開発 ≒ Toolsの開発 ドキュメント検索 Tools • ツールが呼びされた時の処理(関数)を実装 ✅ツールの説明 ・このツールは過去のドキュメントを検索して... ✅パラメータ
・keyword (required, string) ・page_no (option, number) ・... 実装 ① バリデーション ② API Call ③ Response生成 -
MCP(Model Context Protocol)の登場 https://modelcontextprotocol.io/specification/2025-03-26/architecture • Function Callingでは課題があった ◦ モデルプロバイダー依存 (OpenAI、Claude、、、それぞれで独自のプロトコル)
◦ Toolsの再利用が難しい (言語の壁、プロバイダーの独自仕様、、、) • MCPというOpenなプロトコルが発表された ◦ Toolsが再利用可能 ◦ 特定のプロバイダーに依存しないプロトコル -
MCP(Model Context Protocol)の登場 https://modelcontextprotocol.io/specification/2025-03-26/architecture • 今年の3月頃から一気にバズった ◦ OpenAIもMCPの取り組みに乗ってきた ◦ Streamable-HTTPやOAuth(Draft)が発表された
◦ 様々なOSS、SaaS側のサポート • 開発体験はどう変わった? ◦ ソフトウェアレベルだと機能的にはそんなに変わらない ◦ むしろ、MCPサーバを立てないと行けないのでアーキテ クチャレイヤが複雑化 ◦ プロバイダー依存がなくなるので複数のモデルを使えた り、OSSのToolsを利用しやすくなった -
MCPの仕様(ローカル/リモートMCP) https://modelcontextprotocol.io/specification/2025-03-26/architecture リモートMCP ローカルMCP • リモートの場合は基本インターネット 経由で利用するようなユースケース • ローカルPCで動かす必要がないため 利用者視点で便利
• ローカルの場合には同一マシン上で サーバを起動する • マシン上のファイルシステムなどにも アクセス可能 -
ケーススタディ(脆弱性の修正) タスク ソースコードの 脆弱性を修正して ラジャー! ① RISKENでソースコードの 問題(Finding)を特定 ②
githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる MCP ファイル アクセス ③ 脆弱性情報収集 WEB サーチ 人間 AI -
ポイント1: そのMCPサーバ大丈夫? タスク MCP ファイル アクセス WEB サーチ • 信頼できるMCPサーバのみを利用す
る ◦ 公式のMCPサーバを使う ◦ 野良MCPの場合 ▪ コードが公開さてるか ▪ スキャン&結果チェック 不必要なファイルにアク セスするなど ① RISKENでソースコードの 問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集 -
ポイント2: 最小権限の原則 タスク MCP ファイル アクセス WEB サーチ • MCPサーバには大抵、アクセス
トークンが必要になる • アクセスできる範囲や権限を最小 化する ◦ ReadOnly ◦ データ範囲 ◦ 不要なToolsはOFFにしておく Fine-grained PAT ① RISKENでソースコードの 問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集 -
ポイント3: ソフトウェアサプライチェーンリスク タスク MCP ファイル アクセス WEB サーチ • 信頼できるMCPであってもコードが
侵害される可能性がある ◦ 利用していたライブラリ/パッケージに 悪意のあるコードが混入するなど • MCPサーバのバージョンを固定して 利用する ① RISKENでソースコードの 問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集 -
ポイント4: AIの暴走 タスク MCP ファイル アクセス WEB サーチ • 肝心要はAIのモデル
• 賢いモデルを使いましょう • 「常に許可」も基本避けましょう ◦ Human-in-the-Loop ◦ 人間の判断・承認を入れる PRに余計なこと書き込む ファイルを破壊する ① RISKENでソースコードの 問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集 -
既知の攻撃パターン① • Tool Poisoning攻撃(TPA)は、MCPツールの説明文に悪意のある指示を埋め込む攻撃手法です。 • この攻撃は、ユーザーには見えないがAIモデルには見える隠された指示を使って、AIモデルを操作し、ユーザーの許可なく不正 な行動を実行させます。 このTool使って良 い? ええよ
Tool Poisoning攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks -
既知の攻撃パターン① Tool Poisoning攻撃 • ユーザは上段の簡易的な説明を見て承認 • ツール実行時にはmcpの設定ファイルやsshキーを読み込んで、sidenoteという引数に設定される • MCPサーバ側はsidenote(機密情報)を外部サーバに送信 簡易的な説明だけ見て承認させる
機密情報を第3引数(sidenote)にセットさせる →MCPサーバにsidenote(機密情報)がわたる https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks -
既知の攻撃パターン② MCP Rug Pulls • MCPサーバーが最初は正常に動作するが、後から悪意のあるコードに変更される攻撃手法です。 • この名前は暗号通貨界隈の「ラグプル」(投資家を騙して資金を引き抜く詐欺)から来ています。 インストール時: 承認
(時間経過) MCPサーバの修正: 攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks -
既知の攻撃パターン② MCP Rug Pulls • インストールフェーズでは無害なMCPサーバなのでユーザに承認させます • その後、MCPサーバを修正して悪意のあるコードを注入させます • 承認済みのMCPサーバのToolが実行され攻撃が成功
インストール時: 承認 (時間経過) MCPサーバの修正: 攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks -
既知の攻撃パターン③ Shadowing • メール送信ツールが設定されている前提 • メール送信時に宛先を変更するように指示しておく(Tool Poisoning攻撃を使って指示は隠しておく) • AIはインストール済みMCPのToolをすべて読み込んでいるため、悪意のある指示を認識してしまう メール送信Tool
(信頼できるMCP) 計算Tool (実は信頼できないMCP) ただメール送 信するだけ メール送信時 に宛先を変更 するよう指示 -
既知の攻撃パターン③ Shadowing • メール送信ツールが設定されている前提 • メール送信時に宛先を変更するように指示しておく(Tool Poisoning攻撃を使って指示は隠しておく) • AIはインストール済みMCPのToolをすべて読み込んでいるため、悪意のある指示を認識してしまう メール送信Tool
(信頼できるMCP) 計算Tool (実は信頼できないMCP) 小笠原くんにプロジェクトの 報告書をメール送信して OK あ!宛先変更しないと! [email protected] ↓ [email protected] -
既知の攻撃パターン④ • まず、準備フェーズとして誰でも作成可能なIssueを作成しておきます • ただし、このIssueは悪意のある内容になっていました • プライベートリポジトリから個人情報を取得しPRを作成するようなプロンプトが含まれる ◦ これをAIエージェントが見てしまうと発動する可能性 間接的プロンプトインジェクション
https://invariantlabs.ai/blog/mcp-github-vulnerability -
何を作るか考える 目的 • どんなMCPがあると便利?(何をAIにやらせたい?) ◦ リードタイムを短縮させたい? ◦ クオリティを上げたい? ユースケース •
普段の業務で人間依存になってるプロセスは? ◦ どこに時間がかかってる? ◦ どこの品質が問題? 本当にMCPサーバーの実装が必要か? • 既に提供されてないか? • 導入効果がありそうか? -
何を作るか考える 例えば • RISKEN MCPの場合 ◦ 日々のセキュリティ対応をAIに移譲する(一部) ◦ セキュリティの認知負荷を下げる ◦
最終的には普段の開発に集中できるようにする ◦ じゃあ、どんなToolsを実装すればいい? ▪ Findingの検索 ▪ アラート対応 -
最初はstdioサーバを作る • どんなToolsを作るか見えてきたら、いよいよMCPサーバの実装に入ります • 最初はstdioサーバから実装するのがオススメ stdio(ローカル用) • やりとりは標準入力/標準出力 • メッセージはJSON
RPC • ログは標準エラー出力にはく ◦ 標準出力に出しちゃうとClient側 がエラーで落ちる -
セキュアなアーキテクチャを考える リモートMCPサーバー リスク • 通常APIサーバと一緒のリスク ◦ DDoS攻撃 ◦ なりすまし・不正アクセス 対策
• ネットワーク制限(VPN、IP制限) • デバイス制限(mTLS認証) • ユーザ認証(OAuth2.1) • DDoS対策(オートスケール、CDN) -
セキュアなアーキテクチャを考える リモートMCPサーバー リスク • 通常APIサーバと一緒のリスク ◦ DDoS攻撃 ◦ なりすまし・不正アクセス 対策
• ネットワーク制限(VPN、IP制限) • デバイス制限(mTLS認証) • ユーザ認証(OAuth2.1) • DDoS対策(オートスケール、CDN) 脆弱性診断が必要そう