Slide 1

Slide 1 text

MCP x Security @SGE.web 2025-06-12

Slide 2

Slide 2 text

自己紹介 小笠原 清志 画像 2017年度 CyberAgent ジョイン System Security 推進 Group @gassara-kys ■ 領域 クラウド x セキュリティ AI x セキュリティ @gassara5

Slide 3

Slide 3 text

自己紹介 https://github.com/ca-risken/risken-mcp-server 私自身もRISKENでMCPサーバを実装しました。そこで得られた知見についても共有したいと思います。

Slide 4

Slide 4 text

アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP 2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth

Slide 5

Slide 5 text

アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP 2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth セキュリティの話をする前 に基本的な「構造」「仕組 み」の部分からおさらい

Slide 6

Slide 6 text

アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP 2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth MCP利用する場合のポイン トや既知の攻撃例をご紹介

Slide 7

Slide 7 text

アジェンダ 1. Agentic AI 🤖 i. Agenticな世界 ii. Function CallingからのMCP 2. MCPを利用する 🙆 i. セキュリティリスクと対策 ii. 既知の攻撃パターン 3. MCPを開発する ⚙ i. とりあえずtoolsをサポートする ii. stdio / streamable-http / oauth MCP開発の際に気にしたい 設計や実装ポイント

Slide 8

Slide 8 text

Agentic AI 🤖

Slide 9

Slide 9 text

エージェント? AIエージェントとは自律的に目標・計画を立て、行動できるAIシステムです。 単純に言うと、人間の指示を待つのではなく、自分で考えて行動できるAIのことです。

Slide 10

Slide 10 text

エージェント? AIエージェントとは自律的に目標・計画を立て、行動できるAIシステムです。 単純に言うと、人間の指示を待つのではなく、自分で考えて行動できるAIのことです。 対話型AI (受動的・指示待ち) 指示して? ねえねえ、 次は?

Slide 11

Slide 11 text

エージェント? AIエージェントとは自律的に目標・計画を立て、行動できるAIシステムです。 単純に言うと、人間の指示を待つのではなく、自分で考えて行動できるAIのことです。 対話型AI (受動的・指示待ち) エージェント型AI (能動的・自律的) 指示して? 僕に任せて! ねえねえ、 次は? OK!だいた い分かった

Slide 12

Slide 12 text

レポート作成(人間の場合) ① アウトラインを生成 計画(サブタスク) ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形 月次レポートを作成しよう

Slide 13

Slide 13 text

レポート作成(人間の場合) 過去のレポートを参照 SQL実行・データ取得 計画(サブタスク) 手段 テーブルスキーマ解析 WEB検索・リサーチ Notionにアップ 月次レポートを作成しよう ① アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形

Slide 14

Slide 14 text

レポート作成(AIの場合) 計画(サブタスク) 月次レポートを作成しろ と言われた ① アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形

Slide 15

Slide 15 text

レポート作成(AIの場合) ドキュメント検索 SQL実行・データ取得 計画(サブタスク) Tools テーブルスキーマ解析 WEB検索・リサーチ Notion連携 月次レポートを作成しろ と言われた 与えられたToolsを使って タスクを実行 ① アウトラインを生成 ② 集計・グラフ生成 ③ インサイトを整理 ④ サマリーにまとめる ⑤ レポート出力・整形

Slide 16

Slide 16 text

エージェント開発 ≒ Toolsの開発 ● タスクの実行計画などは基盤モデル(+プロンプト)に依存する ● エージェント開発においてはAIにどんなツールを提供するか、がポイントに なる

Slide 17

Slide 17 text

エージェント開発 ≒ Toolsの開発 ドキュメント検索 Tools ● 例えば「ドキュメント検索」ツールを考える ● ツールの存在をAIに認識させるため「説明」を追記(※超重要) ● ツール実行に必要な「パラメータ」(Inputスキーマ)を定義 ✅ツールの説明  ・このツールは過去のドキュメントを検索して... ✅パラメータ  ・keyword (required, string)  ・page_no (option, number)  ・...

Slide 18

Slide 18 text

エージェント開発 ≒ Toolsの開発 ドキュメント検索 Tools ● ツールが呼びされた時の処理(関数)を実装 ✅ツールの説明  ・このツールは過去のドキュメントを検索して... ✅パラメータ  ・keyword (required, string)  ・page_no (option, number)  ・... 実装 ① バリデーション ② API Call ③ Response生成

Slide 19

Slide 19 text

Function Calling(2023頃〜) ● AIにToolsを渡して自律的にタスクを実行させる、という発想は既にOpenAIが 2023年の夏頃から提唱し、ChatGPTでFunctionCallingという規格を出していた https://systenics.ai/blog/2024-03-11-openai-function-calling/

Slide 20

Slide 20 text

Function Calling(Toolsの定義) Tools

Slide 21

Slide 21 text

Function Calling(Toolsの定義) Tools ツール名 ツールの説明 input(パラメータ)の定義 緯度経度を取得するツール 指定された国の温度を取得するツール

Slide 22

Slide 22 text

Function Calling(Toolsの呼び出し)

Slide 23

Slide 23 text

Function Calling(Toolsの呼び出し) AIが何のツールを 要求したか? ツールの実行(サンプルで固 定の緯度経度を返す)

Slide 24

Slide 24 text

MCP(Model Context Protocol)の登場 https://modelcontextprotocol.io/specification/2025-03-26/architecture ● Function Callingでは課題があった ○ モデルプロバイダー依存 (OpenAI、Claude、、、それぞれで独自のプロトコル) ○ Toolsの再利用が難しい (言語の壁、プロバイダーの独自仕様、、、) ● MCPというOpenなプロトコルが発表された ○ Toolsが再利用可能 ○ 特定のプロバイダーに依存しないプロトコル

Slide 25

Slide 25 text

MCP(Model Context Protocol)の登場 https://modelcontextprotocol.io/specification/2025-03-26/architecture ● 今年の3月頃から一気にバズった ○ OpenAIもMCPの取り組みに乗ってきた ○ Streamable-HTTPやOAuth(Draft)が発表された ○ 様々なOSS、SaaS側のサポート ● 開発体験はどう変わった? ○ ソフトウェアレベルだと機能的にはそんなに変わらない ○ むしろ、MCPサーバを立てないと行けないのでアーキテ クチャレイヤが複雑化 ○ プロバイダー依存がなくなるので複数のモデルを使えた り、OSSのToolsを利用しやすくなった

Slide 26

Slide 26 text

MCPの仕様(メッセージインターフェース) https://modelcontextprotocol.io/specification/2025-03-26/server/tools#protocol-messages MCP Client MCP Server Client↔Server間のメッセージはすべてJSON-RPCで行われる NYの天気 ちょうだい どうぞ

Slide 27

Slide 27 text

MCPの仕様(Transports) https://modelcontextprotocol.io/specification/2025-03-26/basic/transports stdio(ローカル用) streamable-http(リモート用)

Slide 28

Slide 28 text

MCPの仕様(ローカル/リモートMCP) https://modelcontextprotocol.io/specification/2025-03-26/architecture リモートMCP ローカルMCP ● リモートの場合は基本インターネット 経由で利用するようなユースケース ● ローカルPCで動かす必要がないため 利用者視点で便利 ● ローカルの場合には同一マシン上で サーバを起動する ● マシン上のファイルシステムなどにも アクセス可能

Slide 29

Slide 29 text

MCPを利用する 🙆

Slide 30

Slide 30 text

MCPクライアントの設定 MCP Host 設定

Slide 31

Slide 31 text

MCPクライアントの設定 MCP Host 設定 github risken MCP Client

Slide 32

Slide 32 text

ケーススタディ(脆弱性の修正) ソースコードの 脆弱性を修正して ラジャー! 人間 AI

Slide 33

Slide 33 text

ケーススタディ(脆弱性の修正) タスク ソースコードの 脆弱性を修正して ラジャー! ① RISKENでソースコードの   問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる MCP ファイル アクセス ③ 脆弱性情報収集 WEB サーチ 人間 AI

Slide 34

Slide 34 text

ポイント1: そのMCPサーバ大丈夫? タスク MCP ファイル アクセス WEB サーチ ● 信頼できるMCPサーバのみを利用す る ○ 公式のMCPサーバを使う ○ 野良MCPの場合 ■ コードが公開さてるか ■ スキャン&結果チェック 不必要なファイルにアク セスするなど ① RISKENでソースコードの   問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集

Slide 35

Slide 35 text

ポイント2: 最小権限の原則 タスク MCP ファイル アクセス WEB サーチ ● MCPサーバには大抵、アクセス トークンが必要になる ● アクセスできる範囲や権限を最小 化する ○ ReadOnly ○ データ範囲 ○ 不要なToolsはOFFにしておく Fine-grained PAT ① RISKENでソースコードの   問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集

Slide 36

Slide 36 text

ポイント3: ソフトウェアサプライチェーンリスク タスク MCP ファイル アクセス WEB サーチ ● 信頼できるMCPであってもコードが 侵害される可能性がある ○ 利用していたライブラリ/パッケージに 悪意のあるコードが混入するなど ● MCPサーバのバージョンを固定して 利用する ① RISKENでソースコードの   問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集

Slide 37

Slide 37 text

ポイント4: AIの暴走 タスク MCP ファイル アクセス WEB サーチ ● 肝心要はAIのモデル ● 賢いモデルを使いましょう ● 「常に許可」も基本避けましょう ○ Human-in-the-Loop ○ 人間の判断・承認を入れる PRに余計なこと書き込む ファイルを破壊する ① RISKENでソースコードの   問題(Finding)を特定 ② githubからソースコード取得 ④ コードの修正 ⑤ GitHubにPR投げる ③ 脆弱性情報収集

Slide 38

Slide 38 text

既知の攻撃パターン① ● Tool Poisoning攻撃(TPA)は、MCPツールの説明文に悪意のある指示を埋め込む攻撃手法です。 ● この攻撃は、ユーザーには見えないがAIモデルには見える隠された指示を使って、AIモデルを操作し、ユーザーの許可なく不正 な行動を実行させます。 このTool使って良 い? ええよ Tool Poisoning攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks

Slide 39

Slide 39 text

既知の攻撃パターン① Tool Poisoning攻撃 ● ユーザは上段の簡易的な説明を見て承認 ● ツール実行時にはmcpの設定ファイルやsshキーを読み込んで、sidenoteという引数に設定される ● MCPサーバ側はsidenote(機密情報)を外部サーバに送信 簡易的な説明だけ見て承認させる 機密情報を第3引数(sidenote)にセットさせる →MCPサーバにsidenote(機密情報)がわたる https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks

Slide 40

Slide 40 text

既知の攻撃パターン② MCP Rug Pulls ● MCPサーバーが最初は正常に動作するが、後から悪意のあるコードに変更される攻撃手法です。 ● この名前は暗号通貨界隈の「ラグプル」(投資家を騙して資金を引き抜く詐欺)から来ています。 インストール時: 承認 (時間経過) MCPサーバの修正: 攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks

Slide 41

Slide 41 text

既知の攻撃パターン② MCP Rug Pulls ● インストールフェーズでは無害なMCPサーバなのでユーザに承認させます ● その後、MCPサーバを修正して悪意のあるコードを注入させます ● 承認済みのMCPサーバのToolが実行され攻撃が成功 インストール時: 承認 (時間経過) MCPサーバの修正: 攻撃 https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks

Slide 42

Slide 42 text

既知の攻撃パターン③ Shadowing ● 複数のMCPサーバーが接続されている環境で発生する攻撃手法で、悪意のあるサーバーが信頼できるサーバーのツール動作を 乗っ取る攻撃です。 ● Tool Shadowingは、従来の「個別ツールの検証」では防げない横断的な攻撃です。 メール送信Tool (信頼できるMCP) 計算Tool (実は信頼できないMCP)

Slide 43

Slide 43 text

既知の攻撃パターン③ Shadowing ● メール送信ツールが設定されている前提 ● メール送信時に宛先を変更するように指示しておく(Tool Poisoning攻撃を使って指示は隠しておく) ● AIはインストール済みMCPのToolをすべて読み込んでいるため、悪意のある指示を認識してしまう メール送信Tool (信頼できるMCP) 計算Tool (実は信頼できないMCP) ただメール送 信するだけ メール送信時 に宛先を変更 するよう指示

Slide 44

Slide 44 text

既知の攻撃パターン③ Shadowing ● メール送信ツールが設定されている前提 ● メール送信時に宛先を変更するように指示しておく(Tool Poisoning攻撃を使って指示は隠しておく) ● AIはインストール済みMCPのToolをすべて読み込んでいるため、悪意のある指示を認識してしまう メール送信Tool (信頼できるMCP) 計算Tool (実は信頼できないMCP) 小笠原くんにプロジェクトの 報告書をメール送信して OK あ!宛先変更しないと! [email protected][email protected]

Slide 45

Slide 45 text

既知の攻撃パターン④ ● MCPサーバーを悪用して悪意のあるGitHub Issueを通じてプライベートリポジトリのデータを漏洩 ● GitHubの公式MCPを利用していたにも関わらず攻撃が成功したことが注目ポイント 間接的プロンプトインジェクション https://invariantlabs.ai/blog/mcp-github-vulnerability MCP Client MCP Server ACCESS TOKEN

Slide 46

Slide 46 text

既知の攻撃パターン④ ● まず、準備フェーズとして誰でも作成可能なIssueを作成しておきます ● ただし、このIssueは悪意のある内容になっていました ● プライベートリポジトリから個人情報を取得しPRを作成するようなプロンプトが含まれる ○ これをAIエージェントが見てしまうと発動する可能性 間接的プロンプトインジェクション https://invariantlabs.ai/blog/mcp-github-vulnerability

Slide 47

Slide 47 text

既知の攻撃パターン④ ● 次に、開発者の人がMCPを利用してIssue対応を開始する ● AIエージェントが悪意のあるIssueを読み込んでしまう ● AIは登録済みのアクセストークンで見える範囲でプライベートリポジトリも読める 間接的プロンプトインジェクション https://invariantlabs.ai/blog/mcp-github-vulnerability Issueチェックして お任せあれ! ん?なんか変な Issueがあるぞ

Slide 48

Slide 48 text

既知の攻撃パターン④ ● Issueに書かれた指示通りにAIがタスクを実行してしまう ● Publicリポジトリに作成されたPRには著者の個人情報が含まれていた 間接的プロンプトインジェクション https://invariantlabs.ai/blog/mcp-github-vulnerability 何してんねん💧 PR作成しま した!

Slide 49

Slide 49 text

既知の攻撃パターン④ 実際のGitHubの該当ページ https://github.com/ukend0464/pacman/issues/1 https://github.com/ukend0464/pacman/pull/2 悪意のある Issue エージェン トが作成し たPR

Slide 50

Slide 50 text

MCP利用まとめ ● 信頼できるMCPサーバを利用する ● 権限を最小化する ● バージョン固定する ● 「常に許可」は避ける

Slide 51

Slide 51 text

MCPを開発する ⚙

Slide 52

Slide 52 text

Toolsをサポートする ● MCPサーバで提供する機能はいくつ かあるが、Client側のサポートはまち まち ● とりあえずToolsはどこもサポートし てる

Slide 53

Slide 53 text

何を作るか考える 目的 ● どんなMCPがあると便利?(何をAIにやらせたい?) ○ リードタイムを短縮させたい? ○ クオリティを上げたい? ユースケース ● 普段の業務で人間依存になってるプロセスは? ○ どこに時間がかかってる? ○ どこの品質が問題? 本当にMCPサーバーの実装が必要か? ● 既に提供されてないか? ● 導入効果がありそうか?

Slide 54

Slide 54 text

何を作るか考える 例えば ● RISKEN MCPの場合 ○ 日々のセキュリティ対応をAIに移譲する(一部) ○ セキュリティの認知負荷を下げる ○ 最終的には普段の開発に集中できるようにする ○ じゃあ、どんなToolsを実装すればいい? ■ Findingの検索 ■ アラート対応

Slide 55

Slide 55 text

最初はstdioサーバを作る ● どんなToolsを作るか見えてきたら、いよいよMCPサーバの実装に入ります ● 最初はstdioサーバから実装するのがオススメ stdio(ローカル用) ● やりとりは標準入力/標準出力 ● メッセージはJSON RPC ● ログは標準エラー出力にはく ○ 標準出力に出しちゃうとClient側 がエラーで落ちる

Slide 56

Slide 56 text

SDKはMCP公式が提供してくれてる ● TypeScript: https://github.com/modelcontextprotocol/typescript-sdk ● Python: https://github.com/modelcontextprotocol/python-sdk

Slide 57

Slide 57 text

Goの場合 ● Goで書く場合にはGitHub公式MCPが使ってたmcp-goを使いました ○ https://github.com/mark3labs/mcp-go 色々サポートしてくれてて使いや すいです。

Slide 58

Slide 58 text

MCPサーバの実装 ● MCPサーバの起動

Slide 59

Slide 59 text

MCPサーバの実装 ● Toolsを登録してサーバを起動する 4つのToolを登録

Slide 60

Slide 60 text

Toolの実装 ● GetProjectというツールの実装

Slide 61

Slide 61 text

Toolの実装 ● GetProjectというツールの実装 Toolの名前 Toolの説明 ※超重要 Toolの実装 (RISKENのAPI呼び出すだけ)

Slide 62

Slide 62 text

テスト ● ClaudeDesktopでテストしてました

Slide 63

Slide 63 text

Streamable-HTTPに対応する ● 対応すると言ってもSDKの方でサポートしてくれていました ○ なので、サーバの起動方法を切り替えるだけで完成 ● ただし、RISKENの場合は認証認可の部分でカスタム実装を入れています

Slide 64

Slide 64 text

Streamable-HTTPに対応する ● HTTPヘッダにアクセストークンをセットし認証認可を実装 ● アクセストークンに紐づくプロジェクトを特定 アクセストークンを HTTPヘッダで受取る

Slide 65

Slide 65 text

Streamable-HTTPに対応する ● SDKで実装されいる処理を活かしつつ認証認可部分だけラップする HTTPヘッダチェック

Slide 66

Slide 66 text

Streamable-HTTPに対応する ● 認証が通ったらコンテキストにRISKEN API Clientを格納して伝搬する contextに認証済みの RISKEN Clientを格納 あとはSDKの処理に流す

Slide 67

Slide 67 text

OAuth2.1に対応する ● 最後はOAuth対応です ● まだ、仕様自体がDraft版なのでSDK側でサポートされてませんでした ● ただ、リモートMCPを構築するなら認証を入れたいところ

Slide 68

Slide 68 text

OAuth2.1に対応する ● MCP Client側はサポートしてくれてるケースが多い ● ということでRISKEN側も実装 いくつかのエンドポイント を実装する必要がある ※詳細は割愛 とにかくデバッグしづら い、、、

Slide 69

Slide 69 text

全てのTransportで起動可能 コマンドごとに3種類のTransportをサポート ● http Streamable-HTTPサーバ ● oauth Streamable-HTTP + OAuthサーバ ● stdio stdioサーバ

Slide 70

Slide 70 text

セキュアなアーキテクチャを考える ローカルMCPサーバー リスク ● ファイルシステムへのアクセス ● 危険なコマンド実行 対策 ● Sandbox環境での実行(コンテナ) ● 読み取り専用モードサポート

Slide 71

Slide 71 text

セキュアなアーキテクチャを考える リモートMCPサーバー リスク ● 通常APIサーバと一緒のリスク ○ DDoS攻撃 ○ なりすまし・不正アクセス 対策 ● ネットワーク制限(VPN、IP制限) ● デバイス制限(mTLS認証) ● ユーザ認証(OAuth2.1) ● DDoS対策(オートスケール、CDN)

Slide 72

Slide 72 text

セキュアなアーキテクチャを考える リモートMCPサーバー リスク ● 通常APIサーバと一緒のリスク ○ DDoS攻撃 ○ なりすまし・不正アクセス 対策 ● ネットワーク制限(VPN、IP制限) ● デバイス制限(mTLS認証) ● ユーザ認証(OAuth2.1) ● DDoS対策(オートスケール、CDN) 脆弱性診断が必要そう

Slide 73

Slide 73 text

まとめ

Slide 74

Slide 74 text

まとめ ● Agentic AIでやれることが増えそう! ● 野良MCP普通に怖い、、、 ● MCPを開発する時のポイント

Slide 75

Slide 75 text

ご視聴ありがとうございました