무슨 일이 있었나
공식 MCP TypeScript SDK에서 OAuth 클라이언트는 클라이언트가 연결한 MCP 서버가 클라이언트의 OAuth 자격 증명을 받을 권한 부여 서버를 결정하도록 허용했습니다. 저장/사전 프로비저닝된 자격 증명은 해당 권한 부여 서버에 바인딩되지 않았습니다(CWE-345/CWE-522). 악성 또는 손상된 MCP 서버는 보호 리소스 메타데이터에서 자체 권한 부여 서버를 지정할 수 있으며, 사용자 상호 작용 없이 피해자의 저장된 `refresh_token` 및 `client_secret`(1.x) 또는 번들된 비대화형 프로바이더의 구성된 `client_secret`/서명된 어설션(1.x 및 2.x)을 받을 수 있습니다. SDK 1.31.0 및 @modelcontextprotocol/client 2.2.0에서 수정되었습니다.
왜 중요한가
이것은 Model Context Protocol의 참조 SDK입니다 — 에이전트 AI의 연결 조직입니다. 자동화 가능(UI 없음, 사용자 확인 없음)하기 때문에 합법적인 프로바이더의 OAuth 자격 증명을 보유한 상태에서 신뢰할 수 없거나 손상된 MCP 서버에 연결하는 모든 에이전트는 조용히 장기 토큰을 넘겨주어 에이전트 스택 전반에 걸친 계정/API 탈취를 가능하게 합니다. 신뢰할 수 있는 발급자 바인딩 격차는 에코시스템의 핵심 클라이언트 라이브러리에 있는 구조적 OAuth 통합 결함입니다.
공격 경로
에이전트가 공격자 제어/손상된 MCP 서버에 연결합니다. 서버는 리소스 메타데이터에서 자체 권한 부여 서버를 광고합니다. SDK는 다음 토큰 새로 고침 시 저장된 refresh_token + client_secret을 해당 엔드포인트로 보냅니다.
영향받는 시스템
@modelcontextprotocol/sdk >= 1.12.0, < 1.31.0 (1.x); @modelcontextprotocol/client >= 2.0.0, < 2.2.0 (2.x)
완화 방안
@modelcontextprotocol/sdk 1.31.0 또는 @modelcontextprotocol/client 2.2.0으로 업그레이드합니다. 1.x에서는 OAuth 지원 클라이언트를 신뢰할 수 있는 MCP 서버에만 연결합니다(해결 방법).