flawopen.com/Teardowns/cve-2026-14540-google-mcp-toolbox-ssrf
CVE-2026-14540:Google MCP Toolbox の SSRF
CVE-2026-14540 により、MCP Toolbox の HTTP リクエストは最終的なネットワーク宛先を確認せずにリダイレクトを追跡できました。1.5.0 以降へ更新してください。[1], [3]
郵便仕分け担当が荷物の最初の宛先だけを確認し、その後は新しい宛先を確かめず転送シールに従うような状態です。HTTP リダイレクトはそのシールに当たります。最終 IP を検証しなければ、普通の Web サイト向けのリクエストがプライベートネットワークに転送されることがあります。修正では接続時に実際の宛先を確認し、リダイレクト先も検査します。[2], [4], [7]
主要な概念と専門用語
Server-side request forgery (SSRF)- 攻撃者の影響を受ける宛先へ HTTP リクエストを送るようサービスを誘導する問題です。リクエストはサーバーから発生するため、呼び出し元が到達できないネットワークにも届く可能性があります。[6]
DNS rebinding と TOCTOU- ホスト名は検証時と socket 接続時で異なる IP に解決されることがあります。接続時に解決後の IP を確認すれば、検査と使用の間の隙間を埋められます。[2], [7]
Generic HTTP source と tool- 設定された endpoint とツール引数から HTTP リクエストを組み立てる MCP Toolbox のコンポーネントです。アドバイザリはこの経路を影響対象としています。[1], [2], [4]
CWE-918- Server-Side Request Forgery (SSRF):アプリケーションが URL や宛先を取得する際、リクエストの送信先を十分に制限していない状態です。[6]
フレームワーク対応
- このガイドで説明する弱点の CWE 参照: CWE-918
- D3-OTF 送信トラフィックのフィルタリング — このガイドで説明する送信ネットワークの制限により、サービスまたはホストが接続できる宛先を絞れます。
根本原因の分析 (Root Cause)
影響を受けるバージョンでは、generic HTTP source は timeout と transport を設定した Go http.Client を作成していましたが、宛先を考慮するリダイレクトポリシーや socket 境界での IP 制限はありませんでした。Go は既定でリダイレクトを追跡します。設定された HTTP tool はパラメーターをリクエストへ組み込むことがあるため、細工された値やリダイレクトによってリクエストが本来の宛先から外れる可能性がありました。元の URL だけを検査しても不十分です。リダイレクトで宛先が変わり、検証から接続までの間に DNS が別 IP を返す場合もあります。上流修正は SSRFGuard を追加し、CheckRedirect で禁止宛先を拒否するとともに、接続層でも解決後の IP を再確認します。プライベート、loopback、link-local、その他の非グローバルアドレスは既定で拒否されます。許可範囲やプライベートネットワークの有効化は設定例外なので、対象を厳密に絞ってください。[1], [2], [4]
ステップ・バイ・ステップの攻撃フロー
3つの条件で到達可能性を判定する
この攻撃経路には次の3条件がすべて必要です。(1) 影響を受ける0.3.0〜1.4.0の環境でgeneric HTTP source/toolを使用している。(2) 呼び出し元がその経路を利用でき、URL/パスを制御するかリダイレクトを発生させられる。(3) Toolboxのホストから宛先へルーティングできる。いずれかの条件が欠ければ、この経路ではその宛先に到達できません。宛先側の認証とアクセス制御は引き続き適用されます。[1]
Toolbox が自身のネットワークからリクエストする
次のリクエストは Toolbox ホストから送信され、そのネットワークが許可する宛先に到達できます。そのため、MCP 呼び出し元が直接送れないリクエストを内部サービスなどが受け取る可能性があります。すべての構成でクラウド資格情報が露出することや、すべてのリダイレクトが成功することを CVE は示していません。[1]
ソースコード比較:脆弱 vs 堅牢化
これは上流 HTTP クライアント経路の要点を抜粋した比較で、ファイル全体の置き換えではありません。マージ済み修正は SSRFGuard を追加し、リダイレクト先を確認するとともに接続時に禁止された解決後 IP を拒否します。これにより、リダイレクト時だけの検証では残る DNS rebinding の隙間も塞ぎます。guard はプライベートなど非グローバルアドレスを既定で遮断します。allowPrivateNetworks、allowedIpRanges、customBlockedIpRanges は強力な設定なので、allowlist の例外は必要な範囲だけにしてください。ソースファイル:internal/sources/http/http.go。[2]
ソース抜粋: HTTP クライアントとリダイレクトポリシーの抜粋
client := http.Client{
Timeout: duration,
Transport: tr,
}
// CheckRedirect ポリシーがない場合、クライアントはデフォルトのポリシーで
// HTTP リダイレクトに従う。トランスポートにも SSRF 宛先のガードがない。
client := &http.Client{
Timeout: duration,
Transport: tr,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if len(via) >= 10 {
return fmt.Errorf("stopped after 10 redirects")
}
hostname := req.URL.Hostname()
if ip := net.ParseIP(hostname); ip != nil {
if guard.IsIPBlocked(ip) {
return fmt.Errorf("redirect to blocked IP %s denied", ip)
}
return nil
}
addrs, err := resolver.LookupHost(req.Context(), hostname)
if err != nil {
return fmt.Errorf("failed to resolve redirect host %s: %w", hostname, err)
}
for _, addr := range addrs {
if ip := net.ParseIP(addr); ip != nil && guard.IsIPBlocked(ip) {
return fmt.Errorf("redirect host %s resolves to blocked IP %s", hostname, addr)
}
}
return nil
},
}
// 同じ SSRFGuard をソケット接続時にも適用する。
// そのため DNS 応答によって許可済みアドレスがブロック対象に変わることはない。
エンジニアリング&システム堅牢化チェックリスト
- ✓Google MCP Toolbox のバイナリ、コンテナ、依存関係を棚卸しし、0.3.0〜1.4.0 を影響対象として扱い、1.5.0 以降へ更新する。[1], [3]
- ✓実際に稼働する Toolbox プロセスのバージョンを確認する。MCP client、agent framework、ホストアプリを更新しても、このプロセスは更新されない。[1], [3]
- ✓各 generic HTTP source/tool で、どの引数が URL、パス、host、リダイレクトに影響するかを追跡し、不要な場合は信頼できない入力による宛先制御を取り除く。[1], [2]
- ✓記録済みの要件がなければ
allowPrivateNetworksを無効にする。有効にする場合、allowedIpRangesを必要最小限の CIDR に絞り、ファイアウォール例外としてレビューする。[4], [2] - ✓広いプライベートネットワークアクセスを有効にしても到達させたくない機密宛先には
customBlockedIpRangesを使う。[4], [2] - ✓直接のプライベート/loopback IP、禁止範囲へ解決される host、禁止先へのリダイレクト、ループ、無効 CIDR、検証から接続までに DNS 応答が変わるケースを回帰テストに含める。[2]
- ✓host、コンテナ、VPC のいずれかで送信ネットワークポリシーを適用し、将来の URL 検証回帰が metadata サービスや無関係な内部ネットワークへ届かないようにする。[7]
- ✓FlawOpen の対応ガイダンス:影響を受けるインスタンスが公開されていた場合、HTTP ログとネットワーク送信先を確認する。CVE の存在だけではデータアクセスの証拠にならない。
参考資料
- Google CNA CVE record CVE-2026-14540 (NVD; CNA CVSS-BT 8.0, CVSS 4.0)
- Google MCP Toolbox pull request #3448: SSRF guard
- MCP Toolbox v1.5.0 release and changelog
- Google MCP Toolbox HTTP source documentation
- The Next Web: Google, JPMorgan and two governments fixed the same MCP flaw
- MITRE CWE-918: Server-Side Request Forgery (SSRF)
- OWASP SSRF 防止チートシート