NPM 공급망 공격, 5천만 다운로드 패키지 감염
NPM 레지스트리에서 발생한 심각한 공급망 공격으로, 5천만 회 이상 다운로드된 100개 이상 패키지가 악성코드에 감염됨
공격자는 PR(Pull Request) 트리거를 악용하여 NPM의 신뢰된 게시 프로세스를 우회, 악성 코드를 포함한 패키지를 배포함
감염된 패키지는 사용자 시스템을 스캔하고, GitHub 토큰 탈취 후 추가 악성 패키지를 게시하는 방식으로 확산됨
PNPM 11 버전의 최소 릴리스 연령 및 외부 종속성 차단 기능으로 유사 공격 예방 가능성을 제시함
NPM 공급망 공격의 정교한 수법
본 영상은 NPM 레지스트리를 대상으로 발생한 정교한 공급망 공격 사례를 분석함. 공격자는 Tan stack 저장소(Repository)를 포크(Fork)한 후, 실제 병합되지 않은 풀 리퀘스트(Pull Request)를 생성하여 CI/CD 파이프라인을 트리거시킴. 이 과정에서 GitHub Actions의 워크플로우 트리거 설정 오류를 악용하여, 포크된 PR임에도 불구하고 메인 저장소의 권한을 획득, 악성 코드를 포함한 파일을 CI 서버의 공유 캐시(Shared Cache)에 주입하는 데 성공함.
악성 패키지의 확산 메커니즘
CI 서버 캐시에 주입된 악성 파일은 이후 메인 저장소에 병합되는 정상적인 PR과 함께 실행됨. 이를 통해 공격자는 NPM 게시 토큰(Publish Token)을 탈취하고, 이를 이용해 84개의 Tan stack 패키지를 포함한 다수의 패키지에 악성 코드를 삽입함. 감염된 패키지는 사용자 시스템을 스캔하여 GitHub 토큰을 탈취하고, 이를 이용해 추가 악성 버전을 NPM에 게시하는 방식으로 연쇄적인 감염(Chain Infection)을 일으킴. 나아가 Python SDK를 통해 PyPI 생태계까지 확장되는 양상을 보임.
보안 강화 도구 및 PNPM의 역할
영상에서는 이러한 공격을 방지하기 위한 방안으로 PNPM 버전 11 이상 사용을 권장함. PNPM은 최소 릴리스 연령(Minimum Release Age) 기능을 통해 24시간 이내에 게시된 패키지 설치를 차단하고, 외부 종속성 차단(Block Exotic Dependencies) 기능으로 NPM 레지스트리 외의 출처에서 오는 패키지 설치를 거부함. 또한, 승인된 빌드(Approved Builds) 기능을 통해 설치 스크립트 실행을 제어하여 악성코드 실행을 방지하는 등 다층적인 보안 체계를 제공함.
공격의 진화와 탐지 회피 전략
공격은 여기서 그치지 않고 더욱 진화함. 악성코드는 Cloud Code GitHub 앱의 서명을 위조하여 커밋을 생성함으로써, AI 생성 코드와 악성 활동을 구분하기 어렵게 만듦. 또한, 감염된 개발 환경(VS Code)에 자체를 임베딩하여 개발자가 악성 패키지를 제거해도 편집기 실행 시 자동으로 재실행됨. 더 나아가, GitHub 토큰 유효성을 주기적으로 확인하고 만료 시 루트 디렉토리를 삭제하는 '웜 크라임 모드(Worm Crime Mode)'를 활성화하는 등 탐지를 회피하고 피해를 극대화하는 전략을 사용함.