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 요청이 리디렉션을 따르게 했습니다. 1.5.0 이상으로 업데이트하세요.[1], [3]

💡 알기 쉬운 설명 (ELI5)

우편 분류 담당자가 소포의 첫 주소만 확인한 뒤 새 목적지를 확인하지 않고 전달 스티커를 따라가는 상황과 같습니다. HTTP 리디렉션이 그 스티커 역할을 합니다. 최종 IP를 확인하지 않으면 일반 웹사이트로 향한 요청이 사설 네트워크로 전달될 수 있습니다. 수정은 연결 시 실제 목적지를 확인하고 리디렉션 대상도 검사합니다.[2], [4], [7]

핵심 개념 및 용어

Server-side request forgery (SSRF)
서비스가 공격자의 영향을 받는 목적지로 HTTP 요청을 보내도록 유도되는 문제입니다. 요청은 서버에서 발생하므로 호출자가 직접 접근할 수 없는 네트워크에도 도달할 수 있습니다.[6]
HTTP 리디렉션
응답이 HTTP 클라이언트에 다른 URL로 후속 요청을 보내라고 지시할 수 있습니다. 최초 URL만 검사해서는 다음 요청의 목적지를 제한할 수 없습니다.[4], [7]
DNS rebinding 및 TOCTOU
호스트 이름은 검증 시 한 주소로, socket 연결 시 다른 주소로 해석될 수 있습니다. 연결 시 해석된 IP를 검사하면 검사와 사용 사이의 간극을 막을 수 있습니다.[2], [7]
Generic HTTP source 및 tool
설정된 endpoint와 tool 매개변수로 HTTP 요청을 구성하는 MCP Toolbox 구성 요소입니다. 보안 공지는 이 경로가 영향을 받는다고 명시합니다.[1], [2], [4]
CWE-918
Server-Side Request Forgery (SSRF): 애플리케이션이 URL이나 목적지를 가져오면서 요청이 향할 수 있는 곳을 충분히 제한하지 않는 문제입니다.[6]

프레임워크 매핑

근본 원인 분석 (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]

단계별 공격 실행 흐름

단계 1

세 가지 조건으로 도달 가능성 확인

이 공격 경로에는 세 조건이 모두 필요합니다. (1) 영향을 받는 0.3.0~1.4.0 배포에서 generic HTTP source/tool을 사용합니다. (2) 호출자가 해당 경로를 호출하고 URL/경로를 제어하거나 리디렉션을 유발할 수 있습니다. (3) Toolbox 호스트가 목적지로 라우팅할 수 있습니다. 하나라도 충족되지 않으면 이 경로로 해당 목적지에 도달할 수 없습니다. 목적지 자체의 인증 및 접근 제어는 계속 적용됩니다.[1]

단계 2

Tool 인자가 외부 요청에 영향을 줌

설정된 HTTP tool은 기본 endpoint와 입력값을 결합합니다. CVE 설명에 따르면 조작된 경로 매개변수가 HTTP source를 다른 목적지로 보낼 수 있습니다. MCP 사용자나 agent가 tool을 호출하며, 신뢰할 수 없는 콘텐츠는 주변 workflow가 허용할 때만 호출에 영향을 줍니다.[1], [2]

단계 3

원래 URL만으로 리디렉션을 제한할 수 없음

영향받는 client에는 제한적인 CheckRedirect hook과 대상 IP 검사가 없었습니다. 응답이 다른 URL을 지정할 수 있으므로 base URL이나 첫 요청만 검사해서는 후속 요청을 제한하지 못합니다.[1], [2]

단계 4

Toolbox가 자체 네트워크 위치에서 요청함

후속 요청은 Toolbox 호스트에서 나가며 해당 호스트 네트워크가 허용하는 목적지에 도달할 수 있습니다. 따라서 내부 서비스가 MCP 호출자가 직접 보낼 수 없는 요청을 받을 수 있습니다. CVE는 모든 배포에서 클라우드 자격 증명이 노출되거나 모든 리디렉션이 성공한다고 입증하지 않습니다.[1]

단계 5

업데이트하고 송신 경계를 확인

MCP Toolbox를 1.5.0 이상으로 업데이트하세요. 수정은 설정된 IP 리터럴과 리디렉션 대상을 검사하고 연결 시 허용되지 않는 해석 IP를 차단해 DNS rebinding도 다룹니다. 필요하지 않으면 allowPrivateNetworks를 끄고 허용 범위를 좁게 유지하며 별도의 송신 네트워크 정책을 적용하세요.[2], [3], [4]

소스 코드 비교: 취약한 구현 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 응답이 허용된 주소를 차단된 주소로 바꿀 수 없습니다.

엔지니어링 및 시스템 보안 강화 체크리스트

출처