사건 · 악성 MCP 서버
postmark-mcp 백도어: Mac에서 악성 MCP 서버가 작동하는 방식과 Kilobat이 이를 감지하지 못하는 이유
2025년 9월 AI 어시스턴트가 Postmark를 통해 이메일을 보내도록 하는 비공식 npm 패키지에 코드 한 줄이 추가되었습니다. 버전 1.0.16부터 전송한 모든 이메일에 게시자 자신의 도메인 주소로 숨은 참조가 추가되었습니다. Mac이 평소와 다른 곳에 접속하지 않았기 때문에 특히 유용한 사례입니다.
요약
- 보호: 도움이 되지 않음
Mac은 Postmark API와만 통신했습니다. 복사본은 Postmark 메일 서버가 일반 이메일로 전달했습니다.
- 에이전트 보호: 도움이 되지 않음
붙여넣기 사이트, 터널, 원시 주소 또는 새 호스트로의 대용량 업로드는 없었습니다. 이메일 API를 통한 이메일 전송이 이 도구의 본래 용도였습니다.
- 에이전트 네트워크 로그: 제한적
이 도구는 MCP 서버가 자신을 시작한 에이전트 아래에서 예상대로 api.postmarkapp.com과 통신하는 것으로 표시했을 것입니다. 추가 수신자는 암호화된 요청 안에 있습니다.
발생한 일
이를 발견한 Koi Security 연구진은 Postmark 소유주인 ActiveCampaign이 관리하는 같은 이름의 저장소 코드를 기반으로 만들어졌지만 다른 사람이 게시한 postmark-mcp라는 npm 패키지를 설명합니다. 이 패키지는 MCP 서버였습니다. Claude Desktop, Cursor 또는 Claude Code 같은 AI 어시스턴트가 도구를 호출할 수 있도록 시작하는 작은 프로그램으로, 여기서는 sendEmail와 sendEmailWithTemplate가 해당합니다.
처음 15개 버전은 설명대로 작동했습니다. 버전 1.0.16은 도구가 보낸 모든 메시지에 giftshop[.]club 도메인의 고정 주소가 담긴 Bcc 필드를 추가해 암호 재설정, 청구서 등 어시스턴트가 보낸 모든 이메일을 복사했습니다. Koi는 주간 다운로드를 약 1,500회로 집계하고 하루 수천 통의 이메일이 복사되었다고 추정했습니다. Koi가 게시자에게 연락하자 패키지는 npm에서 삭제되었지만 이미 설치된 사본에는 영향을 주지 않습니다.
Postmark는 이 패키지가 자사 것이 아니며 npm에 MCP 서버를 게시한 적이 없고 API와 서비스는 영향을 받지 않았다고 밝혔습니다. Snyk는 패키지 코드와 정상 버전 1.0.15와 이후 버전 사이의 한 줄 차이를 공개했습니다.
타임라인
- 2025년 9월 15일
postmark-mcp1.0.0이 npm에 게시됩니다(Snyk 타임라인). - 2025년 9월 15~17일
여러 릴리스가 이어집니다. 1.0.16에 숨은 참조가 추가되고 1.0.18이 마지막으로 기록된 릴리스입니다.
- 2025년 9월 말
Koi의 위험 엔진이 동작 변화를 감지하고 Koi가 조사 결과를 공개하자 패키지가 npm에서 사라집니다.
- 2025년 9월 25일
Postmark가 해당 패키지가 자사 것이 아니라고 밝히고 이메일로 보낸 자격 증명을 교체하도록 권고합니다. Snyk는 분석과 지표를 공개합니다.
네트워크에서 보인 모습
Mac에서 MCP 서버는 어시스턴트가 시작한 node 프로세스이며, 흔히 npx를 통해 시작됩니다. 이메일을 보내기 위해 정상 버전과 똑같이 Postmark 자체 Node 라이브러리를 통해 HTTPS로 api.postmarkapp.com의 Postmark API를 호출했습니다. 숨은 참조 주소는 암호화된 요청의 추가 필드 하나였으며 메시지 크기도 거의 변하지 않았습니다.
복사본은 모든 이메일과 같은 방식으로 전달되었습니다. Postmark 서버가 이를 giftshop[.]club의 메일 서버에 전달했습니다. Mac에서 새로운 곳으로 연결하지 않았고 1.0.15와 1.0.16 사이에 트래픽 패턴도 변하지 않았습니다.
침해 지표
출처에 기록된 그대로입니다. 도메인은 링크가 아닌 텍스트이며 출처가 무해화한 경우 그대로 무해화했습니다([.]). 이 인프라는 대부분 오래전에 사라졌습니다. 지표는 현재 캠페인을 차단하기보다 오래된 로그, 파일 및 계정을 확인하는 데 도움이 됩니다.
| 지표 | 유형 | 표시 위치 | 참고 |
|---|---|---|---|
postmark-mcp 1.0.16 and later | npm 패키지 | MCP 클라이언트 구성, npm 캐시 | Postmark 자체 패키지가 아닙니다. 2025년 9월 npm에서 삭제되었지만 설치된 사본은 계속 작동합니다. |
phan@giftshop[.]club | 이메일 주소 | Postmark 메시지 활동 | 고정된 Bcc 수신자입니다. Mac의 네트워크 트래픽에는 표시되지 않습니다. |
giftshop[.]club | 도메인 | 메일 로그 | Snyk는 확인하는 동안 외부로 나가는 연결에서 이를 차단하도록 권고합니다. 이 주소는 Mac의 연결이 아닌 메일을 받습니다. |
api.postmarkapp.com | 호스트(정상) | 내 Mac | 정상 버전과 마찬가지로 MCP 서버가 접속한 유일한 호스트입니다. |
Kilobat이 표시하거나 차단했을 내용
- 에이전트 네트워크 로그. 에이전트가 시작한 MCP 서버는 해당 프로세스 트리의 일부이므로 세션에는 MCP 서버인
node가 api.postmarkapp.com에 연결하고 전송한 바이트 수가 표시되었을 것입니다. 이는 이메일 도구의 정상 동작입니다. Mac의 에이전트가 Postmark를 처음 사용한 날에만 처음으로 표시되며 숨은 수신자 때문에 표시되지는 않습니다. - 보호. 차단할 것도 차단해야 할 것도 없습니다. Postmark는 정상 서비스이며 2026년 11월 1일 확인 당시 giftshop[.]club은 Kilobat 위협 목록에 없었습니다. 어차피 Mac이 해당 주소에 연결하지 않으므로 여기서는 중요하지 않습니다.
- 에이전트 가드. 적용되는 규칙이 없습니다. 업로드 차단은 어떤 에이전트도 이전에 사용한 적 없는 호스트로 10 MB를 초과해 전송할 때 적용되며 이메일 요청은 작습니다.
Kilobat이 도움이 되지 않았을 경우
- 탈취는 허용된 서비스에 대한 허용된 요청 내부에서 일어났습니다. Mac이나 네트워크에서 연결을 감시하는 어떤 도구도 암호화된 HTTPS 내부의 필드를 볼 수 없습니다.
- 복사본은 Mac이 아니라 Postmark 네트워크의 Postmark 메일 서버가 전달했습니다.
- MCP 서버는 어시스턴트가 요청한 작업과 추가 작업 하나를 수행했습니다. 어시스턴트 역시 추가 수신자를 확인할 방법이 없었습니다.
- Kilobat은 설계상 앱이 보내는 내용을 읽지 않으므로 일반 이메일과 복사된 이메일을 구분할 수 없습니다.
지금 Mac 확인하기
Claude Code가 시작하도록 설정된 MCP 서버를 나열하세요.
claude mcp list다른 어시스턴트의 MCP 설정에서 해당 패키지를 검색하세요.
grep -n "postmark-mcp" ~/Library/Application\ Support/Claude/claude_desktop_config.json ~/.cursor/mcp.json ~/.codeium/windsurf/mcp_config.json 2>/dev/nullnpm이 전역으로 설치했거나
npx용으로 캐시한 사본을 찾으세요.npm ls -g postmark-mcp; find ~/.npm/_npx -maxdepth 3 -type d -name "postmark-mcp"사용한 적이 있다면 모든 구성에서 제거하고 서버에 부여한 Postmark 서버 토큰을 교체하세요. 또한 해당 서버의 Postmark 활동에서 giftshop[.]club으로 Bcc가 전송된 메시지를 찾으세요.
이를 통해 전송된 모든 내용을 다른 사람이 읽은 것으로 간주하고 암호를 변경하며 이메일로 보낸 링크 또는 토큰을 취소하세요. 서비스의 공식 문서에서 연결하는 MCP 서버를 사용하세요.
Kilobat으로 각 MCP 서버가 접속하는 호스트를 확인하세요. 이 사례는 그렇지 않았지만 업무와 무관한 호스트에 연결하는 서버는 살펴볼 가치가 있습니다.
kilobat agent-log --all
질문
Kilobat이 이를 잡을 수 있었나요?
아닙니다. 모든 연결은 해당 도구가 수행해야 하는 연결이었습니다. 이런 공격은 코드 검토, 패키지 평판 확인 또는 이메일 서비스 자체 로그로만 찾을 수 있습니다.
MCP 서버가 다른 npm 패키지보다 더 위험한가요?
어시스턴트에 부여한 접근 권한으로 실행되며 사람이 각 호출을 확인하지 않아도 어시스턴트가 여러 번 호출합니다. Koi의 요점은 한 줄만 바뀌어도 충분했다는 것입니다.
출처
- Koi Security: 실제로 발견된 첫 악성 MCP, 이메일을 훔치는 Postmark 백도어(보관 사본)
- Postmark: 악성 “postmark-mcp” 패키지 관련 정보
- Snyk: npm의 악성 MCP 서버 postmark-mcp가 이메일 수집
- ActiveCampaign/postmark-mcp: Postmark 자체 MCP 서버 저장소
2026년 11월 1일에 확인했습니다.
에이전트와 앱이 어디에 연결하는지 확인하세요
Kilobat은 모든 연결 뒤에 있는 앱, 프로세스 및 에이전트의 이름을 표시하고 알려진 악성 호스트를 차단하며 각 에이전트 세션이 연결한 대상을 기록하는 Mac 메뉴 막대 앱입니다.
brew install seifip/kilobat/kilobat