http://127.0.0.1:port 에 떠 있는 로컬 MCP server 는 무해해 보여. 안 무해해. 명시적인 방어가 없으면 아무 브라우저 탭의 웹페이지가 네 로컬 MCP server 와 대화해서 데이터를 빼갈 수 있어. DNS rebinding 을 쓰거나, 악의적인 origin header 를 들이밀거나, 허술한 CORS 를 파고들어서.
MCP spec 은 못박아놨어. localhost 에 붙은 server 는 모든 요청의 Origin header 를 반드시 검사하고, 허용 목록에 없으면 거절해야 한다고. 그리고 그 허용 목록의 기본값은 비어 있어야 해. 이게 없으면 https://evil.example.com 페이지가 fetch('http://127.0.0.1:1234/mcp', {…}) 를 던질 수 있고, server 는 user 가 설치해둔 tool 을 고분고분 다 내줘.
DNS rebinding 은 한 수 위의 공격이야. 공격자가 도메인을 하나 등록해두고, DNS 응답이 바깥 IP (첫 페이지를 띄울 때) 와 127.0.0.1 (짧은 TTL 이 지난 뒤) 사이를 오가게 만들어. 브라우저가 캐시한 origin 은 여전히 'evil.example.com' 인데, 실제 네트워크 호출은 user 의 로컬 server 에 꽂히는 거지. Host header 까지 허용 목록으로 (예를 들어 localhost 와 127.0.0.1 만) 검사하면 막히지만, Origin 만 보고 있으면 못 막아.
로컬 server 는 127.0.0.1 에 명시적으로 붙이고, 0.0.0.0 에는 절대 붙이지 마. 모든 요청에서 Origin 과 Host 를 검사해. CORS preflight 가 아닌 경로에 Origin 이 빠져 있으면 거절하고. 대략 여섯 줄짜리 middleware 인데, 그중 뺄 수 있는 줄은 하나도 없어.