당신의 MCP 서버가 SSH 키를 읽을 수 있습니다. Anthropic이 방금 이를 해결했습니다.
요약
Anthropic이 MCP 서버의 보안 취약점을 해결하기 위해 오픈 소스 샌드박싱 레이어인 'sandbox-runtime'을 공개했습니다. 이를 통해 Docker 없이도 OS 수준에서 MCP 서버의 파일 시스템 및 네트워크 접근 권한을 강력하게 격리할 수 있습니다.
핵심 포인트
- MCP 서버의 과도한 시스템 접근 권한(SSH 키, .env 등) 문제 해결
- macOS(Seatbelt) 및 Linux(bubblewrap) 네이티브 기술 활용
- 파일 시스템 및 네트워크 트래픽에 대한 정밀한 제어 가능
- 최소 권한 원칙에 기반한 '거부 후 허용' 보안 모델 적용
로컬에서 실행되는 모든 MCP (Model Context Protocol) 서버는 사용자의 전체 파일 시스템 및 네트워크 권한을 가지고 실행됩니다. 이는 GitHub MCP 서버, Slack MCP 서버, 그리고 지난주에 npm을 통해 설치한 서드파티 도구 모두가 기본적으로 사용자의 SSH 키, .env 파일, 그리고 자격 증명 저장소(credential stores)를 읽을 수 있음을 의미합니다.
Anthropic은 방금 해결책을 오픈 소스로 공개했습니다: Claude Code를 위해 구축한 샌드박싱(sandboxing) 레이어인 sandbox-runtime입니다. 한 줄의 래핑(wrap)만으로 Docker 없이 OS 수준의 강제 적용이 가능합니다.
실제로 무엇이 바뀌었나
srt (Sandbox Runtime CLI)는 네이티브 OS 프리미티브(primitives)를 사용하여 모든 프로세스에 파일 시스템 및 네트워크 제한을 강제합니다:
- macOS: 동적으로 생성된 Seatbelt 프로필과 함께
sandbox-exec를 사용합니다. - Linux: 컨테이너화(containerization) 및 네트워크 네임스페이스 격리를 위해
bubblewrap을 사용합니다. - 네트워크 필터링 (Network filtering): HTTP/HTTPS 트래픽은 HTTP 프록시를 통해 라우팅되며, 기타 TCP 트래픽은 SOCKS5를 통해 전달됩니다. 두 방식 모두 사용자의 도메인 허용 목록(allowlists)을 강제합니다.
설치 방법:
npm install -g @anthropic-ai/sandbox-runtime
.mcp.json에서 MCP 서버를 래핑하세요 — command를 npx에서 srt로 변경하고, 나머지는 args로 이동합니다:
{
"mcpServers": {
"filesystem": {
...
그 다음 ~/.srt-settings.json에서 프로세스가 실제로 접근할 수 있는 것을 구성하세요:
{
"filesystem": {
"denyRead": ["~/.ssh"],
...
결과적으로: MCP 서버는 프로젝트 디렉토리 내에서 작업하고 필요한 도메인과 통신할 수 있지만, 그 외의 것에는 접근할 수 없습니다.
이것이 중요한 이유
위협 모델 (threat model)은 실재합니다. 보안이 뚫린 코드가 실행되는 MCP 서버, 또는 단순히 필요 이상의 주변 접근 권한(ambient access)을 가진 서버는 사용자의 SSH 키를 유출하거나,
.env파일을 읽거나, 임의의 호스트로 데이터를 전송(phone home)할 수 있습니다. 이는 이론적인 문제가 아닙니다. 이는 신뢰할 수 없는 모든 npm 패키지에 존재하는 공급망 위험(supply-chain risk)과 동일한 범주의 위험이지만, MCP 서버는 일반적으로 광범위한 시스템 접근 권한을 가진 장시간 실행되는 프로세스라는 점에서 더욱 주의가 필요합니다.
srt는 기본 보안 설정 (secure-by-default) 방식으로 설계되었습니다. 프로세스는 최소한의 권한으로 시작하며, 필요한 부분에 대해서만 명시적으로 구멍을 뚫어 권한을 부여합니다. 이것이 올바른 사고 모델입니다. 즉, "신뢰한 뒤 제한하는 것"이 아니라 "거부한 뒤 허용하는 것"입니다.
이중 격리 모델 (The dual isolation model)
두 격리 계층은 서로 다른 탈출 경로를 방어하기 위해 모두 필요합니다.
- 파일 시스템 격리 (filesystem isolation)가 없는 경우: 침해된 프로세스가 읽을 수 있는 자격 증명 (credentials)을 유출합니다.
- 네트워크 격리 (network isolation)가 없는 경우: 침해된 프로세스가 해당 자격 증명을 외부로 전송하거나, 직접 연결을 통해 제한 사항을 우회합니다.
프록시 기반의 네트워크 모델은 영리합니다. Linux에서는 샌드박스 처리된 프로세스의 네트워크 네임스페이스 (network namespace)를 완전히 제거하여, 모든 트래픽이 반드시 호스트의 프록시를 거쳐야만 합니다. macOS에서는 Seatbelt 프로필을 통해 프록시가 대기 중인 특정 localhost 포트로의 연결만 제한합니다. 프로세스 내부에서 우회할 수 있는 훅 (hook)은 존재하지 않습니다.
조치 사항
- 로컬에서 MCP 서버를 실행 중인가요? 지금 바로 설정해 볼 가치가 있습니다.
denyRead: ["~/.ssh"]와 비어 있는allowedDomains목록으로 시작하세요. 무엇이 작동하지 않는지 확인한 후, 꼭 필요한 것만 다시 추가하십시오. - MCP 서버를 구축 중인가요? 서버와 함께 권장되는
srt설정을 배포하십시오. 이는 신뢰의 신호가 되며, 귀하의 서버가 실제로 무엇을 필요로 하는지 문서화해 줍니다. - AI 에이전트 플랫폼을 구축 중인가요?
SandboxManager를 라이브러리로 사용할 수 있습니다. 생성된 프로세스를 프로그래밍 방식으로 래핑 (wrap)할 수 있습니다.
이 기능은 베타 연구 프리뷰 (beta research preview)로 태그되어 있으므로, 설정 형식이 변경될 수 있습니다. 하지만 핵심 원시 요소 (core primitive)는 견고하며, 소스 코드가 공개되어 있어 감사가 가능합니다.
출처: anthropic-experimental/sandbox-runtime · Anthropic Claude Code Sandboxing Docs
✏️ KewBot (AI)가 초안을 작성하고, Drew가 편집 및 승인했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기