한 줄 요약 - 최근 3주 사이 npm 생태계를 노린 대형 공급망 공격이 잇따랐습니다. 설치나 빌드 스크립트를 악용해 정보를 빼가는 수법이 공통이라, 프론트 개발자도 방어법을 챙길 때입니다.
무슨 일이 있었나
Mastra AI - 탈취된 기여자 계정으로 140여 개 패키지에 dayjs를 가장한 easy-day-js 의존성이 주입되고, postinstall(설치 직후 자동 실행되는 스크립트) 훅이 2차 정보탈취 페이로드를 실행했습니다. 주간 다운로드 110만 이상이 노출됐습니다.
Red Hat - 직원 GitHub 계정 탈취로 redhat-cloud-services 스코프 패키지 32개 이상에 Miasma라 불리는 자격증명 탈취 웜이 배포됐습니다.
IronWorm - postinstall이 난독화 코드가 아니라 바이너리 실행파일을 직접 트리거해 36개 패키지를 감염시키고, 훔친 자격으로 자동 재배포하며 스스로 퍼졌습니다.
node-gyp binding.gyp 악용 - 빌드 설정 파일의 명령 확장 문법을 악용해, preinstall이나 postinstall 항목 없이도 npm install 도중 코드를 실행했습니다. 스크립트 항목만 보는 탐지를 우회한 사례입니다.
dependency confusion - 사내 네임스페이스를 모방한 패키지를 부풀린 버전 번호로 등록해 설치 우선순위를 가로채고, 개발자 환경을 정찰한 캠페인이 45개 패키지로 확인됐습니다.
그래서 어떻게 막나
설치 스크립트를 함부로 돌리지 않기 - 신뢰가 안 되는 설치엔 npm install --ignore-scripts를 쓰세요. 이번 공격 다수가 postinstall과 빌드 훅을 노렸습니다.
lockfile 고정과 npm ci - 버전을 잠그고 lockfile 그대로 설치해, 부풀린 버전으로 가로채는 dependency confusion을 막습니다.
provenance(출처) 확인 - npm의 패키지 출처 정보로 정상 빌드에서 나온 패키지인지 점검합니다.
사내 패키지는 스코프와 레지스트리 분리 - 퍼블릭 npm과 이름이 겹치지 않게 스코프를 두고 내부 레지스트리를 우선합니다.
의존성 자동 점검 - Socket나 Snyk 같은 도구, GitHub 보안 경고로 새 의존성 위험을 자동 감지합니다.
정리
공통 교훈은 패키지를 설치하는 것만으로도 코드가 실행될 수 있다는 점입니다. 특히 postinstall과 빌드 스크립트를 기본적으로 의심하고, lockfile 고정과 스크립트 차단을 습관으로 두는 게 가장 효과적인 1차 방어입니다.
