국가 지원 해커들이 이제 당신의 AI 에이전트 npm 패키지를 공격하고 있습니다
요약
국가 지원 해커 조직인 Sapphire Sleet가 AI 에이전트 개발용 npm 패키지인 Mastra를 타겟으로 한 공급망 공격을 수행했습니다. 공격자는 postinstall 스크립트를 통해 Anthropic, OpenAI API 키와 GitHub 토큰 등 개발자의 핵심 자격 증명을 탈취했습니다.
핵심 포인트
- Mastra npm 패키지 140여 개가 침해되어 API 키 및 클라우드 자격 증명 유출
- 공격자는 Anthropic, OpenAI, Gemini 등 AI 서비스 API 키를 집중 타겟팅
- Claude Code 설정 파일 및 MCP 서버 OAuth 토큰까지 탈취 범위에 포함
- 해당 기간 내 npm install을 실행한 개발자는 즉시 자격 증명 교체 필요
이 기사는 원래 LucidShark Blog에 게시되었습니다.
이것은 탈취된 패키지 매니저(package manager) 자격 증명을 통해 빠른 이익을 취하려는 기회주의적인 범죄자에 관한 이야기가 아닙니다. 이것은 현대 소프트웨어 개발에서 가장 가치 있는 타겟이 AI 코딩 도구를 구축하는 개발자라는 점을 고려하여 의도적이고 전략적인 결정을 내린 국가 지원 해커(nation-state actor)에 관한 이야기입니다.
Mastra 공격의 범위: Microsoft Threat Intelligence에 의해 Sapphire Sleet(BlueNoroff로도 추적됨)의 소행으로 밝혀진 조직적인 캠페인을 통해 @mastra 및 mastra npm 스코프 전반에 걸쳐 140개 이상의 패키지가 침해되었습니다. 영향을 받은 버전에는 개발자 기기에서 AI API 키, GitHub 토큰 및 클라우드 서비스 자격 증명을 유출하도록 설계된 postinstall 페이로드(payload)가 포함되어 있었습니다.
Mastra 공격에서 일어난 일
이 공격은 6월 1일에 발생한 Miasma Red Hat npm 캠페인과 동일한 광범위한 패턴을 따랐으나, 타겟팅 측면에서 결정적인 차이가 있었습니다. Miasma가 Red Hat 인프라 팀을 노렸다면, Sapphire Sleet는 구체적으로 AI 도구 제작자들을 노렸습니다.
공격은 침해된 패키지 버전에 postinstall 스크립트를 주입했습니다. 개발자가 npm install을 실행하면, 이 훅(hook)은 가시적인 출력이 나오기 전에 조용히 실행되어 로컬 환경을 다음과 같이 스캔합니다:
- AI 제공업체 API 키: Anthropic, OpenAI, Gemini, Mistral
- GitHub 개인 액세스 토큰(personal access tokens) 및 세분화된 토큰(fine-grained tokens)
- AWS, GCP 및 Azure 자격 증명 파일
- Claude Code 설정 파일 (
~/.claude.json및~/.claude/) - Claude Code의 설정에 저장된 MCP 서버 OAuth 토큰
데이터 유출은 공격자가 제어하는 인프라로 HTTPS 비콘(beacon)을 사용했습니다. 전체 실행은 대부분의 개발자가 터미널 출력에서 무언가 잘못되었음을 알아차리기도 전인 2초 미만의 시간에 완료되었습니다.
타임라인 (Timeline): 악성 버전은 2026년 6월 14일에서 6월 17일 사이에 게시되었습니다. Microsoft Threat Intelligence는 6월 17일에 귀속 보고서 (attribution report)를 발표했습니다. 영향을 받은 패키지들은 공개 후 몇 시간 이내에 npm에서 취소되었습니다. 6월 14일에서 6월 17일 사이에 Mastra 패키지에 대해 npm install을 실행한 개발자는 자격 증명 (credential)이 침해되었다고 가정하고 즉시 교체해야 합니다.
국가 지원 해커들이 AI 개발 도구를 타겟팅하는 이유
개발자 머신이 조직 내 다른 어떤 타겟과 비교했을 때 무엇을 보유하고 있는지를 매핑해 보면 그 전략적 논리는 명확합니다.
AI 코딩 인프라를 구축하는 개발자는 일반적인 세션 동안 다음과 같은 것들을 보유합니다:
- 수천 달러의 사용량을 생성하거나 공유 팀 워크스페이스에 접근할 수 있으며, 종종 지출 한도가 설정되지 않은 Anthropic API 키
- 작업 중인 저장소 (repositories)에 대한 쓰기 권한을 가진 GitHub PAT (Personal Access Token)
- 에이전트가 배포되는 환경을 위한 클라우드 자격 증명 (AWS, GCP, Azure)
- Jira, Confluence, Linear, Slack에 대한 접근 권한을 부여하는 MCP OAuth 토큰
- 내부 서비스, 프라이빗 엔드포인트 (private endpoints), 설정 파일에 포함된 임베디드 비밀값 (embedded secrets) 등을 포함하는 코드베이스 자체에 대한 로컬 접근 권한
이는 대부분의 기업용 워크스테이션에 존재하는 것보다 더 가치가 높은 자격 증명 번들 (credential bundle)입니다. 또한 개발자가 끊임없이 새로운 패키지를 설치하고, 새로운 MCP 서버를 구동하며, 새로운 도구를 통합하는 머신에 존재합니다. 공격 표면 (attack surface)은 정적이지 않습니다. 개발자가 AI 워크플로우에 새로운 의존성 (dependency)을 추가할 때마다 확장됩니다.
Sapphire Sleet는 이전에 금융 서비스 타겟, 암호화폐 거래소, 방위 산업체를 중심으로 활동했습니다. AI 개발 도구로의 전환은 국가 지원 해커들이 자격 증명 환경을 파악했으며, AI 코딩 도구 개발자를 고수익 타겟 카테고리로 식별했다는 신호입니다.
자율 에이전트 문제 (The Autonomous Agent Problem)
전통적인 공급망 방어 체계는 인간이 루프 안에 있는 것(human in the loop)을 전제로 합니다. 패키지를 의심하는 개발자가 이를 실행하기 전에 소스 코드를 검토할 수 있고, 보안 팀은 새로운 패키지가 프로젝트에 도입되기 전에 필수 승인 단계를 추가할 수 있습니다.
AI 코딩 에이전트(AI coding agents)는 이러한 전제를 완전히 깨뜨립니다.
Claude Code가 에이전트 워크플로(agentic workflow)의 일부로 의존성(dependency)을 설치하기로 결정하면, 설치는 자동으로 이루어집니다. 에이전트는 작업을 읽고 @mastra/core가 필요하다고 판단한 뒤, npm install @mastra/core를 실행하고 진행합니다. 어떤 인간도 패키지를 검토하지 않습니다. 어떤 인간도 설치를 승인하지 않습니다. postinstall 훅(hook)은 인간이 어떠한 출력 결과도 확인하기도 전에, 머신에 있는 모든 자격 증명(credential) 파일에 대한 읽기 권한을 포함하여 개발자의 전체 파일 시스템 권한을 가지고 실행됩니다.
# 자율적인 Claude Code 설치의 모습은 다음과 같습니다
# 에이전트가 패키지를 선택하고 설치하며, 인간의 검토가 이루어지기 전에
# postinstall이 실행됩니다
...
개발자는 성공적인 설치를 확인합니다. 하지만 페이로드(payload)는 이미 실행되었습니다. 자격 증명은 이미 유출되었습니다.
표준 방어 체계가 실패한 이유
개발자들이 일반적으로 공급망 보호를 위해 의존하는 네 가지 메커니즘이 이번 공격 앞에서 모두 실패했습니다:
npm audit: 악성 패키지는 설치 시점에 기존의 CVE(Common Vulnerabilities and Exposures)가 없었습니다. npm audit은 취약점이 발견되고 보고된 후에야 데이터가 채워지는 npm 권고(advisory) 데이터베이스를 기준으로 확인합니다. 이는 본질적으로 사후 대응적(retrospective)입니다. 패키지는 취약점이 발견되기 전까지는 깨끗한 상태로 간주됩니다.
SLSA provenance: Mastra 공격은 Miasma 캠페인과 동일한 기술을 사용하여 출처 증명(provenance attestations)을 위조했습니다. 공격자들은 침해된 CI/CD 파이프라인으로부터 합법적인 GitHub OIDC 토큰을 획득하였고, 이를 사용하여 유효하고 검증 가능한 SLSA 출처 증명을 가진 패키지를 게시했습니다. 해당 패키지는 npm audit signatures를 통과했으며 합법적인 공급망을 가진 것처럼 보였습니다.
Dependabot / Renovate: 이 도구들은 알려진 취약한 버전(known-vulnerable versions)에 대해 경고를 보냅니다. 하지만 패키지의 동작을 검사하거나, 새로 추가된 설치 스크립트(install scripts)가 포함된 패키지를 식별하지는 못합니다.
코드 리뷰 (Code review): 악성 코드는 애플리케이션 소스 코드가 아닌, 간접 의존성(transitive dependency)의 postinstall 스크립트에 포함되어 있었습니다. 대부분의 팀은 PR(Pull Request) 프로세스의 일부로 간접 의존성의 설치 스크립트를 검토하지 않습니다.
핵심 문제 (The core problem): 모든 표준 공급망 방어 체계는 사후 대응적(reactive)입니다. 이는 취약점이 알려지고, 문서화되어, 피드(feed)에 추가될 때까지 기다릴 수 있다고 가정합니다. 악성 패키지를 게시한 후 발견된 지 불과 몇 시간 만에 이를 삭제해 버리는 국가 지원 해커(nation-state actor)를 상대로는, "깨끗한 상태"와 "알려진 악성 상태" 사이의 간극이 곧 전체 공격 시간(attack window)이 됩니다.
npm audit이 놓치는 것을 사전 설치 스캐닝(Pre-Install Scanning)이 잡아내는 방법
제로 데이(zero-day) 공급망 공격에 효과적인 유일한 방어 유형은 설치 스크립트가 실행되기 "전"에 수행되는 동작 및 평판 분석(behavioral and reputational analysis)입니다. 이를 위해서는 패키지의 권고(advisory) 상태가 아니라, 패키지 자체의 속성을 확인해야 합니다.
페이로드(payload)가 실행되기 전 Mastra 공격을 식별했을 신호들은 다음과 같습니다:
-
이전에 깨끗했던 패키지에 새로 추가된 postinstall 스크립트: 악성 버전들은 이전 버전에는 존재하지 않았던
postinstall필드를 추가했습니다. 버전 간 패키지 매니페스트(package manifest)의 차이(diff)를 확인하는 것은 매우 높은 신호 강도를 가진 지표입니다. -
게시 타임스탬프 이상 (Publish timestamp anomaly): 관련 패키지의 여러 버전이 짧은 시간(몇 시간) 내에 게시되는 것은 탈취된 게시 파이프라인(compromised publishing pipeline)에서 나타나는 일관된 패턴입니다.
-
스크립트 내용 분석 (Script content analysis):
postinstall스크립트에 base64로 인코딩된 내용과 네트워크 요청이 포함되어 있었습니다. 이 두 가지 모두 설치 훅(install hook) 내에서 악의적인 의도를 나타내는 강력한 지표입니다. -
패키지 평판 점수 (Package reputation score):
@mastra스코프 내의 보조 패키지 중 다운로드 수가 적고 이전에는 설치 스크립트가 없다가 갑자기postinstall훅을 갖게 된 것은 비정상적인 상황입니다.
현재 프로젝트에서 라이프사이클 스크립트 (lifecycle scripts)가 포함된 패키지를 식별하기 위해 지금 바로 실행할 수 있는 간단한 로컬 감사 (audit) 방법은 다음과 같습니다:
python3 -c "
import json, sys
...
이 목록에 있는 패키지 중 명시적으로 인지하거나 신뢰하지 않는 패키지는 다음 npm install을 실행하기 전에 감사할 가치가 있습니다.
지금 즉시 해야 할 일
만약 2026년 6월 14일에서 6월 17일 사이에 @mastra 스코프의 패키지를 설치했다면:
- 즉시
console.anthropic.com에서 Anthropic API 키를 교체 (Rotate) 하세요. - 모든 GitHub 개인 액세스 토큰 (personal access tokens)을 취소 (Revoke) 하고 재발급 하세요.
- 영향을 받은 머신에서 사용된 AWS, GCP 또는 Azure 자격 증명 (credentials)을 교체 하세요.
- 연결된 각 서비스 (Jira, GitHub, Confluence, Slack)의 MCP OAuth 토큰을 취소하고, 필요한 최소한의 권한 (scopes)으로만 재발급 하세요.
~/.claude.json에 저장된 자격 증명을 확인하고 그곳에서 발견된 모든 항목을 교체 하세요.
지속적인 보호를 위해, pre-commit 또는 pre-install 워크플로우에 postinstall 스크립트 감사 기능을 추가하세요. AI 지원 프로젝트에서 npm install을 실행하기 전에, 의존성 트리 (dependency tree) 내의 어떤 패키지가 마지막으로 확인된 깨끗한 락파일 (lockfile)과 비교하여 라이프사이클 스크립트를 추가하거나 수정했는지 확인하십시오.
LucidShark는 로컬 SCA 파이프라인의 일부로 의존성 라이프사이클 스크립트 스캐닝을 포함합니다. 프로젝트에서 lucidshark analyze를 실행하면, 복잡도 (complexity), 커버리지 (coverage), 중복성 (duplication) 지표와 함께, 검증되지 않았거나 최근에 수정된 게시자(publisher)의 postinstall 훅을 가진 패키지를 실행되기 전에 식별합니다. 이 작업은 데이터가 환경을 벗어나지 않고 전적으로 사용자의 머신에서 실행되며, MCP를 통해 Claude Code와 통합되어 에이전트가 문제가 있는 패키지를 설치하기 전에 구조화된 피드백을 받을 수 있습니다. lucidshark.com에서 시작하거나 npm install -g lucidshark로 설치하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기