6분 만에 42개 npm 패키지를 감염시킨 웜이 OpenAI 직원 2명의 기기에 도달했을 때, 그건 시작에 불과했음. 2주 후 같은 웜의 파편이 GitHub 직원의 VS Code를 뚫고, 내부 리포지토리 3,800개가 다크웹에 $50,000에 올라갔음.
그런데 진짜 이야기는 GitHub가 아님. 하나의 npm 패키지 감염이 어떻게 4개 생태계를 관통하는 연쇄 반응으로 번졌는가 — 이게 핵심 질문임.
Key Takeaways
- 감염된 VS Code 확장 하나로 GitHub 내부 리포 3,800개(Copilot, CodeQL 소스 포함) 유출
- Grafana는 토큰 수백 개를 교체했으나 딱 1개를 놓쳐 전체 소스코드 탈취
- @antv 생태계에서 22분 만에 639개 악성 버전 자동 배포 — npm에서 PyPI까지 레지스트리 횡단
웜이 지표면 위로 올라오다
GitHub 직원 한 명이 VS Code 확장 프로그램(Extension)을 설치했음. Nx Console 18.95.0 버전 — 개발자 220만 명이 사용하는 도구임. 이 확장은 11분 동안만 악성 버전이 배포됐지만, 그 11분이면 충분했음 (The Hacker News).
498KB 난독화 페이로드가 숨어 있었음. 1Password 금고, npm 토큰, GitHub 토큰, AWS 키까지 훑었고, 러시아/CIS 시간대 시스템은 건너뛰었음. TanStack 캠페인과 동일한 지문임 (The Hacker News).
이 단일 기기에서 GitHub 내부 리포지토리 약 3,800개가 유출됨. 고객 리포가 아님. GitHub 자체 코드임 — Actions, Copilot 내부, CodeQL 도구, Codespaces 인프라, Dependabot 로직 (TechCrunch).
TeamPCP는 다크웹 포럼에 데이터를 올리면서 이렇게 적었음. “GitHub를 갈취할 생각 없음. 구매자 1명이면 데이터 파기함.” 가격은 $50,000(약 7,000만 원) (VentureBeat).
쉽게 말하면 이런 것임. 현관문에 최첨단 잠금장치를 달아도, 화분 밑에 놔둔 열쇠 하나면 전부 무용지물임. VS Code 확장이 바로 그 화분이었던 것임.
모래 속에서 도시까지: 연쇄 감염 지도
시리즈 1편에서 Mini Shai-Hulud를 사막 밑의 웜으로 묘사했음. npm이라는 사막 안에서 보이지 않게 움직이는 존재였음. 2편의 이야기는 다름. 웜이 지표면 위로 올라왔음. 단단해야 할 지반을 흔들고 있음.

3주 안에 4개 생태계를 횡단한 연쇄 반응의 경로임.
| 단계 | 생태계 | 벡터 | 피해 규모 |
|---|---|---|---|
| 1단계 | npm | TanStack pull_request_target 익스플로잇 | 42개 패키지, 84개 악성 버전 |
| 2단계 | VS Code 마켓플레이스 | Nx Console 18.95.0 (11분 노출) | 220만 설치, GitHub 직원 기기 감염 |
| 3단계 | GitHub 내부 인프라 | 탈취된 직원 자격증명 | 3,800+ 내부 리포, $50K 다크웹 리스팅 |
| 4a단계 | npm (@antv) | 토큰 기반 자기복제 웜 | 323개 패키지, 639개 버전/22분 |
| 4b단계 | GitHub Actions | 태그 하이재킹 (actions-cool) | 모든 기존 태그 → 악성 커밋 리디렉션 |
| 5단계 | PyPI | durabletask (MS SDK) 감염 | 월 41.7만 다운로드, AWS/K8s 횡적 이동 |
핵심은 각 단계가 별개의 공격이 아니라는 것임. 이전 단계에서 탈취한 자격증명(Credential)이 다음 문을 여는 열쇠가 됨. 팔로알토 Unit42는 이를 “신뢰된 CI/CD 인프라를 통한 ID 기반 전파”라고 명명했음 (Unit42).
Grafana의 교훈: 수백 개 중 놓친 토큰 1개
Grafana Labs는 거의 완벽하게 대응했음. 5월 11일 TanStack 공급망 공격이 터지자 보안팀이 조직 전체의 워크플로우 토큰을 교체했음. 수백 개의 토큰을 폐기하고 새로 발급했음 (Grafana).
문제는 1개를 놓쳤다는 것임.
그 토큰 하나로 공격자는 Grafana의 공개/비공개 소스코드 저장소와 내부 운영 문서에 접근했음. 5월 15일 CoinbaseCartel이라는 그룹이 다크웹에 Grafana 데이터를 리스팅했고, 5월 16일 랜섬 요구가 들어왔음. Grafana는 지불을 거부했음 (BleepingComputer).
고객 프로덕션 시스템은 영향 없음이 확인됨. 그런데 교훈은 분명함. 공급망 공격에서 토큰 99.9% 교체는 기능적으로 0% 교체와 같음. 남은 0.1%가 정확히 맞는 토큰이면 끝나는 것임.
자기복제 기계: @antv와 22분
Mini Shai-Hulud에서 가장 불안한 부분은 피해 규모가 아님. 속도임.

웜이 메인테이너의 npm 토큰을 탈취하면 사람의 지시를 기다리지 않았음. 자동화된 시퀀스가 돌아감 — 토큰 유효성 검증 → 해당 메인테이너 소유 패키지 전수 조사 → 타르볼(Tarball) 다운로드 → 악성 페이로드 주입 → preinstall 훅 추가 → 버전 범프 → 재배포. 전부 자동. 전부 수 분 내 완료 (Socket, StepSecurity).
@antv 생태계에서 이 기계는 323개 패키지를 감염시키고 639개 악성 버전을 22분 만에 배포했음. 20종 이상의 자격증명을 수집 — AWS, GCP, Azure, GitHub, npm, SSH 키, Kubernetes 설정, HashiCorp Vault 토큰, Stripe 키, 데이터베이스 비밀번호까지 (The Hacker News).
보안 연구자들은 2,500개 이상의 GitHub 리포지토리에서 “Shai-Hulud: Here We Go Again” 마커를 발견했음. 웜이 확산하면서 남긴 흔적임.
GitHub Actions: 태그 하이재킹
npm 웜이 패키지 레지스트리를 통해 확산되는 동안, 병렬 공격 벡터가 GitHub Actions를 노렸음. 수백만 개발자가 코드 빌드, 테스트, 배포에 신뢰하는 CI/CD 인프라임.
actions-cool/issues-helper와 maintain-one-comment(15개 태그)의 모든 기존 태그가 조용히 위조 커밋으로 리디렉션됐음. CI/CD 파이프라인이 태그로 이 Actions를 참조하면 — 대부분이 그러함 — 악성 코드를 실행하게 됨 (The Hacker News).
페이로드는 Bun 런타임을 다운로드한 뒤 Runner.Worker 프로세스 메모리에서 자격증명을 추출했음. 유출 도메인 t.m-kosche[.]com은 @antv 캠페인과 동일 — 같은 웜, 같은 인프라임 (StepSecurity).
안전한 워크플로우는 딱 하나 유형뿐이었음. 변경 가능한 태그가 아닌 전체 SHA 커밋 해시에 고정(Pin)한 것만 무사했음.
durabletask: 웜이 레지스트리를 횡단하다
연쇄 반응의 마지막 알려진 단계는 npm에서 PyPI로의 완전한 레지스트리 점프임. Microsoft 공식 Python SDK durabletask — 월 41만 7,000회 다운로드되는 패키지 — 의 악성 버전 3개(1.4.1~1.4.3)가 35분 내에 PyPI에 업로드됐음 (Wiz).

28KB 페이로드는 import 시점에 자동 실행됐음. 에러 메시지 없음. 성능 저하 없음. 조용히 90개 이상 개발자 도구 설정에서 자격증명을 수집했음.
AWS와 Kubernetes로의 횡적 이동
durabletask가 npm 웜과 달랐던 점은 횡적 이동 능력임. AWS Systems Manager(SSM) SendCommand로 EC2 인스턴스 최대 5대에 전파했고, kubectl exec으로 Kubernetes 컨테이너 안까지 침투했음. 자체 확산 네트워크를 구축한 것임 (Wiz, StepSecurity).
백업 플랜도 있었음. FIRESCALE이라는 메커니즘으로 GitHub 공개 커밋 메시지에서 백업 C2(명령제어) 서버 주소를 추출했음. 1차 인프라가 차단돼도 공개된 데이터에서 통신 채널을 복원할 수 있는 구조임.
듄의 샤이훌루드처럼, 이 웜은 적대적 환경에서 살아남는 법을 학습한 것임.
신뢰의 무기화: 왜 기존 방어가 무력했는가
5단계 연쇄 반응의 공통점은 제로데이(Zero-day) 익스플로잇이 아님. 버퍼 오버플로우도, 미패치 서버도 아님. 신뢰(Trust)임.

개발자는 npm install을 신뢰했음. VS Code 마켓플레이스의 확장을 신뢰했음. GitHub Actions 태그를 신뢰했음. Microsoft의 PyPI 패키지를 신뢰했음. 모든 공격 벡터가 개발자가 일상 업무의 일부로 이미 부여한 신뢰 관계를 악용한 것임.
CSP 헤더, WAF 규칙, 엔드포인트 탐지가 전파를 잡지 못한 이유가 여기 있음. 악성 코드가 명시적으로 화이트리스트된 채널을 통해 도착했음. 명시적으로 부여된 권한으로 실행됐음. 웜은 침입한 게 아님. 초대받은 것임.
Sonatype 2026 보고서에 따르면 npm, PyPI, Maven 전체에서 악성 패키지 업로드가 전년 대비 156% 증가했음. TeamPCP가 BreachForums에 Shai-Hulud 소스코드를 공개한 이후, 독자적 C2 인프라를 갖춘 카피캣 패키지 4개가 수일 내 등장했음 (SC Media).
현대 의존성 트리 규모에서 수동 검증은 구조적으로 불가능한 것임.
한국 직장인에게 던지는 질문
한국의 소프트웨어 공급망 보안에는 특유의 취약점이 있음. SBOM(소프트웨어 자재명세서, Software Bill of Materials) 도입률이 낮다는 것임. KISA가 도입을 촉구하고 있지만 대다수 기업이 미도입 상태임 (보안뉴스).
쉽게 말하면 SBOM은 식품 원재료 표시와 같은 것임. 우리 소프트웨어에 어떤 오픈소스 라이브러리가 들어가 있는지 전수 목록을 만드는 작업임. 이게 없으면 어디서 문제가 터졌는지 추적 자체가 불가능함.
ReversingLabs 데이터에 따르면 악성 npm 패키지 업로드가 2년 사이 100배 증가했음. JavaScript와 Python 오픈소스 생태계에 의존하는 한국 기업 — 사실상 전부 — 이 GitHub, Grafana와 동일한 노출 상태에 있음 (CIO Korea).
개발자 보안 위생 체크리스트
직장인 개발자로서 개인 공격 표면(Attack Surface)은 현실임.
VS Code 확장 프로그램을 점검해야 함. 권한을 확인하고, 90일 이상 사용하지 않은 확장은 제거해야 함. Nx Console 악성 버전은 11분 동안만 살아 있었음. 업데이트 주기가 공격 주기보다 빠른지가 관건임.
npm audit과 pip audit을 분기별이 아니라 일상 워크플로우의 일부로 실행해야 함. 잠금 파일(Lockfile) 무결성 점검을 도입하고, CI/CD 파이프라인의 GitHub Actions 참조를 태그에서 SHA 해시로 전환하는 것을 이번 주 안에 시작할 시점임.
자주 묻는 질문 (FAQ)
Q. GitHub 공급망 침해란 무엇이고 어떻게 발생했나요? A. 2026년 5월, TeamPCP라는 위협 행위자 그룹이 악성 VS Code 확장(Nx Console 18.95.0)을 통해 GitHub 직원의 기기를 감염시켰습니다. 이를 통해 GitHub Actions, Copilot, CodeQL 소스코드를 포함한 약 3,800개의 내부 리포지토리에 접근했으며, 해당 데이터는 다크웹에 $50,000에 판매 시도되었습니다.

Q. Mini Shai-Hulud 웜은 어떻게 패키지 매니저를 통해 자기복제하나요? A. 웜은 감염된 환경에서 npm 토큰을 탈취한 뒤 자동화된 체인을 실행합니다. 토큰 유효성 검증, 소유 패키지 열거, 타르볼 다운로드, 악성 페이로드 주입, preinstall 훅 추가, 버전 범프, 재배포 순서입니다. @antv 생태계에서는 이 과정으로 22분 만에 323개 패키지가 감염되었습니다.
Q. 개발자가 이런 공급망 공격에 대비하려면 어떻게 해야 하나요? A. 핵심 방어책은 다섯 가지입니다. GitHub Actions를 변경 가능한 태그가 아닌 전체 SHA 해시에 고정하기, SBOM(소프트웨어 자재명세서) 도입, 토큰 로테이션 자동화, npm audit과 pip audit 정기 실행, 그리고 런타임 행동 모니터링 도입입니다.
Q. GitHub 고객 리포지토리도 영향을 받았나요?
A. GitHub는 이번 침해가 내부 리포지토리에 한정되었다고 확인했습니다. 고객 리포지토리, 엔터프라이즈 계정, 조직에 대한 영향 증거는 발견되지 않았습니다. 다만 유출된 내부 코드에 Actions, Copilot, Dependabot 인프라 로직이 포함되어 있었습니다.
References
- “GitHub Breached — Employee Device Hack Led to Exfiltration of 3,800+ Internal Repos”, The Hacker News, 2026-05-20 (link)
- “Grafana GitHub Breach Exposes Source Code via TanStack npm Attack”, The Hacker News, 2026-05-20 (link)
- “Compromised Nx Console 18.95.0 Targeted VS Code Developers with Credential Stealer”, The Hacker News, 2026-05-19 (link)
- “Popular GitHub Action Tags Redirected to Imposter Commit to Steal CI/CD Credentials”, The Hacker News, 2026-05-19 (link)
- “Mini Shai-Hulud Pushes Malicious AntV npm Packages via Compromised Maintainer Account”, The Hacker News, 2026-05-19 (link)
- “GitHub confirms 3,800 internal repos stolen through poisoned VS Code extension”, VentureBeat, 2026-05-20 (link)
- “GitHub says hackers stole data from thousands of internal repositories”, TechCrunch, 2026-05-20 (link)
- “Grafana Labs security update on TanStack npm supply chain ransomware incident”, Grafana, 2026-05-16 (link)
- “Grafana breach caused by missed token rotation”, BleepingComputer, 2026-05-20 (link)
- “durabletask: TeamPCP’s Latest PyPi Compromise”, Wiz, 2026-05-20 (link)
- “Microsoft’s durabletask PyPI Package Compromised”, StepSecurity, 2026-05-20 (link)
- “Trusted by default: The npm attack pattern security teams miss”, SC Media, 2026-05-20 (link)
- “Weaponizing the Protectors: TeamPCP’s Multi-Stage Supply Chain Attack”, Unit42, 2026-05-20 (link)
- “Postmortem: TanStack npm supply-chain compromise”, TanStack Blog, 2026-05-16 (link)
- “2026 공급망 보안 솔루션 리포트”, 보안뉴스, 2026-05-15 (link)
- “악성 npm 패키지 2년 사이 100배 증가”, CIO Korea, 2026-05-12 (link)
한줄 코멘트. npm 패키지 하나의 감염 이야기가 아님. 신뢰 자체가 공격 벡터가 된 이야기임 — 오픈소스 개발을 가능하게 하는 바로 그 신뢰가 무기화되고 있음. 웜이 3주 만에 npm, VS Code 마켓플레이스, GitHub 내부 인프라, GitHub Actions, PyPI를 관통했다면, 방어선은 방화벽이 아님. 모든 npm install과 모든 확장 업데이트가 방어선인 것임.
직장인 시사점. 개발자, DevOps 엔지니어, IT 관리자라면 이번 주에 VS Code 확장을 감사하고, GitHub Actions를 SHA 해시로 고정하고, 의존성 감사를 일상화할 시점임. 모범 사례가 아님 — GitHub, Grafana, Microsoft조차 웜이 도착했을 때 서 있지 못했던 최소한의 바닥임.
면책 조항: 이 글은 정보 제공 및 교육 목적으로 작성된 것이며, 투자, 법률 또는 사이버보안 컨설팅 조언이 아님. 구체적인 보안 평가는 전문가에게 문의해야 함.
