공지사항

Security Insights & Trends

npm 공급망 공격 사건 정리: 패키지 악성 코드 삽입

Raoul16 2025. 9. 9. 16:47
npm 공급망 공격 사건 정리: 패키지 악성 코드 삽입

 

 

그로메트릭 네이버 블로그 원문을 참고하세요!
https://m.blog.naver.com/grometric/224001430811

 

npm 공급망 공격 사건 정리: 패키지 악성 코드 삽입

안녕하세요 그로메트릭 입니다. 🐸 2025년 9월 8일 발생한 npm 생태계의 심각한 공급망 공격 사건을 정리...

blog.naver.com

 

 

안녕하세요

그로메트릭 입니다. 🐸

2025년 9월 8일 발생한 npm 생태계의 심각한 공급망 공격 사건을 정리했습니다.


사건의 시작: npm 계정 피싱 악성 패키지 배포

2025년 9월 8일, 공격자는 npm 패키지 유지관리자를 대상으로 피싱 이메일을 보냈습니다.

발신 주소: support@npmjs.help

“지난 12개월간 2FA(이중 인증)를 갱신하지 않았으며, 2025년 9월 10일까지 갱신하지 않으면 계정이 잠깁니다.”

유지관리자 중 일부가 해당 이메일에 속아 로그인 정보를 입력했고, 공격자는 이를 통해 npm 계정 권한을 탈취했습니다.

이후 공격자는 탈취한 계정으로 악성 코드가 삽입된 패키지를 정식 npm 레지스트리에 직접 게시했습니다.

대표적으로 debug@4.4.2, chalk@5.6.1 등이 있으며, 이 시점부터 npm에서 npm install 명령으로 최신 버전을 내려받은 개발자는 누구나 악성 코드가 포함된 패키지를 설치하게 되는 상황에 놓였습니다.

즉, 이번 사건의 발생 시작은 단순한 코드 결함이 아니라, 사람을 노린 피싱 → 계정 탈취 → 악성 패키지 공식 배포라는 공급망 공격 시나리오였습니다.


악성 코드가 심어진 패키지들

공격에 의해 게시된 악성 버전 패키지 목록은 커뮤니티 토론(Hacker News)과 각 저장소 이슈에서 확인되었습니다.

더보기

debug@4.4.2 (2025년 9월 8일 CEST 기준 18:09경 yank 처리됨)

chalk@5.6.1

ansi-styles@6.2.2

supports-color@10.2.1

strip-ansi@7.1.1

ansi-regex@6.2.1

wrap-ansi@9.0.1

color-convert@3.1.1

color-name@2.0.1

is-arrayish@0.3.3

slice-ansi@7.1.1

color@5.0.1

color-string@2.1.1

simple-swizzle@0.2.3

supports-hyperlinks@4.1.1

has-ansi@6.0.1
chalk-template@1.1.1

backslash@0.2.1

이들은 모두 자바스크립트 생태계에서 가장 많이 의존되는 핵심 패키지로, 단일 주간 다운로드 수만 합쳐도 26억 회에 이른다고 보도되었습니다.

따라서 피해 잠재 범위는 웹 서비스부터 모바일 앱, 서버 애플리케이션까지 사실상 전 생태계를 아우른다고 볼 수 있습니다.

 

 

개발자들이 감염될 수 있었던 이유: npm install의 위험성

npm 패키지는 단순히 코드 파일만 내려받는 것이 아니라, 설치 과정에서 실행되는 스크립트(postinstall 등)를 포함할 수 있습니다.

즉, 누군가 npm install을 실행하면 해당 버전의 코드가 로컬 개발 환경에서 즉시 실행될 수 있습니다.

따라서 악성 코드가 삽입된 시점에 개발자가 npm install chalk@5.6.1 같은 감염 버전을 설치했다면, 로컬 환경에서 자동 실행된 코드가 환경 변수, 토큰, API 키를 훔치거나 네트워크 트래픽을 변조할 수 있습니다.

더 나아가 이 코드가 빌드 결과물에 포함되어 서비스에 배포되면, 최종 사용자까지 피해가 확산될 수 있습니다. 즉, 단순히 npm install을 실행한 것만으로도 공격자가 심어둔 악성 페이로드가 실행될 수 있었기 때문에, 설치한 개발자들이 감염되었을 가능성이 있다는 말이 나온 것입니다.

✅ 내 프로젝트가 감염되었는지 확인하는 방법 ✅

1. package-lock.json / yarn.lock 검사

# npm 프로젝트의 경우

grep '"debug": "4.4.2"' package-lock.json

grep '"chalk": "5.6.1"' package-lock.json

# yarn 프로젝트의 경우

grep 'debug@4.4.2' yarn.lock

grep 'chalk@5.6.1' yarn.lock

2. npm ls 명령으로 직접 확인

npm ls debug chalk

출력에 debug@4.4.2 또는 chalk@5.6.1이 있으면 감염된 상태입니다.

3. 안전한 버전으로 롤백

npm uninstall debug chalk

npm install debug@4.4.1 chalk@5.6.0

4. 환경 변수 및 비밀키 교체

감염 버전을 설치했을 가능성이 있다면, API 키, 인증 토큰, 환경 변수를 전부 재발급·교체해야 합니다.


사건의 의미와 교훈

이번 사건은 단순히 debug나 chalk의 문제가 아니고, 오픈소스 공급망 전체에 대한 보안 리스크를 드러낸 대표적 사례입니다.

  1. 개발자 계정 보안 강화: npm 계정은 공급망 핵심 열쇠. 피싱 대응과 강력한 MFA 필수
  2. 자동화된 보안 검증 필요: CI/CD 내 패키지 무결성 검사 및 해시 검증 강화
  3. 실시간 보안 알림 구독: GitHub Advisory, 저장소 이슈, 보안 커뮤니티 모니터링 필수

오픈소스는 신뢰 위에 세워져 있지만, 그 신뢰를 맹목적으로 받아들여서는 안 됩니다. 패키지 설치 전후의 보안 점검, 계정 보안 강화, 빠른 대응 프로세스 구축이, 곧 공급망 전체의 안전을 지키는 일일 것입니다.