- NPM 저장소에서 100개 이상 자격 증명 탈취용 악성 패키지가 8월 이후 탐지되지 않은 채 업로드되어, 총 8만6천 회 이상 다운로드된 사실이 확인됨
- 보안업체 Koi는 ‘** PhantomRaven**’으로 명명한 공격 캠페인이 NPM의 Remote Dynamic Dependencies(RDD) 기능을 악용해 126개의 악성 패키지를 배포했다고 보고
- RDD는 패키지가 신뢰되지 않은 도메인에서 동적으로 의존성 코드를 내려받을 수 있게 하는 구조로, 정적 분석 도구에서는 탐지되지 않음
- 공격자는 이 기능을 이용해 HTTP 연결을 통한 악성 코드 다운로드를 수행했으며, 패키지 메타데이터에는 “0 Dependencies”로 표시되어 개발자와 보안 스캐너가 인식하지 못함
- 이러한 구조적 취약점은 NPM 생태계의 보안 관리 한계와 자동 설치 메커니즘의 위험성을 드러냄
NPM 저장소 내 악성 패키지 확산
- 공격자들이 NPM 코드 저장소의 구조적 약점을 이용해 8월 이후 100개 이상의 자격 증명 탈취용 패키지를 업로드
- 대부분의 패키지가 탐지되지 않은 채 배포되었으며, 누적 다운로드 수는 86,000회 이상
- 보안업체 Koi는 이 공격을 PhantomRaven 캠페인으로 명명하고, NPM의 특정 기능이 악용되었다고 분석
- Koi에 따르면 126개의 악성 패키지 중 약 80개가 기사 작성 시점에도 여전히 NPM에 남아 있었음
Remote Dynamic Dependencies(RDD)의 취약 구조
- RDD는 패키지가 외부 웹사이트에서 의존성 코드를 동적으로 다운로드하도록 허용하는 기능
- 일반적으로 의존성은 NPM의 신뢰된 인프라에서 내려받지만, RDD는 HTTP 등 암호화되지 않은 연결을 통한 다운로드도 허용
- PhantomRaven 공격자는 이 기능을 이용해 악성 URL(예: http://packages.storeartifact.com/npm/unused-imports)에서 코드를 내려받도록 설정
- 이러한 의존성은 개발자와 보안 스캐너에 보이지 않으며, 패키지 정보에는 “0 Dependencies”로 표시됨
- NPM의 자동 설치 기능으로 인해 이러한 ‘보이지 않는’ 의존성 코드가 자동 실행되는 구조
보안 도구의 탐지 한계
- Koi의 Oren Yomtov는 “PhantomRaven은 기존 보안 도구의 사각지대를 정교하게 악용한 사례”라고 언급
- 이로 인해 공격자는 보안 검증을 우회하며 악성 코드를 배포할 수 있었음
추가적 취약 요인
- Koi는 RDD로 내려받은 의존성이 매 설치 시마다 공격자 서버에서 새로 다운로드된다고 설명
- 캐시나 버전 관리가 없어, 동일 패키지라도 설치 시점마다 다른 악성 코드가 주입될 가능성 존재
- 이러한 동적 다운로드 구조는 패키지 무결성 검증을 어렵게 함
NPM의 구조 및 배경
- NPM은 JavaScript용 패키지 관리자로, GitHub 자회사인 npm, Inc. 가 관리
- Node.js의 기본 패키지 관리자이며, 명령줄 클라이언트와 npm registry로 구성
- registry에는 공개 및 유료 비공개 패키지가 저장되며, 웹사이트를 통해 검색 가능
- 이번 사건은 NPM의 자동 의존성 관리 구조가 공격에 악용될 수 있음을 보여주는 사례로 지적됨
기타 언급
- 기사 말미에서는 불필요한 JavaScript 실행을 차단해야 한다는 의견이 언급됨
- 그러나 이번 공격은 필수 JavaScript 코드조차 악용된 사례로 지적됨