22분 만에 323개 npm 패키지가 감염됐어요. 지금 이 순간에도 AntV 생태계 패키지를 설치하는 개발자의 AWS 키가 빠져나가고 있을 수 있어요.

한 줄 요약
TeamPCP가 npm 유지관리자 계정(atool)을 탈취 → AntV 생태계 323개 패키지에 악성 코드 주입 → 설치할 때마다 클라우드 자격증명 20종 이상 자동 탈취 → 2,500개 GitHub 저장소에 이미 데이터 유출 완료
323개
감염된 고유 패키지 수
22분
공격 완료까지 걸린 시간
1,100만
주간 다운로드 수 (echarts-for-react)
20종+
탈취 대상 자격증명 유형

이게 어떻게 된 건데요?

2026년 5월 19일 오전 1시 39분(UTC), npm 생태계에서 이상한 일이 시작됐어요. 22분 동안 639개의 악성 패키지 버전이 한꺼번에 배포됐고, 그 안에는 AntV 데이터 시각화 라이브러리(@antv/g2, @antv/g6, @antv/x6, @antv/l7, @antv/s2)와 echarts-for-react, timeago.js가 모두 포함돼 있었어요.

공격자 그룹 TeamPCP는 npm 유지관리자 계정 'atool'을 탈취했어요. 이 계정은 AntV 생태계를 포함한 수백 개 패키지의 배포 권한을 갖고 있었거든요. 계정 하나가 뚫리자 도미노처럼 전체 생태계가 흔들렸어요.

가장 무섭다고 느낀 건 속도예요. 사람이 반응할 틈도 없이 22분 만에 끝났다는 거예요. 보안팀이 알아채고 조치에 들어갈 때 이미 수만 명의 개발자가 CI/CD 파이프라인에서 감염된 버전을 설치하고 있었을 수 있어요.

뭐가 문제인 건데요?

이번 공격에서 주목해야 할 건 두 가지예요. 탈취하는 자격증명의 범위Sigstore 증명 위조.

즉각 조치 필요: 아래 패키지 중 하나라도 최근에 설치했다면, 지금 바로 클라우드 자격증명을 교체해야 해요. 나중에 해도 된다는 생각은 위험해요.
패키지 주간 다운로드 감염 상태
echarts-for-react ~110만 감염 확인
@antv/g2 수십만 감염 확인
@antv/g6 수십만 감염 확인
@antv/x6 수십만 감염 확인
@antv/l7 수만 감염 확인
timeago.js ~150만 감염 확인
size-sensor 수십만 감염 확인
canvas-nest.js 수만 감염 확인

악성 페이로드(~499KB 난독화 JavaScript)는 npm installpreinstall 훅을 통해 자동 실행돼요. AWS, Google Cloud, Azure, GitHub, npm 토큰, SSH 키, Kubernetes, Vault, Stripe, 데이터베이스 연결 문자열까지 20종 이상의 자격증명을 체계적으로 긁어가요. 심지어 Docker 컨테이너 탈출까지 시도해요.

그리고 한 가지 더 — 이 공격이 특히 교활한 건 Sigstore 증명을 위조했다는 점이에요. CI/CD 환경에서는 GitHub Actions OIDC 토큰을 메모리에서 직접 추출해서 정상적인 Sigstore 서명 인증서를 발급받아요. 패키지에 초록색 '출처 인증' 배지가 붙어 있어도 안심할 수 없다는 거예요.

탈취된 데이터는 t.m-kosche[.]com:443으로 전송되고, 백업으로 Session P2P 네트워크(filev2.getsession[.]org)를 사용해요. 더 나아가 훔친 GitHub 토큰으로 2,500개 이상의 공개 저장소를 만들어 데이터를 분산 보관했어요.

핵심만 정리: 지금 당장 해야 할 것

  1. 영향 받은 패키지 확인
    프로젝트의 package.jsonpackage-lock.json에서 @antv/*, echarts-for-react, timeago.js를 검색하세요. npm ls @antv/g2 등으로 의존성 트리도 확인해요.
  2. 먼저 지속성 아티팩트를 제거하세요 — 자격증명 교체 전에
    악성 코드는.claude/settings.json 훅, VS Code 태스크, systemd 데몬으로 지속성을 심어요. 자격증명을 먼저 교체하면 데몬이 새 자격증명을 또 탈취할 수 있어요. 제거 순서가 중요해요.
  3. 자격증명 즉시 교체
    AWS 키, GCP 서비스 계정, Azure 자격증명, GitHub PAT, npm 토큰, SSH 키를 모두 교체하세요. "혹시 모르니까"가 아니라 "이미 탈취됐을 가능성이 높으니까"예요.
  4. GitHub 저장소 감사
    "niagA oG eW ereH :duluH-iahS" 문자열(Shai-Hulud: Here We Go Again의 역순)을 GitHub 검색으로 찾아보세요. 공격자가 만든 데이터 덤프 저장소를 확인할 수 있어요.
  5. npm 계정 2FA 설정
    GitHub가 61,274개 npm 액세스 토큰을 무효화했어요. 새로 발급받고 반드시 2FA를 활성화하세요. 이번 공격의 시작점이 계정 탈취였어요.
  6. 향후 설치 시 --ignore-scripts 사용
    npm install --ignore-scripts를 사용하면 preinstall/postinstall 훅 실행을 막을 수 있어요. CI/CD 파이프라인 기본값으로 설정하는 것을 권장해요.