FlawOpen

flawopen.com/Teardowns/cve-2026-14540-google-mcp-toolbox-ssrf

● CVE-2026-14540 · CVSS 8.0 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-14540: Google MCP Toolbox में SSRF

CVE-2026-14540 में MCP Toolbox के HTTP अनुरोध अंतिम नेटवर्क पते की जाँच किए बिना redirects का अनुसरण कर सकते थे। संस्करण 1.5.0 या नया स्थापित करें।[1], [3]

💡 आसान भाषा में (ELI5)

डाक छँटाई करने वाला पार्सल पर पहला पता जाँचता है, फिर नए पते की पुष्टि किए बिना किसी भी forwarding sticker का पालन करता है। HTTP redirect उसी sticker जैसा है: अंतिम IP जाँचे बिना सामान्य वेबसाइट के लिए भेजा गया अनुरोध निजी नेटवर्क तक पहुँच सकता है। सुधार connection बनाते समय वास्तविक destination और redirect destinations दोनों जाँचता है।[2], [4], [7]

इस पेज के मुख्य शब्द

Server-side request forgery (SSRF)
सेवा को हमलावर के प्रभाव वाले destination पर HTTP अनुरोध भेजने के लिए प्रेरित किया जाता है। अनुरोध server से निकलता है, इसलिए वह ऐसे नेटवर्क तक पहुँच सकता है जहाँ caller सीधे नहीं पहुँच सकता।[6]
HTTP redirect
एक response HTTP client को दूसरे URL पर अगला अनुरोध भेजने का निर्देश दे सकता है। केवल शुरुआती URL की जाँच आगे के अनुरोध का destination सीमित नहीं करती।[4], [7]
DNS rebinding और TOCTOU
जाँच के समय hostname एक IP पर और socket खुलते समय किसी दूसरे IP पर resolve हो सकता है। Connection के समय resolved IP की जाँच जाँच और उपयोग के बीच की इस खाई को बंद करती है।[2], [7]
Generic HTTP source और tool
MCP Toolbox के वे components जो configured endpoints और tool parameters से HTTP requests बनाते हैं। Advisory इसी रास्ते को प्रभावित बताती है।[1], [2], [4]
CWE-918
Server-Side Request Forgery (SSRF): application URL या destination fetch करते समय यह पर्याप्त रूप से सीमित नहीं करती कि अनुरोध कहाँ जा सकता है।[6]

फ्रेमवर्क मैपिंग

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-918
  • D3-OTF आउटबाउंड ट्रैफ़िक फ़िल्टरिंग — इस गाइड में दिया गया आउटबाउंड नेटवर्क प्रतिबंध सेवा या होस्ट के पहुँच योग्य गंतव्यों को सीमित करता है।

मूल कारण विश्लेषण (Root Cause)

प्रभावित versions में generic HTTP source ने timeout और transport वाला Go http.Client बनाया, लेकिन destination-aware redirect policy या socket स्तर पर IP रोक नहीं थी। Go default रूप से redirects follow करता है। Configured HTTP tools parameters को requests में जोड़ सकते हैं, इसलिए crafted value या redirect अनुरोध को अपेक्षित destination से हटा सकता था। केवल मूल URL जाँचना पर्याप्त नहीं है: redirect destination बदल देता है और validation तथा connection के बीच DNS अलग IP दे सकता है। Upstream fix SSRFGuard जोड़ता है, CheckRedirect में blocked destinations अस्वीकार करता है और connection layer पर resolved IP फिर जाँचता है। Private, loopback, link-local और अन्य non-global addresses default रूप से blocked हैं; ranges या private-network access की अनुमति configuration exception है और इसे बहुत सीमित रखना चाहिए।[1], [2], [4]

हमले का चरण-दर-चरण प्रवाह

चरण 1

तीन शर्तों से पहुँच की जाँच करें

इस chain के लिए तीनों शर्तें आवश्यक हैं: (1) प्रभावित 0.3.0–1.4.0 deployment में generic HTTP source/tool का उपयोग हो; (2) caller उस path को invoke कर सके और URL/path को नियंत्रित करे या redirect करा सके; और (3) Toolbox host destination तक route कर सके। कोई भी शर्त पूरी न हो तो यह chain इस path से उस destination तक नहीं पहुँच सकती। Destination के अपने authentication और access controls फिर भी लागू रहते हैं।[1]

चरण 2

Tool argument outgoing request को प्रभावित करता है

Configured HTTP tool अपने base endpoint को input values के साथ जोड़ता है। CVE description के अनुसार crafted path parameters HTTP source को दूसरे destination पर भेज सकते हैं। MCP user या agent tool call करता है; untrusted content उस call को तभी प्रभावित कर सकता है जब आसपास का workflow इसकी अनुमति दे।[1], [2]

चरण 3

मूल URL redirects को सीमित नहीं करता

प्रभावित client में restrictive CheckRedirect hook और target-IP validation नहीं थी। Response दूसरे URL की ओर भेज सकता है, इसलिए केवल base URL या पहली request जाँचने से अगली request सीमित नहीं होती।[1], [2]

चरण 4

Toolbox अपने नेटवर्क से अनुरोध करता है

अगली request Toolbox host से जाती है और उस host के network द्वारा अनुमत destinations तक पहुँच सकती है। इसलिए internal services ऐसे requests पा सकती हैं जिन्हें MCP caller सीधे नहीं भेज सकता। CVE यह साबित नहीं करता कि हर deployment cloud credentials उजागर करती है या हर redirect सफल होता है।[1]

चरण 5

अपडेट करें और outbound सीमा जाँचें

MCP Toolbox को 1.5.0 या नए version पर अपडेट करें। Fix configured literal IPs और redirect targets जाँचता है, तथा connection के समय disallowed resolved IPs रोकता है; इससे DNS rebinding का जोखिम भी घटता है। आवश्यकता न हो तो allowPrivateNetworks बंद रखें, allowed ranges सीमित रखें और अलग से egress policy लागू करें।[2], [3], [4]

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह upstream HTTP client path की सीमित तुलना है, पूरी फ़ाइल का विकल्प नहीं। Merged fix SSRFGuard जोड़ता है: यह redirect destinations जाँचता है और connection के समय blocked resolved IP अस्वीकार करता है, जिससे केवल redirect समय DNS resolve करने पर बचने वाली DNS rebinding gap बंद होती है। Guard private और अन्य non-global addresses default रूप से रोकता है। allowPrivateNetworks, allowedIpRanges और customBlockedIpRanges शक्तिशाली controls हैं; allowlist exception केवल आवश्यक range तक सीमित रखें। Source file: internal/sources/http/http.go।[2]

सोर्स अंश: HTTP client और redirect नीति का अंश

कमज़ोर कार्यान्वयन
client := http.Client{
	Timeout: duration,
	Transport: tr,
}

// CheckRedirect policy न होने पर client default policy के अनुसार
// HTTP redirects follow करता है। transport में SSRF destination guard भी नहीं है।
सुरक्षित और सुदृढ़ फ़िक्स
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 socket dial boundary पर भी लागू होता है,
// इसलिए DNS response permitted address को blocked address में नहीं बदल सकता।

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत