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를 확인하지 않으면 일반 웹사이트로 향한 요청이 사설 네트워크로 전달될 수 있습니다. 수정은 연결 시 실제 목적지를 확인하고 리디렉션 대상도 검사합니다.[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]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 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]
단계별 공격 실행 흐름
세 가지 조건으로 도달 가능성 확인
이 공격 경로에는 세 조건이 모두 필요합니다. (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, 경로, 호스트 또는 리디렉션에 영향을 주는지 추적하고 불필요한 신뢰할 수 없는 입력의 목적지 제어를 제거하세요.[1], [2]
- ✓문서화된 필요가 없다면
allowPrivateNetworks를 끄세요. 켜야 한다면allowedIpRanges를 필요한 최소 CIDR로 제한하고 방화벽 예외처럼 검토하세요.[4], [2] - ✓더 넓은 사설망 접근이 켜져도 닿으면 안 되는 민감한 목적지는
customBlockedIpRanges에 지정하세요.[4], [2] - ✓직접적인 사설·loopback IP, 차단 범위로 해석되는 호스트명, 차단 목적지로의 리디렉션, 리디렉션 루프, 잘못된 CIDR, 검증과 연결 사이 DNS 응답 변경을 회귀 테스트에 포함하세요.[2]
- ✓호스트, 컨테이너 또는 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 방지 치트 시트