npm 웜(Worm) 확산: 개발 환경을 노리는 공급망 공격
Namastex Labs의 패키지를 통해 npm 생태계에 공급망 공격(Supply Chain Attack)이 발생, 16개 이상의 패키지가 감염됨
감염된 패키지는 npm postinstall 훅(Hook)을 통해 환경 변수, SSH 키, 클라우드 자격 증명 등 다양한 정보를 탈취(Information Theft)
탈취된 정보는 HTTPS 웹훅(Webhook)과 ICP 캐니스터(Canister)로 전송되며, 지속적인 확산(Continuous Propagation)을 시도함
개발자는 감염된 패키지 제거, 자격 증명 로테이션(Credential Rotation), npm 토큰 검토 등 긴급 조치(Emergency Action)가 필요함
공격 방식: postinstall 훅(Hook)을 이용한 정보 탈취
공격은 npm 패키지 설치 시 실행되는 postinstall 훅(Hook)을 악용하여 이루어진다. 감염된 패키지가 설치되면 1,143줄에 달하는 자격 증명 수집 스크립트(Credential Harvesting Script)가 실행된다. 이 스크립트는 환경 변수, .npmrc 파일, SSH 키, 클라우드 자격 증명, 쿠버네티스 및 도커 설정, Terraform 및 Pulumi 상태, .env 파일, 쉘 히스토리, Vault 데이터, 브라우저 로그인 데이터, 암호화폐 지갑 파일 등 광범위한 정보(Wide Range of Information)를 수집한다. 특히, 데이터 미저장 정책(Zero-Retention Policy)을 따르는 서비스에서도 정보 유출이 발생할 수 있다는 점에 유의해야 한다.
지속적인 확산을 위한 웜(Worm)의 전략
이 웜은 감염된 개발 환경에서 npm publish 토큰을 찾아, 해당 토큰으로 게시할 수 있는 모든 패키지를 식별한다. 그런 다음 패키지 버전을 증가시키고, 악성 코드를 주입한 후 --tag latest 옵션으로 다시 게시한다. 이로 인해 정확한 버전을 고정하지 않은 개발자는 감염된 릴리스를 설치하게 되고, 다음 확산 벡터(Next Propagation Vector)가 된다. 또한, PyPI 자격 증명이 발견되면 .pth 파일을 통해 Python 패키지에도 동일한 방식을 적용한다. 이는 멀티 에코시스템 웜(Multi-Ecosystem Worm)의 특징을 보여준다.
ICP 캐니스터(Canister)를 활용한 C2 인프라
탈취된 데이터는 telemetry.api-monitor[.]com (HTTPS 웹훅)과 cjn37-uyaaa-aaaac-qgnva-cai.raw.icp0[.]io (ICP 캐니스터)로 전송된다. 특히, ICP 캐니스터를 C2(Command and Control) 인프라로 활용하는 것은 TeamPCP의 CanisterWorm과 유사한 방식이다. ICP 캐니스터는 기존 서버와 달리 압수하기 어렵기 때문에, 공격자는 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 지속적인 공격을 수행할 수 있다.
대응 방안: 긴급 조치 및 예방
개발자는 즉시 감염된 패키지 버전을 시스템 및 CI/CD 파이프라인에서 제거해야 한다. 또한, npm 토큰, SSH 키, 클라우드 자격 증명, API 키 등 잠재적으로 노출되었을 수 있는 모든 자격 증명을 로테이션해야 한다. pgserve 패키지의 경우, check-env.js 및 public.pem 파일이 있는지 확인해야 한다. 4월 21일 22:14 UTC 이후 감염된 버전의 설치 기록을 검토하고, 사용하지 않는 npm 토큰의 범위를 감사하고 폐기해야 한다. 만약 PyPI 자격 증명이 노출되었다면, Python 환경에서 .pth 파일 주입 여부를 확인해야 한다.