CanisterWorm Malware
널리 사용되는 Trivy 스캐너를 표적으로 삼았던 정교한 공급망 공격이 여러 npm 패키지에 영향을 미치는 광범위한 침해로 확대되었습니다. 이번 공격의 배후에는 이전에 보고된 적 없는 자가 복제 웜인 CanisterWorm을 배포한 것으로 추정되며, 이로 인해 침입 규모와 영향력이 크게 증가했습니다.
해당 악성 소프트웨어는 명령 인프라의 일부로 분산형 블록체인에 호스팅된 변조 방지 스마트 계약인 인터넷 컴퓨터 프로토콜(ICP) 캐니스터를 사용한다는 점에서 그 이름이 유래되었습니다. 이는 ICP 캐니스터를 무기화하여 명령 및 제어(C2) 엔드포인트를 탈취하는 데 사용된 최초의 공개 사례로, 기존의 완화 노력을 복잡하게 만드는 새롭고 강력한 전술을 제시합니다.
목차
손상된 패키지 및 초기 접근 벡터
이번 공격은 다양한 범위의 여러 npm 패키지에 영향을 미쳐 소프트웨어 공급망 전반에 걸쳐 광범위한 파급 효과를 일으켰습니다.
- @EmilGroup 범위에 속하는 28개 패키지
- @opengov 범위에 속하는 16개 패키지
- @teale.io/eslint-config, @airtm/uuid-base32, @pypestream/floating-ui-dom을 포함한 추가 패키지
이번 공격은 자격 증명 탈취 사건이 발생한 직후에 이루어졌습니다. 공격자들은 이 사건을 통해 Trivy 관련 도구, 특히 trivy, trivy-action, setup-trivy의 악성 버전을 유포했는데, 이 악성 버전에는 자격 증명을 탈취하는 기능이 내장되어 있었습니다. 이번 공격은 클라우드 환경에 특화된 사이버 범죄 조직인 TeamPCP와 연관된 것으로 추정됩니다.
감염 워크플로 및 분산형 명령 인프라
감염 경로는 npm 패키지 설치 과정에서 시작되며, 설치 후 실행되는 스크립트가 로더를 실행합니다. 이 로더는 ICP 캐니스터와 통신하도록 설계된 파이썬 기반 백도어를 배포합니다. 캐니스터는 데드 드롭 리졸버 역할을 하며, 감염된 시스템이 다음 단계 페이로드를 다운로드하고 실행하도록 안내하는 URL을 반환합니다.
ICP 인프라의 분산형 구조는 공격자에게 상당한 이점을 제공합니다. 캐니스터가 페이로드 URL을 동적으로 업데이트할 수 있기 때문에, 공격자는 배포된 악성코드 자체를 수정하지 않고도 감염된 모든 시스템에 새로운 악성 바이너리를 배포할 수 있습니다. 이러한 아키텍처는 또한 제거 작업을 훨씬 더 어렵게 만듭니다.
지속성 메커니즘 및 은밀 기법
시스템d 사용자 서비스를 생성하여 악성 프로세스를 자동으로 재시작하도록 구성함으로써 지속성을 확보합니다. 주요 특징은 다음과 같습니다.
- Restart=always 지시문을 통해 자동 재시작이 강제됩니다.
- 종료 시 백도어를 다시 실행하기 전에 5초의 지연 시간이 있습니다.
- 'pgmon'이라는 이름으로 서비스를 합법적인 PostgreSQL 모니터링 소프트웨어인 것처럼 위장했습니다.
이러한 접근 방식은 합법적인 시스템 서비스와 혼용되어 탐지 가능성을 최소화하면서 지속적인 운영을 보장합니다.
적응형 페이로드 전달 및 킬 스위치 동작
백도어는 의심을 피하기 위해 위조된 브라우저 사용자 에이전트를 사용하여 50분마다 ICP 캐니스터와 주기적으로 통신합니다. 반환된 URL에 따라 다음 동작이 결정됩니다.
- URL이 유효한 페이로드를 가리키는 경우, 악성 프로그램은 해당 페이로드를 다운로드하고 실행합니다.
- URL에 'youtube.com'이 포함되어 있으면 악성 프로그램은 휴면 상태로 들어갑니다.
이 메커니즘은 사실상 원격 킬 스위치 역할을 합니다. 공격자는 악성코드 컨테이너의 URL을 정상적인 YouTube 링크와 악성 페이로드 사이에서 전환함으로써 감염된 모든 시스템에서 악성코드를 활성화 또는 비활성화할 수 있습니다. 특히, 이전에 실행된 페이로드는 악성코드가 이전 프로세스를 종료하지 않기 때문에 백그라운드에서 계속 실행됩니다.
유사한 YouTube 기반 킬 스위치가 트로이목마에 감염된 Trivy 바이너리(버전 0.69.4)에서도 발견되었는데, 이 바이너리는 별도의 Python 드로퍼를 통해 동일한 ICP 인프라와 통신합니다.
웜의 기능 및 자동 전파
초기에는 deploy.js라는 수동으로 실행되는 스크립트를 통해 악성코드가 확산되었는데, 이 스크립트는 탈취한 npm 인증 토큰을 이용하여 접근 가능한 패키지에 악성코드를 삽입했습니다. 이 스크립트는 설치 과정 중에 실행되는 것이 아니라, 공격 범위를 확장하는 독립적인 도구로 사용되었습니다.
CanisterWorm의 후속 변종들은 상당한 진화를 거듭해 왔습니다. @teale.io/eslint-config에서 발견되는 1.8.11 및 1.8.12 버전과 같은 최신 버전에서는 웜이 패키지 설치 과정에 자체 전파 기능을 직접 통합했습니다. 업데이트된 메커니즘은 다음과 같습니다.
- 감염된 환경에서 npm 인증 토큰 추출
- 전파 루틴을 별도의 백그라운드 프로세스로 즉시 실행합니다.
- 탈취한 자격 증명을 사용하여 손상된 패키지를 자동으로 게시합니다.
이러한 변화는 공격 방식을 수동으로 조작하는 캠페인에서 완전히 자율적인 전파 시스템으로 전환시킵니다.
자립형 공급망 위협으로의 확대
자동화된 토큰 수집 및 자체 전파 기능의 도입은 심각한 위협으로 이어집니다. 손상된 패키지를 설치하고 접근 가능한 npm 자격 증명을 포함하는 개발자 워크스테이션이나 CI/CD 파이프라인은 모두 활성 전파 노드가 됩니다. 이는 감염된 패키지가 하위 종속성으로 이어져 추가 감염을 유발하는 연쇄 효과를 초래합니다.
이 단계에 이르면 위협은 단순한 계정 침해를 넘어 악성코드 유포를 위한 자생적인 생태계로 진화합니다. 새로 감염된 환경 하나하나가 확산에 기여하여 기하급수적인 성장을 가능하게 하고, 차단을 훨씬 더 어렵게 만듭니다.
더욱 우려스러운 점은 'hello123'과 같은 임시 페이로드를 사용한 테스트 결과가 공격자들이 완전히 작동하는 악성 바이너리를 배포하기 전에 공격 체인을 적극적으로 다듬고 검증하고 있음을 보여준다는 것입니다.