IronWorm이란 무엇인가
IronWorm은 세 가지 핵심 기술을 조합한 고도화된 공급망 악성코드다.
Rust 기반 바이너리: 일반적인 JavaScript 악성코드와 달리 Rust로 컴파일된 ELF 바이너리 형태로 배포된다. 이는 탐지를 어렵게 하고 실행 성능을 높인다.
eBPF 커널 루트킷: eBPF(Extended Berkeley Packet Filter)는 리눅스 커널에서 코드를 실행하는 기술로, 일반적인 악성코드 탐지 도구의 시야를 벗어나 동작할 수 있다. IronWorm은 이를 활용해 자신의 존재를 시스템 레벨에서 은폐한다.
Tor 네트워크 통신: 탈취한 데이터를 Tor 네트워크를 통해 운영자에게 전송함으로써 C2(명령 및 제어) 서버 추적을 방해한다.
공격 경로: 어떻게 침투하는가
공격은 'asteroiddao'라는 이름의 침해된 npm 계정에서 시작됐다. 이 계정은 preinstall 스크립트를 통해 실행되는 Rust ELF 바이너리가 포함된 악성 패키지 버전을 게시했다.
패키지를 설치하는 개발자나 CI 환경에서 npm install을 실행하는 순간 악성코드가 실행된다. IronWorm은 시스템에서 86개의 환경 변수와 20개의 자격증명 파일을 수집하며, 구체적 대상은 다음과 같다.
- OpenAI, AWS, Anthropic API 키
- npm 자격증명 및 Trusted Publishing 시크릿
- Vault 설정 파일
- SSH 키
- Exodus 암호화폐 지갑 파일
| 지표 | 수치 |
|---|---|
| 감염된 npm 패키지 수 | 36개 |
| 수집 대상 환경 변수 | 86개 |
| 수집 대상 자격증명 파일 | 20개 |
| 악성코드 작성 언어 | Rust |
| C2 통신 방식 | Tor 네트워크 |
| 최초 침해 계정 | asteroiddao |
자가 전파 메커니즘
IronWorm의 가장 위험한 특성은 자가 전파 능력이다. 탈취한 npm 자격증명을 사용해 피해자가 소유한 다른 패키지의 악성 버전을 npm에 게시한다. Trusted Publishing 워크플로우(CI/CD에서 npm에 직접 게시하는 방식)의 시크릿까지 탈취하므로, 피해자의 저장소에 악성 커밋을 직접 푸시하는 것도 가능하다.
이 연쇄 감염 구조가 IronWorm을 일반 정보 탈취 악성코드와 구분 짓는 핵심 요소다. 한 개발자 또는 CI 환경이 감염되면, 그 개발자가 유지보수하는 패키지를 사용하는 다운스트림 사용자까지 위험에 처하게 된다.
GitHub Actions를 통한 데이터 유출
JFrog가 발견한 또 다른 정교한 요소는 데이터 유출 방식이다. 악성코드는 수집한 시크릿을 직렬화한 뒤 린트(lint) 또는 포매팅(formatting) 출력처럼 보이는 무해한 이름의 파일에 기록한다. 이 파일은 GitHub Actions 워크플로우를 통해 운영자에게 전달된다.
이 기법은 두 가지 측면에서 탐지를 어렵게 한다. 첫째, 비정상적인 아웃바운드 네트워크 연결 없이 GitHub의 정상적인 인프라를 악용한다. 둘째, 파일 이름이 일반적인 개발 산출물과 유사해 코드 리뷰나 로그 모니터링에서 놓치기 쉽다.
동시다발 공격: binding.gyp
같은 시기에 Endor Labs와 StepSecurity는 IronWorm과 유사하지만 별개인 공격을 발견했다. binding.gyp라는 이름의 JavaScript 기반 악성코드로, 레지스트리 오염과 GitHub Actions 감염을 수행한다.
두 공격이 같은 시기에 발생한 것은 우연이 아닐 가능성이 있다. npm 생태계를 대상으로 한 공급망 공격의 조직적 캠페인 가능성을 시사한다.
방어 전략
개발자와 보안팀이 취해야 할 조치는 다음과 같다.
| 조치 | 우선순위 | 대상 |
|---|---|---|
| 영향받은 패키지 즉시 업그레이드 | 즉시 | 전체 개발자 |
| API 키·SSH 키 교체 | 즉시 | 전체 개발자 |
| 모든 npm·GitHub 계정 2FA 활성화 | 즉시 | 전체 개발자 |
| CI 환경의 npm 설치 시크릿 감사 | 24시간 이내 | DevOps팀 |
| eBPF 기반 런타임 탐지 도구 도입 | 단기 | 보안팀 |
| Trusted Publishing 시크릿 정기 로테이션 정책 수립 | 단기 | DevOps팀 |
핵심 요약
- IronWorm: Rust 기반, eBPF 루트킷 사용, Tor 통신하는 npm 공급망 악성코드
- 36개 패키지 감염: 86개 환경 변수와 20개 자격증명 파일 수집
- 자가 전파: 탈취한 npm 자격증명으로 피해자의 다른 패키지를 감염시킴
- GitHub Actions 악용: 무해한 파일명으로 시크릿 유출, 탐지 회피
- 즉시 조치: 영향받은 패키지 업그레이드, API 키 교체, 2FA 활성화