MCP 서버 SSRF는 AI 에이전트가 전달한 URL을 서버가 검증 없이 대신 요청(fetch)하면서 클라우드 메타데이터 엔드포인트·내부 서비스로 요청이 새는 취약점이다.
미국 NSA는 2026년 6월 MCP 보안 지침에서 도구 서버의 요청 검증 부재를 핵심 위험으로 지목했고, 분석에 따르면 조사 대상 MCP 구현의 상당수가 SSRF에 노출돼 있었다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. MCP 서버가 왜 SSRF의 표적인가요? A. MCP 서버는 '이 URL을 읽어와' 같은 에이전트 지시를 그대로 실행하는 fetch 도구를 자주 노출합니다. 목적지 검증이 없으면 공격자는 내부 IP나 메타데이터 주소를 넣어 자격증명을 빼냅니다. Q. 클라우드 메타데이터가 왜 위험한가요? A. 169.254.169.254 같은 링크로컬 주소는 인스턴스의 임시 자격증명·환경설정을 반환합니다. 여기에 도달하면 클라우드 계정 권한 탈취로 이어집니다. Q. 도메인 화이트리스트만으로 충분한가요? A. 부족합니다. DNS 리바인딩·리다이렉트로 우회되므로, 도메인 검증 후 실제 접속 직전에 해석된 IP를 다시 검사하고 리다이렉트를 비허용해야 합니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | 에이전트가 준 URL을 목적지 검증 없이 fetch | 치명 |
| 2 | 링크로컬/사설 대역(169.254·10·172.16·192.168) 미차단 | 치명 |
| 3 | 리다이렉트 자동 추적 허용 — 화이트리스트 우회 | 높음 |
| 4 | http/https 외 스킴(file, gopher) 허용 | 높음 |
| 5 | 에러 응답 본문을 에이전트에 그대로 반환 — 내부정보 노출 | 중간 |
표준 구현 코드
import ipaddress, socket
from urllib.parse import urlparse
BLOCKED = [ipaddress.ip_network(c) for c in (
"127.0.0.0/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16",
"169.254.0.0/16", "::1/128", "fc00::/7",
)]
def safe_fetch(url: str):
p = urlparse(url)
if p.scheme not in ("http", "https"): # 스킴 화이트리스트
raise ValueError("허용되지 않은 스킴")
ip = ipaddress.ip_address(socket.gethostbyname(p.hostname))
if any(ip in net for net in BLOCKED): # 해석된 IP 재검사
raise ValueError("내부/메타데이터 대역 차단")
# requests: allow_redirects=False 로 리다이렉트 우회 차단
return http_get(url, allow_redirects=False, timeout=5)
핵심은 "동작하는 코드"와 "안전한 코드"가 다르다는 점이다.
AI 코딩 도구는 기능 충족 코드를 우선 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어·정책·CI 게이트로 모든 경로에 일괄 적용하는 것이 표준이다.
30초 자가진단
# MCP 서버에 내부 URL 요청을 흘려본다
curl -X POST http://localhost:PORT/tools/fetch \
-d '{"url":"http://169.254.169.254/latest/meta-data/"}'
# 클라우드 메타데이터가 돌아오면 SSRF 결함
# DNS 리바인딩 우회 확인 — 사설 IP로 해석되는 도메인
curl -X POST http://localhost:PORT/tools/fetch -d '{"url":"http://internal.yourcorp.local/"}'
위 시그널이 발견되면 결함이다. Model Context Protocol 공식 문서를 함께 참조하라.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | fetch 목적지를 스킴 화이트리스트(http/https)로 제한 |
| 2 | 해석된 IP를 사설·링크로컬 대역과 대조해 차단 |
| 3 | 리다이렉트 자동 추적 비허용(allow_redirects=False) |
| 4 | 도구 응답에서 내부 헤더·에러 스택 마스킹 |
| 5 | 에이전트 도구 권한 최소화 + 요청 감사 로깅 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검 후 우선순위대로 패치.
CISO·임원: 조직 전체 점검·규제 대응은 SENTRIX 30분 1:1 상담으로.
결함은 발견 즉시, 늦어도 24시간 안에 패치하는 것이 표준이다.