速報

JAL・JTAの予約情報約9万2千人分に外部参照の形跡|対象項目と利用者対応

CATEGORY

MCP TypeScript Server SDKで応答が別利用者へ混線|2.3.0更新後の修正手順

※本ページのリンクにはプロモーションが含まれています。

2つのMCPクライアントの交差したメッセージを、接続ごとに分離されたサーバーへ整理する概念イラスト

この記事のポイント

脆弱性
CVE-2026-111770
深刻度

HIGH7.7

対象
@modelcontextprotocol/server 2.0.0以上2.3.0未満(HTTPでサーバーまたはステートレス・トランスポートを共有する構成)
悪用状況
不明
推奨対応
2.3.0以降へ更新し、MCPサーバーとトランスポートをリクエスト単位またはセッション単位で分離してください。複数クライアントの並行テストとログ確認も実施します。
公表日

目次

公式の(MCP)TypeScript Server に、経由で複数のクライアントを受け付ける構成において、あるクライアント向けの応答や通知が別のクライアントへ届く可能性がある-2026-111770が公表されました。対象は@modelcontextprotocol/server 2.0.0以上2.3.0未満で、修正版は2.3.0です。

優先して確認すべきなのは、MCPサーバーをHTTPで公開し、複数利用者または複数エージェントから到達でき、同じMcpServer/Serverインスタンスまたはステートレス・トランスポートを使い回している環境です。更新だけでは処理が止まることがあるため、サーバーとトランスポートをリクエスト単位またはセッション単位で分離する実装変更まで必要です。本稿は2026年10月27日に公式と修正差分を確認したニュース解説です。

スポンサーリンク

影響は「MCPへ接続できること」よりインスタンス共有で決まる

問題の中心は方式やツールの内容ではなく、HTTP接続をまたいで状態を共有する実装です。公式アドバイザリによると、影響する版ではメッセージの接続先を-RPCのidだけで対応付けていました。SDKクライアントは通常0からリクエスト番号を付けるため、別々のクライアントでも同じ番号が現れます。サーバーやトランスポートが共有されていると、その衝突によって応答や通知の送信先を取り違える可能性があります。

これはAIモデルが誤った回答を作る現象ではありません。ツール実行結果、エラー、通知など、MCPの通信そのものが別の接続へ渡り得る問題です。ツールが顧客情報、社内文書、内容、運用ログを返すなら機密性への影響があります。別利用者の結果を自分の処理結果として受け取れば、エージェントが誤った後続操作を選ぶおそれもあります。 v3.1は7.7(High)で、公式評価は機密性High、完全性Low、可用性Highです。

確認項目影響判断
パッケージ@modelcontextprotocol/server 2.0.0〜2.2.0
接続方式複数クライアントが到達できるHTTP
危険な生成単位起動時に1個作り、全リクエストで同じサーバーまたはステートレス・トランスポートを共有
影響外と明記stdioサーバー、呼び出しごとに新規サーバーを作るcreateMcpHandler()、@modelcontextprotocol/sdk 1.26.0以降
@modelcontextprotocol/server 2.3.0以降

最初に依存版とHTTP公開範囲を棚卸しする

アプリの直下だけでなく、ワークスペースや共通基盤が間接依存としてSDKを入れている場合もあります。対象リポジトリでを保全した上で、利用するパッケージマネージャーに合わせて依存経路を確認します。

npm ls @modelcontextprotocol/server
npm explain @modelcontextprotocol/server

モノレポではルートだけでなく、実際にMCPサーバーを配備する各ワークスペースで実行してください。コンテナの場合は、ソースのpackage.jsonではなく、配備イメージに入ったロックファイルや、ログでも版を照合します。開発環境を更新しても、古いイメージが稼働していれば対応は完了していません。

次に、HTTPエンドポイントへ誰が到達できるかを確認します。インターネット公開だけが対象ではありません。社内ゲートウェイの背後でも、複数部署、複数、複数エージェントが同じプロセスへ接続するなら、クライアント間の境界があります。反対に、各利用者が自分の端末で起動するstdio構成は公式に影響外とされています。ただし、stdioだから他の脅威もないという意味ではありません。

スポンサーリンク

更新後は「1個を共有する実装」を必ず直す

2.3.0へ更新すると、共有を続ける危険な実装をSDKが拒否します。2回目のconnect()はALREADY_CONNECTEDとなり、ステートレス・トランスポートは2回目のリクエストを拒否します。そのため、パッケージ更新後に疎通確認を1回だけ成功させても不十分です。2件以上の要求を並行または連続で送り、再利用を前提にしていたコードが失敗するかを確かめる必要があります。

公式が示す修正方針は三つです。createMcpHandler()には生成済みオブジェクトではなく、呼び出しごとに新しいMcpServerを作るファクトリーを渡します。低レベルのHTTPハンドラーでは、リクエスト処理の内側でサーバーとトランスポートを作ります。状態を保持する場合はsessionIdGeneratorを設定し、セッションごとにサーバーとトランスポートの組を分離して管理します。

// ステートレスHTTPの考え方
app.post('/mcp', async (req, res) => {
  const server = buildMcpServer();
  const transport = buildStatelessTransport();
  await server.connect(transport);
  await transport.handleRequest(req, res, req.body);
});

上のコードは生成単位を示す概念例であり、そのまま動く完成コードではありません。利用しているexpress、fastify、hono、node向けミドルウェアの現行READMEと型定義に合わせてください。公式の修正では、これらのREADME例も、サーバーをハンドラー外で1回作る形からリクエストごとに作る形へ変更されました。セッション方式では、切断時の破棄、タイムアウト、上限数も設計しないと、古いセッションの残留やメモリ消費という別の問題が生じます。

並行テストで利用者境界を検証する

修正確認では、単独クライアントの正常系だけでなく、クライアントAとBから同時に要求を送り、互いに異なる識別可能なテストデータを返すツールを使います。Aの応答、進捗通知、エラー、キャンセル結果がBへ届かず、その逆も成立することを確認します。JSON-RPCのidは両方で同じ値から始めると、今回の境界を検証しやすくなります。本番の秘密や顧客データはテストに使いません。

  • 2クライアントから同じidの要求を並行送信する
  • 通常応答だけでなく通知、エラー、キャンセルも送信先を確認する
  • 片方を切断・再接続し、古いセッションへ配送されないことを確認する
  • 認証主体、セッションID、接続ID、ツール名、結果の宛先をログで追えるようにする
  • ログ本文にはツール結果やトークンをそのまま残さず、相関IDと配送判断を記録する

負荷試験では、更新後にALREADY_CONNECTEDや2回目要求の拒否が増えていないかも確認します。このエラーは修正版が危険な再利用を止めた合図であり、安易な再試行で隠すべきではありません。インスタンスの生成位置を直し、接続単位が意図どおりかを確かめてから再試行戦略を調整します。

スポンサーリンク

漏えいの可能性がある場合は更新と調査を分ける

対象版・共有実装・複数クライアントという条件が揃っていた場合、更新だけで過去の影響は分かりません。まず対象期間、稼働した版、履歴、到達可能だった利用者やエージェントを確定します。次に、同時刻に異なる認証主体で同じJSON-RPC IDが使われた接続、応答先と要求元の主体が一致しない記録、不自然な再接続やキャンセルを調べます。アプリケーションログだけで本文まで残していなければ、混線の有無を完全に復元できない場合があります。その限界も調査記録に残します。

他利用者の秘密や、個人情報を含むツール結果が誤配送された可能性があるなら、データ種別と受信可能だった主体を絞り、必要な資格情報の失効・再発行、利用者通知、法務・個人情報保護担当への連携を判断します。公式アドバイザリは実環境での悪用や漏えい事例を確認したとは述べていません。したがって、影響条件に合うことだけで侵害済みと断定せず、ログと構成から評価します。

完了条件は版・生成単位・境界テストの三つ

対応完了は「2.3.0がロックファイルに入った」だけでは判断できません。配備物が2.3.0以降であること、HTTPのサーバー/トランスポートがリクエストまたはセッションごとに分離されていること、複数クライアントの並行テストで応答・通知・エラーが混ざらないことの三つを記録します。セッション方式なら破棄条件と所有者の対応も確認対象です。

MCPの認証・認可は、誰がどのツールを呼べるかを制御します。今回の脆弱性は、その判定後に返すメッセージの配送境界で起きます。認証を導入済みでも、同じプロセス内の状態分離が崩れれば別利用者へ結果が渡り得ます。基盤では、権限、ツール定義、通信セッションを別々の境界として点検してください。

リバースプロキシやJWTだけでは配送境界を直せない

で利用者ごとに接続を振り分けていても、同じアプリケーションプロセスへ複数接続が入る構成なら、プロセス内の共有は残ります。スティッキーセッションも、ある利用者を同じバックエンドへ送る仕組みであり、バックエンド内のサーバーオブジェクトを利用者ごとに分ける機能ではありません。のsubやtenant_idを検証していても、認証後の応答配送がJSON-RPC IDだけで決まれば今回の問題を防げません。

修正を段階展開する場合は、まずで複数クライアントの同時試験を実施し、次に一部インスタンスへ2.3.0とコード変更を同時に配備します。エラー率、接続数、セッション数、メモリ使用量、処理時間を旧版と比較し、危険な共有がなくても容量不足で失敗していないかを見ます。新しいインスタンスをリクエストごとに作る設計では、ツール登録や外部クライアント生成まで毎回重くしないよう、変更可能な接続状態と読み取り専用の設定を分けてください。ただし、性能対策として状態を再び共有し、脆弱な形へ戻さないことが優先です。

手順も、古いSDKへ戻すだけでは安全になりません。互換性問題で2.3.0を戻す必要がある場合でも、公式が示すリクエスト単位またはセッション単位の生成変更は維持します。変更を維持できないなら、MCPのHTTP入口を単一クライアントへ制限するか停止し、複数利用者へ再公開しない判断が必要です。

関連記事

出典・一次情報

本記事は以下の公開情報をもとに作成しています。最新の状況は各リンク先で確認してください。

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

あわせて確認したい対策・解説

ほかの脆弱性

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク

ロールバック

更新や変更で問題が起きたときに、システムやデータを変更前の状態に戻すこと。

詳しく見る

ステージング

本番とほぼ同じ構成で用意する検証用の環境。更新や変更を本番に反映する前に、動作を確かめるために使う。

詳しく見る

JWT

利用者の情報や権限を、署名付きのJSONで表したトークン。APIの認証やログイン状態の受け渡しに使う。

詳しく見る

ロードバランサー

複数のサーバーにアクセスを振り分け、負荷を分散させる装置や仕組み。障害時に別のサーバーへ切り替える役割も持つ。

詳しく見る

AIエージェント

目標を与えると、計画を立て、ツールを使いながら作業を自律的に進めるAIの仕組み。

詳しく見る

アクセストークン

サービスやAPIを利用する権限を表す文字列。ログインや認可のあとに発行され、リクエストに付けて送る。

詳しく見る

デプロイ

作成・修正したプログラムやWebサイトを、本番のサーバーに配置して使える状態にすること。

詳しく見る

テナント

クラウドやSaaSで、利用する組織ごとに分けられた区画。一つの仕組みを複数の組織で共有する形をマルチテナントと呼ぶ。

詳しく見る

ビルド

ソースコードなどから、実際に動かしたり配布したりできる形の成果物を作る作業。

詳しく見る

SBOM

ソフトウェアを構成する部品(ライブラリなど)とそのバージョンを一覧にしたもの。脆弱性の影響の確認に使う。

詳しく見る

ロックファイル

パッケージマネージャーが、実際に入れた依存パッケージのバージョンを記録するファイル。package-lock.jsonなど。

詳しく見る

パッチ

ソフトウェアの不具合や脆弱性を修正するための更新プログラム。適用することで既知の問題を解消する。

詳しく見る

エンドポイント

APIでリクエストを送る先のURL。また、ネットワークにつながるパソコンやスマートフォンなどの端末のことも指す。

詳しく見る

CVSS

脆弱性の深刻度を0.0〜10.0の数値で評価する共通の基準。数値が大きいほど深刻度が高い。

詳しく見る

リポジトリ

ソースコードなどのファイルと、その変更の履歴をまとめて保管する場所。Gitで管理し、GitHubなどで共有する。

詳しく見る

JSON

データを「名前と値」の組で表す、軽くて読みやすいテキストの形式。APIのデータのやりとりなどで広く使われる。

詳しく見る

認証

アクセスしてきた相手が本人であることを確かめる仕組み。パスワードや生体情報、電子証明書などを使う。

詳しく見る

アドバイザリ

開発元や公的機関が公表する、脆弱性の内容・影響を受けるバージョン・対処方法などをまとめた情報。

詳しく見る

CVE

公開された脆弱性に付けられる世界共通の識別番号。「CVE-2026-12345」のように年と連番で表す。

詳しく見る

脆弱性

ソフトウェアや設定の不備のうち、攻撃者に悪用されると情報漏えいや不正操作などにつながる弱点。

詳しく見る

HTTP

ブラウザとWebサーバーがやりとりするための決まりごと(プロトコル)。暗号化したものはHTTPSと呼ぶ。

詳しく見る

SDK

ソフトウェア開発キット。特定のサービスや環境向けの開発に必要なライブラリやツール、ドキュメントをまとめたもの。

詳しく見る

MCP

AIアプリケーションと外部のツールやデータをつなぐための共通の仕組み(プロトコル)。Anthropicが公開した。

詳しく見る