오프 시즌이 없다: 48시간 안에 npm, PyPI, Docker Hub를 강타한 세 가지 공급망 캠페인
Source: Dev.to
몇 주간 조용했던 상황이 끝나고, 세 차례의 공급망 공격이 비밀 정보를 다시 조명하게 만들었습니다. 2026년 4월 21 – 23일 사이에 서로 다른 캠페인이 npm, PyPI, 그리고 Docker Hub을 노렸습니다. 대상과 위협 행위자는 달랐지만, 각 악성코드의 주된 목표는 개발자 환경과 CI/CD 파이프라인에서 비밀 정보를 탈취하는 것이었습니다—API 키, 클라우드 자격 증명, SSH 키, 레지스트리 토큰 등을 포함합니다.
Campaign 1 – Checkmarx KICS: Compromised Security Scanner Turns on Its Users
첫 번째 공격은 공식 Checkmarx KICS Docker 이미지와 VS Code 확장 프로그램을 손상시켰습니다. Docker는 4월 22일 checkmarx/kics 저장소에서 의심스러운 활동을 감지하고 Socket에 알렸습니다. 난독화된 페이로드는 다음을 수집했습니다:
- GitHub 인증 토큰
- AWS, Azure, Google Cloud 자격 증명
- npm 설정 파일
- SSH 키 및 환경 변수
수집된 데이터는 압축·암호화된 뒤 외부로 유출되었습니다. 페이로드는 또한 환경 변수에 저장된 모든 API 키를 함께 수집했습니다.
공격자 추정: TeamPCP가 공격을 주도한 것으로 보이며, 이는 공개 직후 X에 올린 게시물에서 확인됩니다. 이 그룹은 지난 두 달 동안 두 번째 Checkmarx 공격을 진행했습니다.
Campaign 2 – CanisterSprawl: A Worm That Turns Developer Machines into Launchpads
4월 21일, 악성 버전의 pgserve(Node.js용 PostgreSQL 서버)가 npm에 등장했습니다. 손상된 패키지는 postinstall 훅을 통해 매 npm 설치 시 실행되는 자격 증명 수집 스크립트를 삽입합니다. 이 스크립트는:
- npm publish 토큰을 검색합니다.
- 피해자가 게시할 수 있는 각 패키지에 대해 패치 버전을 올리고 자신을 삽입한 뒤 npm에 재게시합니다.
- PyPI 토큰이 발견되면, 웜은 전체 생태계를 넘어 이동합니다.
Socket과 StepSecurity는 이 활동을 CanisterSprawl이라 명명했으며, 이는 Internet Computer Protocol (ICP) 캐니스터를 활용한 탄력적이고 분산된 C2 채널을 의미합니다. 추가 조사에서 손상된 Namastex.ai npm 패키지가 동일한 핵심 방법—설치 시 실행, 자격 증명 탈취, 캐니스터 기반 인프라로의 오프‑호스트 유출, 자체 전파 로직—을 사용한 것으로 밝혀졌습니다.
Campaign 3 – xinference: TeamPCP Returns to PyPI
4월 22일, PyPI에 연속으로 3번 출시된 xinference 패키지에 자격 증명 탈취 페이로드가 포함되었습니다. 이 악성코드는 2단계 컬렉터를 디코딩해 SSH 키, 클라우드 자격 증명, 환경 변수, 암호화폐 지갑을 수집합니다. StepSecurity는 이를 TeamPCP에게 귀속시키는데, 이 그룹은 3월에 발생한 litellm 및 Telnyx PyPI 침해와 동일한 행위자입니다.
기술적 참고: 이전 TeamPCP 캠페인과 달리, xinference 페이로드는 암호화 없이 평문 tar.gz 파일을 C2 서버로 직접 전송합니다. 일부 연구자는 이를 모방 공격일 가능성으로 보지만, 삽입 패턴과 다중 버전 배포 주기는 TeamPCP의 기존 전술과 일관됩니다.
The Common Thread
세 캠페인, 세 생태계, 하나의 목표. 이 공격들은 소프트웨어 전달을 방해하거나 빌드 결과물을 손상시키는 것이 목적이 아니었습니다. CanisterSprawl 웜, 트로이 목마화된 KICS 스캐너, xinference 스틸러 등 모든 페이로드는 개발자와 파이프라인이 운영되는 환경에서 자격 증명을 추출하도록 설계되었습니다.
영향을 받은 팀은 “이 패키지가 내 환경에서 실행되었는가?”뿐 아니라 “실행되었다면 어떤 비밀이 접근 가능했으며, 이미 회전시켰는가?”를 물어야 합니다.
이를 위해서는 비밀이 존재하는 위치—레포지토리, CI 설정, 환경 변수, 개발자 머신—에 대한 가시성이 필요합니다. 공격자가 노리는 모든 표면에서 노출된 비밀을 지속적으로 탐지하는 것이, 다음에 손상된 패키지가 파이프라인에서 실행될 때 처음부터 시작하지 않도록 하는 핵심입니다.
Read more: The Team PCP Snowball Effect: A Quantitative Analysis