모든 MCP 서버를 실행해 보았습니다. 인기 있는 20개 서버가 실제로 어떤 행동을 했는지 공개합니다.
요약
본 글은 AI 플랫폼의 MCP 서버가 실제로 선언된 대로 행동하는지 검증하기 위해 [AgentAvow]라는 샌드박스 시스템을 구축했습니다. 이 시스템은 가상 환경에서 서버를 실행하고, 모든 도구 호출과 외부 통신을 관찰하여 신뢰 점수를 산정합니다. 테스트 결과, 많은 인기 서버들이 실제 API 키나 AWS 메타데이터 조회 등 보안 취약점을 노출하는 행동을 보였습니다.
핵심 포인트
- MCP 서버의 실제 동작 검증 시스템(AgentAvow) 소개
- 샌드박스는 모든 도구 호출과 외부 통신을 관찰함
- AWS SDK 사용 시, `AWS_REGION` 같은 변수도 자격 증명 유출로 간주됨
- 메타데이터 조회는 선언되지 않은 외부 통신으로 플래그 지정됨
대형 AI 플랫폼들은 MCP 서버를 목록에 올리기 전에 동일한 방식으로 검사합니다. 즉, 도메인을 확인하고, 자체 선언된 주석(readOnlyHint, destructiveHint)을 읽으며, 정책 텍스트를 스캔하는 것입니다. 그런 다음 런타임에서 해당 도구를 포함시킵니다. 아무도 그 도구가 선언한 대로 행동하는지는 검사하지 않습니다.
그래서 저희는 AgentAvow에 이 검사를 내장했고, 이번 포스트는 이를 20개의 잘 알려진 서버에 적용했을 때 무슨 일이 벌어졌는지에 대한 내용입니다.
샌드박스가 하는 일
npm 또는 PyPI 패키지(그리고 이제 GitHub 리포 및 OpenClaw 스킬)로 게시된 모든 MCP 서버의 경우, 첫 번째 검사는 읽기 전용 루트, 권한 없음, CPU 1개, 그리고 엄격한 시간 제한이 설정된 새로운 gVisor 컨테이너에서 실행됩니다:
- 패키지를 설치하고 stdio를 통해 서버를 시작합니다.
- MCP 핸드셰이크를 완료하고 도구 목록을 작성합니다.
- 모든 도구를 해당 도구 자체의 입력 스키마(예시 및 기본값 먼저, 그 다음 URL, 경로, 이메일과 같은 형식)로부터 결정론적으로 생성된 인자 값으로 한 번씩 호출합니다. 실행은 재현 가능해야 하므로 언어 모델이 호출을 작성하지 않습니다.
- **캐나리 자격 증명(canary credentials)**을 심습니다: 코드가 읽는 모든 환경 변수 중 비밀처럼 보이는 것에는 고유한 가짜 값을 부여합니다. 실제 키가 샌드박스에 들어오는 일은 없습니다.
- DNS, TLS 서버 이름, 평문 HTTP, 그리고 기록된 모든 파일을 관찰하고, 이를 발생시킨 도구 호출에 귀속시킵니다.
- 전체 관측 결과를 서명하여(EdDSA, 점수와 동일한 공개 JWKS 사용) 누구나 오프라인에서 검증할 수 있는 날짜가 찍힌
BehavioralObservation을 만듭니다.
이 평가는 고정된 규칙의 짧은 목록입니다: 패키지 레지스트리, 도구 자체의 공급업체 또는 선언한 것이 아닌 호스트로 나가는 외부 통신(egress); readOnlyHint: true를 주장하면서 파일을 작성하는 도구; 아웃바운드 트래픽에서 나타나는 심어진 자격 증명; 도구 결과에 반향된 비밀 정보.
점수를 올리는 방법
샌드박스 결과는 공개 규칙에 따른 신뢰 점수에 반영되므로, 이 숫자는 재계산 가능하게 유지됩니다:
| 관찰된 내용 (Observed) | 영향 (Effect) |
|---|---|
| 샌드박스를 벗어난 심어진 자격 증명(planted credential), 또는 중요 행동 발견 사항 | 45로 제한됨 |
| ... | |
| The attestation records the observation's hash, the static score, and the delta, so you can check the arithmetic yourself. |
인기 있는 20개 서버가 한 일은 무엇인가요
npm과 PyPI에서 찾을 수 있는 가장 많이 사용되는 MCP 서버 20개를 실행해 보았습니다.
-
16개는 시작하여 모든 도구를 사용했습니다. 나머지는 샌드박스가 절대 제공할 수 없는 무언가를 필요로 했습니다. 즉, 실제 API 키, 데이터베이스 URL, 이미지가 부족한 프로그램, 또는 브라우저 다운로드가 허용하는 것보다 더 많은 메모리입니다. 이러한 경우는 발견 사항이 아니라
-
AWS_REGION에 카나리(canary)를 주입했습니다. AWS SDK는 이 값으로 호스트 이름을 충실하게 생성했고, 샌드박스는 결과 DNS 쿼리를 자격 증명 유출(credential exfiltration)로 읽었습니다. 이제 비밀을 나타내는 이름(names)을 가진 변수만 카나리를 받을 수 있습니다. -
AWS SDK의 메타데이터 조회 (
169.254.169.254)는 선언되지 않은 외부 통신(undeclared egress)으로 플래그 지정되었습니다. 이제 이것은 자체적인 낮은 심각도의 알림이 되었습니다: 클라우드 SDK에는 정상적이지만, 다른 어떤 것에도 유용한 정보입니다. -
**Playwright의 호출별 임시 프로필(per-call temp profiles)**은 읽기 전용 도구가 파일을 쓰는 것처럼 보였습니다. 무작위로 이름 붙여진 스크래치 디렉터리 및 캐시는 이제 제외되었지만, 이름이 지정된 파일은 여전히 계산됩니다.
깨끗한 실행이 증명할 수 없는 것들
깨끗한 샌드박스 실행이란 도구가 이러한 조건 하에서 나쁜 행동을 하지 않았다는 것을 의미합니다. 날짜를 기다리거나, 실제 자격 증명을 확인하거나, 샌드박스를 감지하는 코드는 깨끗해 보일 것입니다. 이것이 결과가 증명(proof)보다는 관찰(observation)로 표시되는 이유이며, 정적 스캔이 여전히 샌드박스 탐색 코드(sandbox-probing code)를 찾는 이유이고, 우리가 모니터링된 도구를 재검사하고 행동 변화(behavioral drift)에 대해 경고하는 이유입니다.
직접 시도해 보세요
- 패키지나 서버를 agentavow.com/check에 붙여넣으세요. 샌드박스 패널이 1분 안에 채워집니다.
- Claude 또는 ChatGPT에서 AgentAvow 커넥터에게
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기