공지사항

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, 저장소 이슈, 보안 커뮤니티 모니터링 필수

​

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