MCPの脆弱性(CVE)一覧:SDK・サーバー・クライアントの44件と安全な最小バージョン【MCP Security・2026年10月版】
MCPのSDK・Inspector・mcp-remote・filesystem/gitサーバー・Claude Code・Cursor・stdio起動プラットフォームで公開された脆弱性44件を一覧化。影響範囲と修正版、安全な最小バージョン、アップグレード後に必要な設定、npm auditと自作スクリプトでの検証結果まで。
最終更新:2026年10月29日 / 対象:2026年10月28日までに公開されたアドバイザリ / MCP TypeScript SDK 1.x・2.x、MCP Python SDK 1.x・2.x、公式MCPサーバーと開発ツール、MCPクライアント
結論(30秒で読める要約)
MCPの脆弱性は、もう「たまに出る珍しいもの」ではありません。本記事では、MCP SDK、公式サーバーと開発ツール、MCPクライアント、設定からMCPサーバーを起動するプラットフォームで公開された44件のアドバイザリ(CVEとGitHub Security Advisory)を一覧にしました。MCP Securityで今週ひとつだけやるなら、手元で動いているものが次のバージョンより古くないかを確認してください。
| コンポーネント | 安全な最小バージョン(2026年10月29日時点) | 理由 |
|---|---|---|
TypeScript SDK @modelcontextprotocol/sdk(1.x) |
1.32.0 |
8件。うち5件は1.30.1〜1.32.0で修正 |
TypeScript SDK @modelcontextprotocol/server / client(2.x) |
2.3.0 |
2パッケージで計6件 |
Python SDK mcp(1.x) |
1.30.0 |
10件。セッション乗っ取りやトークンのaudience未検証を含む |
Python SDK mcp(2.x) |
2.2.0 |
2.x系にも及んだ6件 |
| MCP Inspector | 0.16.6 |
CVE-2025-49596(CVSS 4.0で9.4)、CVE-2025-58444 |
mcp-remote |
0.1.16 |
CVE-2025-6514(CVSS 3.1で9.6) |
mcp-server-git |
2026.1.14 |
パス・引数インジェクション系のCVE 4件 |
@modelcontextprotocol/server-filesystem |
2025.7.1(旧0.x系なら0.6.3) |
CVE-2025-53109、CVE-2025-53110 |
| Claude Code | 2.0.65 |
CVE-2025-59536、CVE-2026-21852 |
| Cursor | 1.3.9 |
CVE-2025-54135、CVE-2025-54136 |
| LiteLLM | 1.83.7-stable |
CVE-2026-30623 |
一覧にしてみると、3つの傾向がはっきり見えます。
- 44件中18件(41%)は「信頼できない文字列がそのままコマンドとして実行される」タイプです。URL、設定の項目、ツール引数などが実行に回ってしまうもので、多くはstdioサーバーを起動するコードにあります。
- 公式SDKは2言語とも、同じ4種類のバグ(トークンのaudience、OAuthのissuer紐付け、別オリジンへのリダイレクト、リクエストサイズ無制限)を1か月以内に修正しています。2026年半ばにSDKのバージョンを固定したままなら、ほぼ確実に該当します。
- ほとんどはAI特有ではなく、昔からあるWebのバグです。プロンプトインジェクションが起点になるのは2件(CursorのCVE-2025-54135、WindsurfのCVE-2026-30615)だけで、残りは認証漏れ、所有者チェック漏れ、パストラバーサル、コマンドインジェクションです。
9章では、わざと古いバージョンで組んだ環境を実際に検査しました。npm audit は脆弱なパッケージを4件(critical 1件、high 3件)検出し、その中には古いサーバーの内部に入れ子で入っていたSDKも含まれていました。Python側は小さなスクリプトで補いました。
目次
- 「MCPの脆弱性」とは何を指すか
- MCP SDKの脆弱性(19件)
- 公式サーバーと開発ツール(9件)
- MCPクライアントとAIコーディングツール(5件)
- STDIO設定インジェクション系(11件)
- CVEのない事故:悪意あるパッケージとロジックの欠陥
- 44件に共通すること
- 自分の環境が影響を受けるかの確認手順
- 検証:古いMCP環境を実際に監査する
- パッチ運用チェックリスト(12項目)
- よくあるハマりどころ(症状→原因→対処)
- NodeFlareならこう解決できる
- FAQ
1. 「MCPの脆弱性」とは何を指すか
MCPの脆弱性とは、Model Context Protocolを実装・起動するソフトウェアのセキュリティ上の欠陥のことです。対象はSDK、MCPサーバー、MCPクライアントやホスト、InspectorやプロキシのようなMCP周辺のツールです。プロトコル仕様そのものにCVEが付くことはなく、CVEが付くのは実装の側です。
MCPの脆弱性は5つの層に分けられ、層ごとに直し方と気づき方が違います。
| 層 | 例 | 対応が必要な人 | 気づく方法 |
|---|---|---|---|
| SDK | @modelcontextprotocol/sdk、mcp(PyPI) |
そのSDKでサーバーやクライアントを作っている全員 | npm audit、pip-audit、Dependabot |
| 公式サーバー・開発ツール | Inspector、filesystem、git、mcp-remote |
ローカルで動かしている開発者 | 同上+modelcontextprotocol/servers のアドバイザリ |
| サードパーティのサーバー | Figma、Kubernetes、AWS系など多数 | インストールした人 | GitHubのアドバイザリやブログ記事のみ、ということが多い |
| クライアント・ホスト | Claude Code、Cursor、Windsurf | そのクライアントの全利用者 | ベンダーのリリースノート、自動更新 |
| MCPサーバーを起動するプラットフォーム | LiteLLM、Flowise、LangFlow | プラットフォームの運用者 | ベンダーのアドバイザリ |
本記事では、SDKと公式コンポーネントは公開分をすべて、クライアントとプラットフォームは一次情報で確認できたCVEを載せています。サードパーティのサーバーまで網羅することはしていません。そちらはMCPサーバーのサンドボックス化の記事にある確認手順を使ってください。まだ見つかっていない次のCVEの被害を、隔離でどこまで抑えられるかもそこで解説しています。
2. MCP SDKの脆弱性(19件)
1つのバグがその上に作られた全サーバーに広がるため、公式SDKは最も重要な層です。両SDKとも、2025年12月(DNSリバインディング対策の初期値)と、2026年9〜10月にまとまってアドバイザリを出しています。
TypeScript SDK
| アドバイザリ | 種類 | 影響範囲 | 修正版 | 影響を受ける構成 |
|---|---|---|---|---|
| CVE-2025-66414(GHSA-w48q-cv73-mx4w) | DNSリバインディング対策が初期状態で無効 | < 1.24.0 |
1.24.0 |
認証なしでlocalhostにHTTPで立てたサーバー |
| CVE-2026-0621(GHSA-cqwc-fm46-7fff) | UriTemplate のReDoS |
< 1.25.2 |
1.25.2 |
{/id*} のような展開型のリソーステンプレートを持つサーバー |
| CVE-2026-25536(GHSA-345p-7cg4-v4c7)、CVSS 7.1 | 別クライアントへのレスポンス漏えい | 1.10.0〜1.25.3 |
1.26.0 |
1つのtransportやserverインスタンスを複数クライアントで使い回す構成 |
| GHSA-f897-62hf-6gxq、CVSS 7.5 | リクエスト本文・バッチ数の上限なし | 1.10.0〜< 1.30.1 |
1.30.1 |
信頼できないクライアントから届くHTTPサーバー |
| GHSA-6qxp-vccf-f47h、CVSS 7.5 | OAuthクライアントが、サーバーの指定した認可サーバーへ資格情報を送る | 1.12.0〜< 1.31.0 |
1.31.0 |
完全には信頼できないサーバーへ接続するOAuthクライアント |
| GHSA-6prh-2h8m-c8cw、CVSS 6.5 | 別オリジンへのリダイレクトでカスタムヘッダーを再送 | < 1.32.0 |
1.32.0 |
独自の認証ヘッダーを使うHTTPクライアント |
| CVE-2026-111768(GHSA-46jr-4wx8-v453)、CVSS 7.5 | 4 MiB以内のリクエストでも検証中にメモリを使い切る | 1.3.0〜1.31.0 |
1.32.0 |
配列やレコードを受け取るツール |
| GHSA-rvq5-wwqv-78pq、CVSS 6.8 | Bearer認証が別サービス向けのトークンを受け入れる | 1.6.0〜< 1.32.0 |
1.32.0 |
認可サーバーを他サービスと共用し、SDKのBearer認証を使うサーバー |
2.x系のパッケージ(@modelcontextprotocol/server と @modelcontextprotocol/client)にも、2026年後半の同じバグが入っています。npm audit の結果では、serverパッケージにGHSA-46jr、GHSA-rvq5、GHSA-f897と、2.x固有のクライアント間配信バグ(GHSA-jm63-cq47-j5jp、CVSS 7.7)、clientパッケージにGHSA-6qxpとGHSA-6prhが出ます。どちらも 2.3.0(2026年10月2日リリース)で解消されます。
アップグレード後に設定が必要な修正が2つあります。GHSA-46jrでは、初期状態で無効の新オプション maxToolInputElements を有効にし、メッセージが小さいなら maxRequestBodySize も下げるよう案内されています。CVE-2025-66414の対策が自動で有効になるのは、localhostにバインドした createMcpExpressApp() で作ったサーバーだけです。Expressを独自に組んでいる場合は、エクスポートされている hostHeaderValidation() ミドルウェアを自分で入れます。
Python SDK
| アドバイザリ | 種類 | 影響範囲 | 修正版 | 影響を受ける構成 |
|---|---|---|---|---|
| CVE-2025-66416(GHSA-9h52-p55h-vw2f) | DNSリバインディング対策が初期状態で無効 | < 1.23.0 |
1.23.0 |
認証なしでlocalhostに立てたFastMCPのHTTPサーバー |
| CVE-2026-52869(GHSA-jpw9-pfvf-9f58)、CVSS 7.1 | セッションへのリクエストが認証済みの主体に紐付いていない | ≤ 1.27.1 |
1.27.2 |
SDKのBearer認証を使うHTTPサーバー |
| CVE-2026-52870(GHSA-hvrp-rf83-w775)、CVSS 7.6 | 他クライアントのタスクを誰でも参照・キャンセルできる | 1.23.0〜1.27.1 |
1.27.2 |
enable_tasks() を呼んでいるサーバー |
| CVE-2026-59950(GHSA-vj7q-gjh5-988w) | WebSocket transportにHost/Origin検証がない | < 1.28.1 |
1.28.1+設定 |
非推奨のWebSocket transportを組み込んでいるアプリ |
| GHSA-fmmv-w9g8-j3gc、CVSS 7.5 | リクエスト本文をサイズ上限なしで読み込む | < 1.29.1、2.0.x |
1.29.1、2.1.0 |
HTTPサーバーとOAuthエンドポイント |
| CVE-2026-59951(GHSA-84m7-p3x7-pcfv)、CVSS 7.5 | ステートフルなセッションが回収されない | 1.8.0〜< 1.30.0、2.0.0〜< 2.2.0 |
1.30.0、2.2.0 |
ステートフルなStreamable HTTPサーバー |
| CVE-2026-116684(GHSA-w4fh-qvv9-3v23)、CVSS 6.8 | Bearer認証が別リソースサーバー向けのトークンを受け入れる | 1.10.0〜1.29.1、2.0.0〜2.1.1 |
1.30.0、2.2.0+設定 |
TokenVerifier が aud を確認していないサーバー |
| GHSA-qx49-fqc8-xw99、CVSS 7.5 | OAuthクライアントの資格情報がissuerに紐付いていない | 1.9.1〜< 1.30.0、2.0.0a1〜< 2.2.0 |
1.30.0、2.2.0+設定 |
信頼できないサーバーへ接続するOAuthクライアント |
| CVE-2026-116685(GHSA-5h93-6whr-6q8j)、CVSS 5.9 | 別オリジンへのリダイレクトでカスタムヘッダーを送る | 1.8.0〜< 1.30.0、2.0.0〜< 2.2.0 |
1.30.0、2.2.0 |
独自の認証ヘッダーを使うHTTPクライアント |
| CVE-2026-116686(GHSA-rwrf-2pqf-9j8j)、CVSS 6.5 | サーバーが指定した $ref のURLをクライアントが取得する(SSRF) |
1.10.0〜< 1.30.0、2.0.0〜< 2.2.0 |
1.30.0、2.2.0 |
信頼できないサーバーの、outputSchema 付きツールを呼ぶクライアント |
アドバイザリによると、次の3つはコードや設定を変えないと対策が完了しません。
- トークンのaudience(CVE-2026-116684):
AuthSettingsでvalidate_token_resource=Trueとresource_server_urlを設定し、さらにverify_token()でトークンのaudienceをAccessToken.resourceとして返します。前半だけ行うと、すべてのリクエストが401になります。 - OAuthのissuer紐付け(GHSA-qx49):
ClientCredentialsOAuthProviderまたはPrivateKeyJWTOAuthProviderにissuer=を渡し、保存済みのクライアント登録を一度消して再登録させます。信頼できないサーバーとやり取りした可能性があるクライアントは、シークレットもローテーションします。 - WebSocket(CVE-2026-59950):アップグレードしただけでは保護が有効になりません。
enable_dns_rebinding_protection=Trueを指定したTransportSecuritySettingsを渡すか、Streamable HTTPへ移行します。
両SDKのaudienceのバグは、MCPセキュリティテスト計画のテストA4(別リソース向けに発行された正規トークンを送る)でちょうど検出できる種類のものです。
3. 公式サーバーと開発ツール(9件)
これらは開発者のPC上で、たいていその開発者のファイルやネットワークへのアクセス権をすべて持ったまま動きます。一覧の中でスコアが最も高いのがこの層なのはそのためです。
| CVE | コンポーネント | 種類 | 影響範囲 | 修正版 | スコア |
|---|---|---|---|---|---|
| CVE-2025-49596 | MCP Inspector | Inspectorのクライアントとプロキシ間に認証がなく、RCEにつながる | < 0.14.1 |
0.14.1 |
CVSS 4.0で9.4 |
| CVE-2025-58444 | MCP Inspector | 信頼できないサーバーの不正なリダイレクトURIによるXSSからコマンド実行 | < 0.16.6 |
0.16.6 |
CVSS 4.0で8.6 |
| CVE-2025-6514 | mcp-remote |
細工された authorization_endpoint によるOSコマンドインジェクション |
0.0.5〜0.1.15 |
0.1.16 |
CVSS 3.1で9.6 |
| CVE-2025-53109 | server-filesystem |
シンボリックリンクによるパス検証の回避 | < 0.6.3、< 2025.7.1 |
0.6.3、2025.7.1 |
CVSS 4.0で8.4 |
| CVE-2025-53110 | server-filesystem |
前方一致するパスによるパス検証の回避 | < 0.6.3、< 2025.7.1 |
0.6.3、2025.7.1 |
CVSS 4.0で7.3 |
| CVE-2025-68143 | mcp-server-git |
git_init が任意のパスを受け付けた |
< 2025.9.25 |
2025.9.25(ツール自体を削除) |
CVSS 4.0で6.5 |
| CVE-2025-68144 | mcp-server-git |
git_diff / git_checkout の引数インジェクション |
< 2025.12.18 |
2025.12.18 |
CVSS 3.1で8.1 |
| CVE-2025-68145 | mcp-server-git |
--repository 指定時のパス検証漏れ |
< 2025.12.18 |
2025.12.18 |
CVSS 3.1で7.1 |
| CVE-2026-27735 | mcp-server-git |
git_add がリポジトリ外のファイルをステージできた |
< 2026.1.14 |
2026.1.14 |
CVSS 4.0で6.4 |
実務上の注意が2つあります。The Hacker Newsによると、gitサーバーのCVEはCyataが2025年6月に報告し、修正は7か月がかりでした。「去年の夏に更新した」だけでは足りません。もう1つは server-filesystem のバージョン体系の変更です。2026.8.31 までは日付形式でしたが、2026年10月11日に 1.0.0、10月28日に 2.1.0 が公開されました。自作のチェックで 2.1.0 < 2025.7.1 を数値で比べると、最新版を脆弱と判定してしまいます。npm audit は正しく扱い、脆弱な範囲を <=0.6.2 または 2025.1.14 - 2025.3.28 と表示します。
4. MCPクライアントとAIコーディングツール(5件)
どのサーバーをどのコマンドで起動するかを決めるのはクライアントなので、クライアントのCVEは重要です。次の5件はいずれも、リポジトリやサーバーが用意した内容が、コマンド実行や資格情報の漏えいにつながったものです。
| CVE | クライアント | 種類 | 修正版 | スコア |
|---|---|---|---|---|
| CVE-2025-59536 | Claude Code | 起動時の信頼ダイアログを承認する前に、プロジェクトのMCPサーバーやhooksが実行され得た | 1.0.111 |
CVSS 3.1で8.8 |
| CVE-2026-21852 | Claude Code | リポジトリが ANTHROPIC_BASE_URL を設定し、信頼確認の前にAPIキーが漏れ得た |
2.0.65 |
出典に記載なし |
| CVE-2025-54135(CurXecute) | Cursor | 任意コード実行。MCP設定を書き換えるプロンプトインジェクションから到達できると報告 | 1.3.9 |
CVSS 3.1で8.5 |
| CVE-2025-54136(MCPoison) | Cursor | 検証されないMCP設定の変更によるリモートコード実行 | 1.3 |
CVSS 3.1で7.2 |
| CVE-2026-30615 | Windsurf | プロンプトインジェクションからMCP設定の書き換え(OX Securityの一覧より) | ベンダー情報を参照 | Critical(OXによる) |
Claude Codeの2件はCheck Point Researchが報告し、TenableはCurXecuteをAIM Security、MCPoisonをCheck Pointの発見としています。5件に共通する教訓は、プロジェクト単位のMCP設定(.mcp.json、.cursor/mcp.json など)をコードとして扱うことです。プルリクエストでレビューし、プロジェクトのサーバーを自動起動するエージェントで、信頼できないリポジトリを開かないようにします。
5. STDIO設定インジェクション系(11件)
一覧で最大のグループは、1つの調査から生まれました。2026年4月、OX Securityは、多くのAIプラットフォームでユーザーや外部入力がstdio MCPサーバーの設定(command と args)に届き、SDKがそれをサブプロセスとして実行してしまうことを公表しました(OXのアドバイザリは StdioServerParameters を名指ししています)。OXの報告では、影響を受けるサプライチェーンのダウンロード数は1億5,000万以上、公開アクセス可能なサーバーは7,000以上、脆弱なインスタンスは最大20万です。
| CVE | 製品 | 状況(OXまたはベンダーによる) |
|---|---|---|
| CVE-2026-30623 | LiteLLM | 1.83.6-nightly と 1.83.7-stable で修正 |
| CVE-2025-65720 | GPT Researcher | 3.3.7〜3.4.4が影響 |
| CVE-2026-30624 | Agent Zero | 全バージョンが影響とされる |
| CVE-2026-54449 | LangBot | 4.10.0まで |
| CVE-2026-30618 | Fay | 4.3.1 |
| CVE-2026-33224 | Bisheng | 未確定 |
| CVE-2026-30616 | Jaaz | 1.0.30 |
| CVE-2026-30617 | Langchain-Chatchat | 0.3.1 |
| CVE-2026-30625 | Upsonic | npx/npm の引数による許可リストの回避。0.72.0で警告を追加 |
| CVE-2026-40933 | Flowise | 許可リストの回避。3.1.0より後のバージョン |
| CVE-2026-26015 | DocsGPT | ネットワーク経由で隠れたstdio設定を注入。公式サイト側で修正済み |
大事なのは「誰が直すのか」という点です。OXはAnthropicのMCPを「修正を拒否された開示」に分類し、The RegisterはAnthropicが「プロトコルのアーキテクチャ変更を断り、この挙動を『想定どおり』とした」と報じています。一方、MCPのSecurity Best Practicesは、すでに起動する側に責任を置いています。ワンクリックでローカルサーバーを設定できるクライアントは、実行するコマンドを省略せずに表示し、明示的な承認を得なければなりません(MUST)。stdioサーバーを起動するプロキシは、起動したプロセスをサンドボックス化し、危険なコマンドには追加の認可を求めるべき(SHOULD)とされています。
MCPサーバーを起動するプラットフォームを作っているなら、次の3点を守ってください。
- リクエストのデータ、チャットの内容、管理者以外のユーザーに
commandやargsを決めさせない。LiteLLMの修正は、コマンドを許可リスト(npx、uvx、python、python3、node、docker、deno)に限定し、テスト用エンドポイントをPROXY_ADMINロール限定にしました。 - コマンドの許可リストだけに頼らない。UpsonicとFlowiseのCVEは、起動コマンドの引数を使った許可リストの回避です。
- 起動したサーバーは1つずつ、専用のファイルシステムとネットワークポリシーを持つサンドボックスで動かす。インジェクションが成功しても、盗めるものが何もない場所で止まります。stdioサーバーを開発者のPCから切り離す方法は、stdio MCPサーバーをリモートで動かす手順で解説しています。
6. CVEのない事故:悪意あるパッケージとロジックの欠陥
MCP Securityで特に学びの多い事故のいくつかにはCVEが付いていません。そのため、CVEスキャナーには一切出てきません。
| 事故 | 何が起きたか(出典による) | スキャナーで見つからない理由 | 効く対策 |
|---|---|---|---|
postmark-mcp(2025年9月) |
バージョン1.0.16に1行の変更が入り、サーバー経由で送るすべてのメールを外部アドレスにBCCしていた。削除までに1,643ダウンロード(Koi Security、The Hacker News経由) | 脆弱性ではなく悪意あるコード | バージョンの完全固定、更新前の差分確認、最小権限のAPIキー |
| AsanaのMCPサーバー(2025年) | ロジックの欠陥で一部データが他組織のユーザーから見えた。Asanaの推計で約1,000社に影響(BleepingComputer) | ホスティング型のサービスで、スキャンするパッケージがない | 2テナントを使った認可テスト |
| レジストリ汚染の検証(2026年) | OXの報告では、11のMCPレジストリのうち9つが悪意あるテスト用パッケージを受け入れた | レジストリの運用方針にはCVEが付かない | 確認済みの公開者からだけインストールし、導入前に審査する |
postmark-mcp の件は、ネットワーク制御の限界を確かめるのにも役立ちます。コピーは本来使うはずのメールAPIそのものを通って送られていたので、そのAPIを許可するEgressの許可リストでは止められませんでした。止められたのは、バージョン固定と差分レビューです。
7. 44件に共通すること
44件を根本原因で分類すると、どこに力を入れるべきかが見えてきます。
| バグの種類 | 件数 | 例 | まず入れる対策 |
|---|---|---|---|
| 信頼できない文字列がコマンドになる(URL、設定の項目、引数) | 18 | CVE-2025-6514、CVE-2025-68144、CVE-2025-59536、STDIO系の11件 | 信頼できない入力を起動処理やシェルに渡さない。起動したサーバーはサンドボックス化 |
| トークンとOAuthの信頼(audience、issuer、リダイレクト、キー漏えい) | 7 | CVE-2026-116684、GHSA-rvq5、GHSA-qx49、CVE-2026-21852 | aud を検証、クライアントをissuerに紐付け、リダイレクトは同一オリジンのみ |
| パストラバーサルと範囲外へのアクセス | 5 | CVE-2025-53109、CVE-2025-68145、CVE-2026-27735 | パスを正規化してから判定、ファイル系サーバーのマウントは最小限 |
| リソース枯渇 | 5 | CVE-2026-0621、CVE-2026-59951、GHSA-46jr | 本文サイズの上限、セッション数の上限、レート制限 |
| 認証なしのローカルリスナー | 4 | CVE-2025-49596、CVE-2025-66414、CVE-2025-66416 | ローカルはstdioを優先。HTTPならトークン必須にしてOrigin/Hostを検証 |
| クライアント間・セッション間の分離 | 4 | CVE-2026-25536、CVE-2026-52869、CVE-2026-52870 | セッションごとにserverとtransportを作る。状態は検証済みユーザーに紐付ける |
| クライアント側のSSRF | 1 | CVE-2026-116686 | 信頼できないサーバーが示すリモート参照を解決しない |
この表からわかることが2つあります。1つは、AI特有のものがほとんどなく、必要な対策は普通のWebサービスと同じだということです。もう1つは、SDKのアドバイザリの山(2025年12月と2026年9〜10月)が、2言語でほぼ同時期に修正されていることです。足並みをそろえた堅牢化が行われていると考えられるので、片方のSDKでアドバイザリが出たら、同じ週にもう片方のchangelogも確認しましょう。
8. 自分の環境が影響を受けるかの確認手順
次の順番で5つの層を確認します。前の手順ほど手間が小さいので、この順が効率的です。
- 棚卸し:MCPのコードが動く場所をすべて書き出します。Nodeのプロジェクト、Pythonの環境、グローバルインストール(
npm ls -g)、クライアントの設定ファイル(.mcp.json、claude_desktop_config.json、.cursor/mcp.json)、LiteLLMやFlowiseのようなプラットフォームです。 - パッケージ監査ツールを回す:Nodeのプロジェクトごとに
npm audit、Pythonの環境ごとにpip-audit(またはPyPIのJSON APIのvulnerabilities項目)を確認します。自分で直接入れていない、依存関係の中のコピーも見つかります。 - クライアントのバージョンを確認する:Claude Codeは
claude --version、CursorとWindsurfは「About」画面で確認します。多くのクライアントは自動更新が初期設定ですが、管理された端末やオフラインの端末は遅れがちです。 npxとuvxでの起動を確認する:npx -y some-mcp-serverのようにバージョンなしの設定は起動時点の最新版を動かし、npx some-mcp-server@0.1.15のような設定はいつまでも脆弱な版のままです。バージョンは完全に固定し、意図して更新します。- アップグレード後の設定を入れる:2章のとおり、オプトインになっている修正がいくつかあります。
9. 検証:古いMCP環境を実際に監査する
2026年10月29日に、Nodeのプロジェクト3つとPythonのパッケージ一覧3つを用意し(Node 22.23、npm 10.9.9、Python 3.13)、標準的なツールで何が見つかるかを確かめました。
古いNodeプロジェクトには @modelcontextprotocol/sdk@1.23.0、mcp-remote@0.1.15、@modelcontextprotocol/server-filesystem@2025.3.28 を入れました。npm audit の結果は次のとおりです。
| パッケージ | 深刻度 | 報告された脆弱な範囲 |
|---|---|---|
@modelcontextprotocol/sdk |
High | <=1.31.0(8件) |
@modelcontextprotocol/server-filesystem |
High | <=0.6.2 または 2025.1.14 - 2025.3.28 |
mcp-remote |
Critical | 0.0.5 - 0.1.15 |
zod |
High | <4.6.6 |
インストールしたコマンドからは予想しにくい発見が2つありました。古いfilesystemサーバーは内部にSDKのコピー(@modelcontextprotocol/sdk@0.5.0)を入れ子で持っていて、これはトップレベルのSDKを上げても直りません。また、SDKが依存する zod にも独自のメモリ枯渇のアドバイザリがありました。修正版で組んだプロジェクト(最新のSDKと mcp-remote、server-filesystem@2.1.0)は脆弱性0件でした。
npm audit はPython、クライアント、プラットフォームを見ないので、本記事冒頭の表と、インストール済みのバージョンを突き合わせる小さなスクリプトを用意しました。npm ls --all --json と pip list --format json の出力を読み込みます。
#!/usr/bin/env python3
"""mcp_cve_check.py - flag MCP packages older than the first fixed release
(table as of 2026-10-29). Standard library only.
usage: npm ls --all --json > npm.json ; pip list --format json > pip.json
python3 mcp_cve_check.py npm.json pip.json"""
import json, re, sys
def ver(s):
return tuple(int(x) for x in re.findall(r"\d+", s.split("-")[0])[:4])
ANY = lambda v: True
NPM = {
"@modelcontextprotocol/sdk": [(ANY, "1.32.0")],
"@modelcontextprotocol/server": [(ANY, "2.3.0")],
"@modelcontextprotocol/client": [(ANY, "2.3.0")],
"@modelcontextprotocol/inspector": [(ANY, "0.16.6")],
"mcp-remote": [(ANY, "0.1.16")],
# date-based versions until 2026.8.31, semver again from 1.0.0 (2026-10-11)
"@modelcontextprotocol/server-filesystem": [
(lambda v: v[0] == 0, "0.6.3"), (lambda v: v[0] >= 2000, "2025.7.1")],
}
PIP = {
"mcp": [(lambda v: v[0] == 1, "1.30.0"), (lambda v: v[0] == 2, "2.2.0")],
"mcp-server-git": [(ANY, "2026.1.14")],
"litellm": [(ANY, "1.83.7")],
}
def walk(node, out):
for name, dep in (node.get("dependencies") or {}).items():
if "version" in dep:
out.append((name, dep["version"]))
walk(dep, out)
return out
bad = 0
for path in sys.argv[1:]:
data = json.load(open(path))
eco, table = ("pip", PIP) if isinstance(data, list) else ("npm", NPM)
found = [(p["name"].lower(), p["version"]) for p in data] if eco == "pip" else walk(data, [])
for name, v in found:
for applies, minimum in table.get(name, []):
if applies(ver(v)) and ver(v) < ver(minimum):
print(f"VULNERABLE {eco} {name}@{v} -> upgrade to >= {minimum}")
bad += 1
print(f"{bad} vulnerable package(s)" if bad else "no known-vulnerable MCP packages")
sys.exit(1 if bad else 0)
4種類の入力での結果です。
| 入力 | 結果 | 終了コード |
|---|---|---|
古いNodeプロジェクト+Python一覧(mcp 1.27.1、mcp-server-git 2025.12.18、litellm 1.83.5) |
7件検出。入れ子の sdk@0.5.0 も含む |
1 |
@modelcontextprotocol/server@2.0.0 と client@2.0.0 を入れたNodeプロジェクト |
2件検出 | 1 |
mcp 2.1.1 のみ |
1件検出(2.2.0が必要) | 1 |
修正版のNodeプロジェクト+Python一覧(mcp 2.3.0、mcp-server-git 2026.10.28、litellm 1.83.7) |
0件。server-filesystem@2.1.0 も正しく対象外 |
0 |
限界もあります。このスクリプトが知っているのは上の表だけなので、新しいアドバイザリが出たら更新が必要です。正としては npm audit と pip-audit を使い、このスクリプトはそれらが見ないPythonパッケージやプラットフォームまで含めて止めるCIのゲートとして使ってください。また、Claude CodeやCursorのようなクライアントは、これらのパッケージマネージャーで入れるものではないので確認できません。
10. パッチ運用チェックリスト(12項目)
棚卸し
- [ ] MCPのコードを含むNodeプロジェクト、Python環境、グローバルインストールをすべて把握している
- [ ] クライアントの設定ファイル(
.mcp.json、claude_desktop_config.json、.cursor/mcp.json)を、サーバーと起動コマンドつきで一覧にしている - [ ]
npx/uvxでの起動はすべてバージョンを完全に固定している
検出
- [ ]
npm auditとpip-auditをCIで回し、MCP関連のhigh・criticalでビルドを失敗させている - [ ] DependabotかRenovateで
@modelcontextprotocol/*とmcpを監視している - [ ] SDKと
serversリポジトリのセキュリティアドバイザリを誰かが購読している
修正
- [ ] TypeScript SDKは1.32.0以上(1.x)または2.3.0以上(2.x)、Python SDKは1.30.0以上(1.x)または2.2.0以上(2.x)
- [ ] アップグレード後の設定を入れた:Pythonの
validate_token_resourceとissuer=、TypeScriptのmaxToolInputElements、WebSocketのTransportSecuritySettings - [ ] Inspectorは0.16.6以上、
mcp-remoteは0.1.16以上、mcp-server-gitは2026.1.14以上、server-filesystemは2025.7.1以上 - [ ] 信頼できないサーバーへ資格情報を送った可能性があるとアドバイザリが示すケースでは、資格情報をローテーションした
封じ込め
- [ ] ローカルのサーバーはstdioか、トークン必須でOrigin/Hostを検証するHTTPにしている。認証なしでlocalhostに待ち受けているものはない
- [ ] MCPサーバーを起動するプラットフォームは、管理者以外の入力から
commandやargsを受け付けず、サーバーごとにサンドボックスで動かしている
11. よくあるハマりどころ(症状→原因→対処)
| 症状 | 原因 | 対処 |
|---|---|---|
| SDKを上げたのに監査で引っかかり続ける | サーバーのパッケージが自前のSDKのコピーを入れ子で持っている | 親のパッケージを上げる。npm ls @modelcontextprotocol/sdk で確認 |
スキャナーが server-filesystem@2.1.0 を脆弱と判定する |
自作のチェックがsemverと日付形式を数値で比べている | npm audit の範囲を使うか、1.x/2.xは2026年以降のリリースとして扱う |
| Python SDKを上げたら全リクエストが401になる | validate_token_resource=True だけ設定し、AccessToken.resource を返していない |
アドバイザリの2つの変更をセットで入れる |
| 修正後も古いサーバーが動き続ける | 設定が npx some-server@<古い版> のまま、またはグローバルのキャッシュが残っている |
修正版に固定してクライアントを再起動 |
| 上げたのにWebSocketサーバーが別オリジンのページを受け入れる | 1.28.1では security_settings の初期値が None |
TransportSecuritySettings を渡すか、Streamable HTTPへ移行 |
| LiteLLMを上げたらstdioサーバーが起動しない | コマンドが新しい許可リストにない | 許可された起動コマンドを使うか、LITELLM_MCP_STDIO_EXTRA_COMMANDS に追加 |
| 「最新版」だったパッケージに悪意あるコードが入っていた | 脆弱性ではなく悪意あるリリース | バージョンを完全固定し、更新前に差分を確認 |
| ローカルの開発ツール経由で開発者のPCが侵害された | InspectorやローカルのHTTPサーバーが認証なしで待ち受けていた | ツールを更新し、stdioにするかトークン必須にする |
12. NodeFlareならこう解決できる
NodeFlareはMCPサーバーをリモートでホストし、サーバーごとに専用のFirecracker microVMで動かします。前段のプロキシが、リクエストがコードに届く前に認証・認可・レート制限・ログ記録を行います。一方で、依存パッケージを代わりに更新することはなく、イメージやパッケージのCVEスキャンも行いません(ドキュメントにどちらの記載もありません)。プロンプトインジェクションを防ぐこともできません。NodeFlareで変わるのは、未修正のバグや未知のバグが「どこまで届くか」です。本記事で挙げたバグの種類と、ドキュメントに記載された機能の対応は次のとおりです。
| 本記事のリスク | NodeFlareの機能 | 内容 |
|---|---|---|
| 認証なしのローカルリスナー(CVE-2025-49596、CVE-2025-66414、CVE-2025-66416) | プロキシ認証つきのリモートホスティング | そもそもサーバーが開発者のPC上にありません。呼び出し側には mcp_* APIキーかOAuthトークンが必要で、転送前に検証されます。キーはハッシュ化して保存され、同じIPから誤ったキーが繰り返されるとそのIPを10分間ロックアウトします |
| URLを知っていれば誰でもエンドポイントに届く | 送信元IPの許可リスト | restricted ポリシーにすると、登録したIPv4/IPv6のCIDRだけを受け付けます。認証より前、VMの起動より前にプロキシで判定し、リストが空ならすべて拒否します。ネットワークアクセス制限はProプラン以上で使えます |
| 文字列がコマンドになる、パストラバーサル(18件+5件) | サーバーごとのFirecracker microVM | インジェクションが成功しても、実行されるのはそのサーバー専用のmicroVMの中です。SSHキーや他のサーバーがある開発者の端末上ではありません |
| 侵害後に攻撃者のホストへデータが送られる | Egress制御 | モードは off(初期値)、observe、enforce。許可リストは最大100件(完全なホスト名、先頭1つのワイルドカード(例:*.example.com)、IPアドレス)で、DNSとnftablesによりホスト側で強制します。ただし postmark-mcp のように正規のメールAPI経由でコピーされるケースは止められません |
| 自分のサーバーコード内のクライアント分離やaudienceのバグ | ツール単位のスコープと一覧の絞り込み | tools:call:<ツール名>、resources:read:<uri>、prompts:get:<name> といったスコープをリクエストごとにプロキシで確認し、拒否した呼び出しはJSON-RPCエラーを返してサーバーに届けません。tool_list_filter_by_scope で tools/list を呼び出せるツールだけに絞れます |
| リソース枯渇(5件) | レート制限、クォータ、支出上限 | IPごとの毎分リクエスト数の上限、ワークスペースの月間クォータ、任意で設定できるサーバーごとの月間支出上限があります。ワークスペースの支出上限に達するとHTTP 402を返します |
| 侵害されたサーバーのビルドやログからシークレットが漏れる | 暗号化された環境変数 | 保存時に暗号化され、VMの起動時にだけ注入されます。ビルド引数、イメージレイヤー、ログには書き込まれず、ビルドログでは既知のトークン形式の文字列を伏せ字にします |
| 悪用の試みに気づく | リクエストログ | リクエストごとに mcp_method、tool_name、arg_keys(キー名のみ)、http_status、outcome(scope_denied や rate_limited など)、caller_kind、client_ip を記録します。保存期間はFreeが7日、ProとTeamが30日です |
はっきりさせておくべき限界もあります。サーバー内部のSDKは自分で更新する必要があります。CVE-2026-52869のようなセッション間のバグは自分のコードの中にあり、NodeFlareのスコープ確認で分かるのは「どのツールが呼ばれたか」で、「どのセッションに触れたか」ではありません。auth_enabled = false にすると呼び出し側の資格情報がそのままサーバーに渡り、NodeFlareのスコープ確認は効かなくなるので、SDK自体の認証バグ(CVE-2026-116684、GHSA-rvq5)がふたたび問題になります。また、NodeFlareのドキュメントにはOrigin検証、リクエスト本文のサイズ上限、依存関係のスキャンについての記載がないため、これらはサーバー側とCIで対策してください。
最小の始め方:
npm audit/pip-auditを回し、冒頭の表のバージョンまで上げる。- サーバーをNodeFlareにデプロイし、呼び出し元ごとに必要な
tools:call:<ツール名>だけを持つmcp_*キーを発行して、tool_list_filter_by_scopeを有効にする。 - Egressを1週間
observeで動かし、観測したホストでenforceに切り替える。
1サーバーまで無料で試せます:NodeFlareを始める
13. FAQ
これまでで最も深刻なMCPの脆弱性は?
スコアで見ると、公式コンポーネントでは mcp-remote のCVE-2025-6514(CVSS 3.1で9.6)とMCP InspectorのCVE-2025-49596(CVSS 4.0で9.4)が最も高く、どちらも信頼できないサーバーやWebページから開発者のPCでコマンドを実行され得るものです。影響の広さで見ると、2026年4月のSTDIO設定インジェクション系が最大で、AIプラットフォームにまたがる11件のCVEがあります。
どのバージョンのMCP SDKなら安全ですか?
2026年10月29日時点では、@modelcontextprotocol/sdk は1.32.0以上、TypeScriptの2.x系パッケージは2.3.0以上、Pythonの mcp は1.30.0以上または2.2.0以上を使ってください。Pythonの validate_token_resource やTypeScriptの maxToolInputElements のように、アップグレード後に設定が必要な修正もあります。
ローカルのMCPサーバーはDNSリバインディングの影響を受けますか?
認証なしでlocalhostにHTTPで立てている場合だけです。TypeScript SDKの1.24.0より前(CVE-2025-66414)とPython SDKの1.23.0より前(CVE-2025-66416)は、DNSリバインディング対策が初期状態で無効でした。stdioのサーバーは影響を受けないため、ローカルで使うならstdioのほうが安全です。
MCPのSTDIOの「仕様どおり」問題は、SDKのCVEですか?
いいえ。OX Securityの2026年4月の調査で付いたCVEは、LiteLLM(CVE-2026-30623)のように、信頼できない入力をstdioの起動コマンドに届かせてしまった製品に割り当てられています。AnthropicはSDKの挙動を想定どおりとしており、MCPのSecurity Best Practicesも、起動コマンドを表示して承認を得る責任をクライアントや起動側に置いています。
自分のMCP環境が影響を受けているか、どう確認すればよいですか?
Nodeのプロジェクトごとに npm audit、Pythonの環境ごとに pip-audit を実行し、クライアントのバージョンを確かめ、クライアントの設定ファイルにバージョン未固定の npx や uvx がないかを見ます。結果を本記事冒頭の最小バージョン表と比べ、アドバイザリが求めるアップグレード後の設定も入れてください。
npm auditでMCPの脆弱性は見つかりますか?
npmのパッケージなら見つかります。今回の検証では、SDK、mcp-remote、古い server-filesystem、入れ子になったSDKのコピーを検出し、修正版では0件でした。ただしPythonのパッケージ、AIクライアント、LiteLLMのようなプラットフォームは対象外なので、pip-audit とクライアントのバージョン確認を組み合わせてください。
リモートのMCPサーバーはローカルより安全ですか?
1種類のリスクはなくなります。リモートのサーバーは開発者のPCのファイルを読めず、localhostへのDNSリバインディングで狙われることもありません。その代わり、トークンのaudienceやテナント間のバグといった別のリスクが加わります。隔離された環境で動き、すべてのリクエストで認証を求め、最新のSDKを使っていれば、リモートのほうが安全と言えます。
スキャナーが @modelcontextprotocol/server-filesystem の2.xを脆弱と判定するのはなぜ?
このパッケージは日付形式のバージョン(最後は 2026.8.31)から、2026年10月11日の 1.0.0 を起点とするセマンティックバージョニングに切り替わりました。2.1.0 と 2025.7.1 を数値で比べるチェックでは、古い版に見えてしまいます。1.x と 2.x は2025年7月の修正より後のリリースで、npm audit も検出しません。
MCPの脆弱性の悪用には、プロンプトインジェクションが必要ですか?
ほとんどの場合、不要です。この一覧でプロンプトインジェクションが起点になるのは、CursorのCVE-2025-54135とWindsurfのCVE-2026-30615の2件だけです。残りは、悪意あるサーバーの応答、細工したURL、リポジトリの設定ファイル、Webページ、HTTPリクエストといった普通の入力で悪用されます。
新しいMCPのCVEはどこで追えばよいですか?
modelcontextprotocol/typescript-sdk、python-sdk、servers、inspector の各リポジトリのSecurityタブを確認し、@modelcontextprotocol/* と mcp にDependabotのアラートを設定し、使っているクライアントのリリースノートを追ってください。GitHub Advisory Databaseには、リポジトリのページにまだ出ていないSDKのアドバイザリが載ることがあり、今回の検証でも npm audit がそこからTypeScriptのアドバイザリ5件を見つけました。
まとめ
MCPの脆弱性は、いまや波のように押し寄せています。SDK、公式サーバー、クライアント、起動プラットフォームにまたがる44件のアドバイザリがあり、公式SDKは同じ種類のバグを2言語で数週間のうちに修正しています。大半は昔ながらのWebのバグで、最も多いのは信頼できない文字列がコマンドになるもの(44件中18件)です。やるべきことは多くありません。冒頭の表の最小バージョンまで上げ、オプトインの設定を入れ、npx と uvx の起動をすべてバージョン固定し、CIで npm audit と pip-audit を回し、ローカルのサーバーはstdioかトークン必須にします。そのうえで、次のCVEはすでに手元のどこかに入っていると考え、見つかったときに被害が広がらないようサーバーを隔離しておきましょう。
参考資料(一次情報)
- MCP Security Best Practices(2026-07-28)
- MCP TypeScript SDK セキュリティアドバイザリ
- MCP Python SDK セキュリティアドバイザリ
- MCP servers リポジトリのセキュリティアドバイザリ
- MCP Inspector セキュリティアドバイザリ
- GitHub Advisory: GHSA-46jr-4wx8-v453(CVE-2026-111768)
- JFrog: CVE-2025-6514(mcp-remoteのコマンドインジェクション)
- The Hacker News: AnthropicのGit MCPサーバーの3つの欠陥
- Tenable: CVE-2025-54135・CVE-2025-54136のFAQ(Cursor)
- CVE-2025-59536(Claude Code)
- CVE-2026-21852(Claude Code)
- OX Security: MCP Supply Chain Advisory
- OX Security: The Mother of All AI Supply Chains
- LiteLLM: CVE-2026-30623のセキュリティアップデート
- The Register: AnthropicのMCP設計上の欠陥(2026年4月16日)
- The Hacker News: 初の悪意あるMCPサーバー(postmark-mcp)
- BleepingComputer: AsanaのMCP機能で他組織に顧客データが露出
- NodeFlare Docs
