주요 내용:
- IronWorm 악성코드가 Arweave 생태계 내 npm 패키지 36개를 감염시켜 개발자 자격증명 탈취
- Rust 기반 웜, eBPF 루트킷 및 Tor 기반 C2 사용하며 알려진 악성코드 프레임워크와 일치하는 사례 없음
- 공격자는 9개 조직에 걸쳐 57건의 악성 커밋을 수행한 후 패키지를 조용히 제거
주요 내용:

IronWorm이라 명명된 Rust 기반 웜이 Arweave 생태계 내 최소 36개의 npm 패키지를 감염시켜 개발자 자격증명을 탈취하고, 이를 활용해 GitHub 리포지토리 전반으로 자가 전파한 후 사라졌다.
JFrog 보안 연구팀은 Arweave 및 WeaveDB 오픈소스 생태계 내 한 개발자 계정과 연결된 의심스러운 활동을 조사하던 중 이 캠페인을 식별했다. Rust로 작성된 이 악성코드는 감염된 개발자 머신에서 API 키, 클라우드 자격증명, SSH 키, npm 퍼블리싱 토큰을 수집한 후, 해당 자격증명을 재사용해 다른 리포지토리로 악성 코드를 푸시한다.
"가장 유사한 사례는 샤이훌루드(Shai-Hulud) 캠페인입니다,"라고 JFrog 연구팀은 수요일 발표한 보고서에서 밝혔다. "저희가 분석한 악성코드는 개발자 감염, 자격증명 탈취, 신뢰할 수 있는 소프트웨어 공급망 워크플로를 이용한 추가 확산 등 많은 부분을 공유합니다." 그러나 IronWorm은 이 개념을 "한 단계 더 발전시켰다"고 연구진은 덧붙였다.
공격자는 9개 조직에 속한 리포지토리 전반에 걸쳐 최소 57건의 악성 코드 변경을 수행했으며, 커밋 날짜를 소급하여 감염 타임라인을 은폐했다. 일부 기여는 13년 전의 타임스탬프를 가지고 있음에도 불구하고 "claude@users.noreply.github.com" 이메일을 사용해 Anthropic의 Claude AI 모델이 한 것으로 귀속되었다. JFrog에 따르면 GitHub Actions 로그는 해당 커밋이 실제로는 손상된 ocrybit 사용자에 의해 푸시되었음을 드러냈다. 이 캠페인을 추적한 OX Security는 위협이 차단되기 전까지 영향을 받은 패키지들의 월간 총 다운로드 수가 32,000건을 넘었다고 밝혔다.
알려진 선례가 없는 맞춤형 임플란트
JFrog에 따르면 IronWorm 페이로드는 데이터베이스 내 알려진 정보탈취 악성코드, eBPF 루트킷, 또는 명령 및 제어 프레임워크와 일치하는 사례가 없었다. 바이너리에는 런타임에만 복구할 수 있는 암호화된 문자열을 포함한 수천 개의 함수가 있으며, 각각 단일 하드코딩 키 대신 고유한 복호화 파라미터를 사용한다.
이 악성코드는 클라우드 제공업체, AI 서비스, 암호화폐 플랫폼 전반에 걸친 86개의 환경 변수를 대상으로 한다. Amazon Web Services, Docker, Kubernetes, npm, 볼트 설정은 물론 Anthropic, OpenAI, Google Gemini, Cohere, Mistral, Groq, Perplexity, xAI를 포함한 AI 서비스의 API 키도 수집한다. 또한 Exodus 데스크톱 암호화폐 지갑도 대상으로 삼았지만, 공격자는 자신의 지갑 BIP-39 복구 문구를 하드코딩하여 악성코드가 이를 건드리지 못하도록 했다. JFrog는 이 지갑이 몇 센트 상당의 잔액만 있는 거의 비어있는 테스트 지갑임을 추적해냈다.
IronWorm은 Linux 커널 루트킷으로 기능하는 eBPF 페이로드를 사용하여 악성 프로세스, 파일, 네트워크 활동을 보안 시스템으로부터 숨긴다. JFrog는 커널 잠금이 활성화된 시스템에서는 프로세스 은닉 기술이 실패하여 활동이 다시 가시화된다고 지적했다. 이 악성코드는 Tor를 통해 운영자와 통신하며, 비밀 업로드, 파일 드롭, 원격 셸 실행을 위한 명령을 수신한다.
신뢰된 퍼블리싱을 통한 자가 전파
공격 체인은 "asteroiddao"라는 손상된 npm 계정으로 시작되었으며, 해당 계정은 사전 설치 훅을 통해 실행되는 Rust ELF 바이너리가 포함된 패키지 버전을 게시했다. CI 환경에서 이 악성코드는 npm의 Trusted Publishing 플로우를 악용하여 개발자의 CI 환경에서 OIDC 토큰을 획득한 후, npm 자격증명 없이도 레지스트리에 감염된 버전을 푸시했다.
악성 페이로드는 또한 기존 GitHub Actions 워크플로를 교체하여 시크릿을 수집하고, 무해해 보이는 파일에 이를 기록한 후 빌드 아티팩트로 업로드하는 버전으로 대체함으로써 데이터 유출을 위한 외부 C2 서버의 필요성을 없앴다. JFrog에 따르면 공격자는 악성 패키지를 게시한 지 하루 만에 GitHub에서 조용히 제거했다.
이 캠페인은 이전에 Trivy 보안 스캐닝 도구 및 기타 프로젝트를 감염시켜 CI/CD 시크릿을 노리는 정보탈취 악성코드를 배포했던 TeamPCP 사이버범죄 그룹이 사용한 샤이훌루드 웜과 유사하다. 그러나 IronWorm은 JavaScript 대신 Rust로 작성되어 리버스 엔지니어링이 훨씬 더 어렵다. JFrog는 IronWorm이 TeamPCP와 직접적으로 관련이 있는지, 아니면 모방범인지 "확실히 알 수 없다"고 밝혔다.
이번 공격은 개발자 환경이 공급망 손상의 주요 표적이 되었음을 보여준다. 단 한 명의 개발자를 손상시킴으로써 위협 행위자는 신뢰할 수 있는 소프트웨어 프로젝트에 악성 코드를 주입하고 수많은 하위 조직에까지 영향을 미칠 수 있다. 영향을 받았을 가능성이 있는 조직은 ocrybit 계정의 커밋을 리포지토리에서 감사하고, 손상된 계정이 접근 가능한 모든 키와 시크릿을 교체하며, 게시된 npm 패키지에서 악성 버전이 있는지 확인해야 한다고 JFrog는 조언했다.
본 문서는 정보 제공 목적으로만 작성되었으며 투자 조언을 구성하지 않습니다.