コンテンツへスキップ
Guide

Shadow MCP: 誰も予算を立てなかった企業の問題

| 8 min read

従業員が無許可の MCP サーバーを Claude と Cursor に接続しています。 1 つのゲートウェイ ルール、1 つのインベントリ クエリ、およびその先を行く 1 つのポリシー テンプレート。

Dark network lines representing shadow traffic and MCP detection
Photo by Markus Spiske on Unsplash

シャドー IT とは、マーケティング マネージャーが Dropbox に費用をかけることを意味していました。 Shadow SaaS とは製品チームを意味します 個人のクレジット カードで Figma にサインアップします。 両方とも含まれていました。ツールはブラウザで実行されました タブに移動すると、ユーザーがすでに表示できるデータに触れましたが、タブの境界を越えてアクセスすることはできませんでした。 シャドウMCP その封じ込めを破ります。 従業員がコミュニティ MCP サーバーを Cursor または Claude に切り替えます デスクトップ、およびエージェントが SSH キーを読み取り、シェル コマンドを実行し、本番環境と通信できるようになりました。 ユーザーのアンビエント資格情報を介してデータベースにアクセスします。

Cloudflare Gateway は、2026 年 4 月に MCP 対応ルールを出荷しました。Zscaler と Netskope も 2026 年 4 月に続きました。 週。 企業のセキュリティ チームが要望を出し始めたため、ツールが追いつきました。 この投稿の内容は、 この四半期に行うべき 4 つのこと: 脅威モデルを理解する、検出を構築する、 インベントリ スクリプトを作成し、ホワイトリストを作成し、3 ページのポリシーを公開します。

Shadow MCP が Shadow SaaS よりも劣る理由

ブラウザーの不正な SaaS タブはサンドボックスで実行されます。 ユーザーの SSH 秘密キーを読み取ることはできません。 それ シェルを生成できません。 実稼働 Postgres への TCP 接続を開くことはできません。 ブラウザの 同一生成元ポリシーと OS サンドボックスによって封じ込めが行われます。

MCP サーバーはブラウザの外部で実行されます。 Claude Desktop と Cursor は stdio サーバーを子として生成します ユーザーの権限を使用してユーザーのマシン上でプロセスを実行します。 HTTP MCP サーバーは次のように接続します。 ユーザーが貼り付けた認証情報。その後、エージェントはそのサーバーからツールを呼び出します。 通常のループです。 オペレーティング システムの観点から見ると、ツール呼び出しはユーザーが ファイルを実行するか、コマンドを実行します。

具体的な違い: コミュニティ GitHub MCP サーバーがランダムな npm パッケージから取得され、 ~/.cursor/mcp.json 中にあるものを何でも抜き出すことができる ~/.ssh/、 毎 .env ホーム ディレクトリ下のファイル、およびユーザーのリポジトリの内容全体 チェックアウトしました。 ユーザーは一度承認しました。 エージェントは二度と質問しません。 ブラウザベースの不正行為 ツールではそのようなことはできません。

さらに問題が 1 つ追加されます。それは、ユーザーの VPN です。 エージェントの実行時にラップトップが企業 VPN 上にある場合、 MCP サーバーはそのネットワーク位置を継承します。 内部サービス、ステージング データベース、 メタデータ エンドポイントはすべて到達可能になります。 サーバーは誰かをフィッシングする必要はありませんでした。 ただ待っただけだ VPN が接続できるようにします。

ネットワーク上でシャドウ MCP を見つける

検出は、エンドポイント、出力ゲートウェイ、DNS の 3 つの層で機能します。 信号が欲しい それぞれが異なる故障モードを検出するため、3 つすべてから結果が得られます。

エンドポイントで、Claude Desktop または Cursor が生成する子プロセスを監視します。 どちらのクライアントも 既知の親プロセス名を持つサブプロセスとして stdio サーバーを呼び出します。 あなたの EDR (CrowdStrike、 SentinelOne、Defender for Endpoint) は、ルートとなるプロセス ツリーに対してアラートを送信できます。 Claude.appCursor.app、 または claude-code。 フィルタリングして、 あなたが承認したもの。 他のすべてにフラグを立てます。

出力時に、HTTP トラフィックをフィルタリングします。 MCP over Streamable HTTP には独特のヘッダーが付属します (mcp-protocol-version) と特徴的なコンテンツ タイプ (application/json-rpc-2)。 Cloudflare Gateway、Zscaler、Netskope はすべて一致します 両方。 これは、承認されていない MCP をブロックしながら、 承認されたホスト:

DNS では、リゾルバーは HTTPS 接続の前にコミュニティ MCP サーバー ホストのルックアップを確認します。 が開きます。 承認されたホワイトリストを DNS フィルターにフィードします (Cisco Umbrella、NextDNS、Cloudflare) ゲートウェイ DNS) のみが許可される MCP 宛先として使用されます。 既知の検索に一致する 1 つおきの検索 MCP レジストリ フィードはブロックとチケットを取得します。

npm でインストールされた stdio サーバーの場合、エンドポイント DLP エージェントは一致するパッケージを監視できます。 *-mcp-*@modelcontextprotocol/*、またはを宣言する任意のパッケージ mcp その中のエントリ package.json bin 分野。 それは、 ユーザーがサーバーを Cursor に接続する前に、インストール イベントを実行します。

午後 1 日で MCP インベントリを作成する

検出により、新しいサーバーがいつ表示されるかがわかります。 インベントリは、何がすでにインストールされているかを示します。 スクリプトを送信し、MDM (Jamf、Intune、Kandji) を通じて実行し、結果をレポートに投稿します。 エンドポイント。 午後に仕事をすると、どのマシンにどのサーバーが搭載されているかがわかります。

このスクリプトは、すべての主要クライアントが使用する 2 つの構成ファイルを読み取ります。 Claude Desktop は設定を保持します で ~/Library/Application Support/Claude/claude_desktop_config.json macOS 上と %APPDATA%\Claude/claude_desktop_config.json Windows 上で。 カーソルはその設定を維持します ~/.cursor/mcp.json。 どちらのファイルもプレーンな JSON です。 mcpServers サーバー名をコマンド、引数、URL、および環境変数にマッピングするオブジェクト。

ハッシュは重要です。 ユーザーがサーバーを追加したり、キーをローテーションしたり、キーをプルダウンしたりすると、構成ファイルが変更されます。 チームテンプレート。 ファイル全体の SHA-256 を保存し、プッシュしなかった変更について警告します。 の env var 名 (値ではない) もレポートに含まれます。 見る GITHUB_PERSONAL_ACCESS_TOKEN コミュニティ サーバーの下にリストされているのは、独自のシグナルです。

スクリプトを毎日実行します。 出力を既存の資産インベントリ (Snipe-IT、ServiceNow、 またはPostgresテーブル)。 今週の新しいサーバー、以上のサーバーを表示するダッシュボードを構築します。 N 台のマシンとサーバーの構成ハッシュが変更されました。 これら 3 つのビューで、これから行うことのほとんどがカバーされます 後で尋ねる必要があります。

信頼できるサーバーを許可リストに登録する

インベントリには、何がインストールされているかが表示されます。 ホワイトリストには何が許可されているかが記載されています。 デフォルトの拒否、毎回 サーバーがレビューされ、すべての承認が期限切れになります。 Git 内のファイルにバージョンを付けて、承認履歴を保存します。 監査可能。

この許可リストが役立つ理由は 3 つあります。 まず、すべてのエントリにはレビュー チケットと有効期限があります。 承認は永遠に続くわけではありません。 次に、stdio サーバーには許可された引数が含まれているため、 postgres-mcp バイナリが承認されました --readonly で再実行することはできません 新しいレビューなしの書き込みアクセス。 第三に、スコープには名前が付けられており、明示的です。 後の制御層 それらを強制することができます。

新しいサーバーを許可リストに登録するには、人間によるレビューの前に 2 つの自動チェックが必要です。 まず、サーバーのホストの TLS ポスチャを確認します。 プレーンテキスト HTTP 経由で MCP を提供するサーバー、または 証明書の有効期限が 10 日以内であるか、HSTS が欠落している場合は、候補にはなりません。

次に、応答ヘッダーを検査します。 最長有効期間が長く、賢明な HSTS が必要です。 content-type、そして mcp-protocol-version 内容と一致するヘッダー サーバーはマニフェストでサポートしていると述べています。 ヘッダーとマニフェストの間の差異は危険信号です。

両方のチェックをインテーク チケットの一部として実行します。 どちらかが失敗した場合、チケットは自動的にクローズされます。 失敗の理由。 レビュー担当者は、基本事項に合格したサーバーのみを参照します。

すべての企業が必要とする 3 ページの MCP ポリシー

ポリシーは長くする必要はありません。 何を承認するか、誰が承認するかという 5 つの質問に答える必要があります。 新しいサーバーを承認します。各役割で何ができるか、どのように監視するか、いつ何が起こるか 何かがうまくいかない。 短い表は、誰も読まない 30 ページの文書よりも多くの作業を実行します。

エリア ポリシー コントロール
承認されたサーバー ホワイトリスト YAML 内のサーバーのみが企業デバイス上で実行できる、または企業データにアクセスできる。 DNS + 下りブロック、EDR プロセス ルール、MDM プッシュの許可リスト ファイル、6 か月の承認有効期限。
レビュープロセス Security Platform は、すべての新しいサーバー リクエストをレビューします。 データ プラットフォームは、データベース アクセスを持つサーバーに共同署名します。 規制されたデータを処理するサーバーは法的に承認されます。 チケット テンプレート、自動化された TLS およびヘッダー チェック、5 営業日の公開された SLA を確認します。
範囲の制限 エンジニアはデフォルトで読み取り専用のデータ サーバーを取得します。 書き込みアクセスには 2 番目の承認者が必要です。 本番環境の資格情報は禁止されています。 ステージングまたはスコープ付きトークンを使用します。 MDM 経由でプッシュされるロールごとのホワイトリスト バンドル、短い TTL のスコープ指定された API キー、スコープを適用する認証ゲートウェイ。
監視 承認されたサーバーを介したすべてのツール呼び出しは監査ログに記録されます。 未承認のサーバーが試行されると、15 分以内にアラートがトリガーされます。 Kafka および SIEM へのゲートウェイ監査シンク、毎日のインベントリの差分、構成ファイルのハッシュ ドリフト アラート。
インシデント対応 侵害された MCP サーバーは、侵害された API 統合として扱われます。 サーバーのキーを取り消し、影響を受けるエンドポイントを隔離し、暴露期間の監査ログを確認します。 文書化されたランブック、オンコールローテーション、MCP シナリオを含む四半期ごとのテーブルトップ。
例外 一時的な例外には、CISO の承認、30 日間の有効期限、および書面によるフォローアップ計画が必要です。 例外チケット テンプレート、自動期限切れの許可リスト エントリ、毎週の例外レビュー。
オフボーディング 従業員が退職すると、その MCP 構成は他の企業状態とともに消去されます。 彼らが保持していたキーは 24 時間以内にローテーションされます。 MDM ワイプ アクション、キー ローテーション Runbook、キーごとの最終アクセスの監査ログ。

重要なポイント

  • MCP の機能は SaaS の機能を超えています。 コミュニティ MCP サーバーが SSH を読み取る キーを取得し、シェル コマンドを実行し、VPN の位置を継承します。 特権的なもののように扱う ブラウザのタブのような統合ではありません。
  • 検出には 3 つの層が必要です。 EDR プロセス ルール、ゲートウェイ HTTP フィルター mcp-protocol-version、および DNS ホワイトリストは、さまざまな障害モードをカバーします。
  • ある日の午後に棚卸し。 60 行の Python スクリプトは 2 つの構成を読み取ります。 すべての主要なクライアントが使用するファイルをハッシュし、レポート エンドポイントに投稿します。 毎日実行する MDM経由。
  • デフォルトの拒否許可リスト、有効期限が短い。 すべてのサーバーにはレビュー チケットがあり、 6か月の有効期限。 使用 /v1/ssl/check そして /v1/headers/inspect として 自動吸気ゲート。
  • 表は 30 ページのポリシーを上回ります。 承認されたサーバー、レビュープロセス、範囲 制限、モニタリング、インシデント対応、例外、オフボーディング。 7 行、1 ページ、投稿済み エンジニアリング Wiki にあります。

Botoi 独自の MCP サーバー: api.botoi.com/mcp サーバーの外観の例です ホワイトリストの準備が整ったら、TLS 1.3、HSTS、スコープ付き API キー、キーごとのレート制限、および 49 注釈付きの厳選されたツール。 上記の 2 つのカールで姿勢を自分で確認できます 追加する前に、または MCP設定ページ そして APIドキュメント 完全なツールのリストについては、

FAQ

インベントリの目的で MCP サーバーとしてカウントされるものは何ですか?
標準入出力サーバーと HTTP サーバーの両方がカウントされます。 stdio サーバーは、Claude Desktop または Cursor が構成ファイル エントリから生成される子プロセスです。 エージェントが開始するまでネットワーク フットプリントはありませんが、同じ機能面があります。 HTTP サーバーは、クライアントが Streamable HTTP または SSE 経由で接続する URL に存在します。 インベントリは両方をカバーする必要があります。つまり、エンドポイントで構成ファイルを読み取り、MCP トラフィック署名の出力を監視します。
承認されたエージェントを破ることなく、企業ネットワーク上で MCP を完全にブロックできますか?
はい。 デフォルトでは出口ゲートウェイですべてをブロックし、承認された MCP サーバーが存在する特定のホスト名を許可リストに登録します。 承認された stdio サーバーはネットワークにまったく接続しません (既に制御されている通常の HTTPS 経由でバッキング API と通信します)。 企業デバイス上でのコミュニティ MCP 実験が失われます。これが重要です。 開発者は引き続き、VPN の外部にある個人のマシンを探索のために使用できます。
Shadow MCP はプロンプト インジェクション リスクとどのように異なりますか?
プロンプト インジェクションとは、攻撃者がモデルを騙して、オペレーターが望まないことを実行させることです。 Shadow MCP は、オペレータ自身が未レビューの機能に配線します。 異なる脅威アクター、異なる制御。 ツールの存在が想定されていない場合、プロンプト インジェクション防御 (ツールの確認、サンドボックス化、出力フィルタリング) は役に立ちません。 モデルレベルの防御に加えて、インベントリとホワイトリストが必要です。
ブロックするには次世代ファイアウォールのアップグレードが必要ですか?
いいえ、DNS フィルタリングと HTTP 層の出力検査でほとんどのことがカバーされます。 Cloudflare Gateway、Zscaler、Netskope はすべて、2026 年 4 月時点で MCP 対応ルールを出荷しています。オンプレミスの場合は、任意の L7 プロキシを使用して MCP-Protocol-Version ヘッダーまたは application/json-rpc-2 コンテンツ タイプでフィルタリングできます。 Squid、Envoy、および HAProxy はすべてこれを処理します。 難しいのはフィルターではありません。 ホワイトリストを維持しているのです。
MCP はすぐにどのような監査証跡を提供しますか?
ほとんどありません。 このプロトコルはツールの呼び出しと応答を定義しますが、サーバーまたはクライアントがそれらをログに記録する必要はありません。 Claude Desktop はいくつかのローカル ログを保持します。 カーソルはそれほどではありません。 多くの場合、コミュニティ サーバーは何も記録しません。 インシデントのレビュー後に残る監査証跡が必要な場合は、サーバー側で自分で監査証跡を計測するか、構造化されたログを書き込むゲートウェイを前に置きます。 証拠の保持をクライアントに依存しないでください。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。