Shai-Hulud 2.0: 796개 패키지를 감염시킨 자가 복제 npm 웜

긴급 보안 경고 2025년 11월 24일, 보안 연구자들은 주간 2,000만 건 이상의
다운로드를 기록하는 796개의 npm 패키지를 침해한 고도화된 자가 증식 웜을 확인했습니다. 개발 워크플로에서 npm 패키지를
사용하고 있다면 지금 바로 읽어야 합니다.
npm 생태계는 지금까지 경험한 가장 정교한 공급망 공격 중 하나를 겪었습니다. 보안 커뮤니티에서 'Shai-Hulud 2.0'이라 부르는 이 자가 증식 웜은 수백 개의 정상 패키지에 침투해 자격 증명을 탈취하고 백도어를 설치하며, 중앙 집중식 명령·제어(C&C) 인프라 없이 스스로 확산합니다.
이 공격이 특히 위험한 이유는 자율적이라는 점입니다. 한 번 감염되면 멀웨어가 자동으로 다른 패키지로 퍼져 npm 생태계 전체에 연쇄 효과를 일으킬 수 있습니다. 개발자와 보안 팀이 이 위협에 대해 알아야 할 내용을 모두 정리했습니다.
Shai-Hulud 2.0이란?
Shai-Hulud 2.0은 2025년 9월에 처음 발견된 자가 증식 npm 웜의 두 번째 버전입니다. 공격자가 제어하는 서버와 지속적으로 통신해야 하는 기존 멀웨어와 달리, 이 웜은 시스템에 감염된 뒤 자율적으로 동작하도록 설계되었습니다.
공격은 정상 npm 패키지에 두 개의 악성 파일을 주입하는 방식으로 이루어집니다:
setup_bun.js- 초기 감염 벡터bun_environment.js- 난독화된 페이로드
이 파일들은 감염된 패키지를 누군가 설치할 때마다 실행되는 악성 preinstall 스크립트에 의해 자동으로 트리거됩니다. 이상 징후를 눈치챘을 때쯤이면 이미 피해가 발생했을 수 있습니다.
공격 규모
이 공격의 숫자는 놀랍습니다:
감염된 npm 패키지
영향받은 주간 다운로드 수
침해된 GitHub 사용자
이 수치는 공개된 데이터를 바탕으로 한 하한선입니다. 실제 피해 규모는 훨씬 클 가능성이 있으며, 아직 발견되지 않은 침해된 자격 증명이 많을 수 있습니다. 이 공격은 150개 이상의 독립 GitHub 조직에 걸친 개발자에게 영향을 미쳐 광범위한 기업 노출을 보여 줍니다.
공격 메커니즘: 기술적 분석
공격 메커니즘을 이해하는 것은 탐지와 예방 모두에 매우 중요합니다. 멀웨어는 다섯 단계로 동작합니다:
단계: Bun 런타임을 이용한 회피
멀웨어가 사용하는 첫 번째 교묘한 수법은 Node.js 대신 Bun JavaScript 런타임을 설치해 사용하는 것입니다. 이는 두 가지 목적을 가집니다:
- Node.js 프로세스를 모니터링하도록 특별히 설정된 보안 모니터링 도구를 우회
- 샌드박싱·컨테이너화 대책을 우회할 수 있는 새로운 실행 환경 제공
Bun이 설치되면 멀웨어는 이를 이용해 정적 분석이 어려운 대량의 난독화된 페이로드를 실행합니다.
단계: 포괄적 자격 증명 수집
멀웨어의 정교함이 드러나는 지점입니다. 뻔한 자격 증명 파일만 찾는 것이 아니라, 가능한 한 많은 비밀 정보를 훔치기 위한 다면적 접근을 구현합니다:
노리는 자격 증명 소스:
- 로컬 파일 시스템:
.config/gcloud/application_default_credentials.json,.aws/credentials등 알려진 자격 증명 파일 스캔 - 능동적 비밀 탐색: Trufflehog를 다운로드해 실행하며 파일 시스템 전체에서 비밀 정보를 적극적으로 탐색 -클라우드 메타데이터 서비스: AWS, Azure, Google Cloud 인스턴스 메타데이터 엔드포인트에 쿼리해 임시 워크로드 자격 증명 탈취 -클라우드 비밀 저장소: AWS Secrets Manager, Azure Key Vault, Google Cloud Secret Manager에 접근해 저장된 비밀 정보 획득 -환경 변수: API 키와 토큰을 자주 포함하는 모든 환경 변수 수집
이 포괄적 접근은 개발자 노트북, CI/CD 파이프라인, 클라우드 기반 서버리스 함수 어디에서 실행되든 멀웨어가 자격 증명을 찾아내 탈취할 가능성이 높다는 뜻입니다.
단계: GitHub 기반 유출(한 수 더)
유출 메커니즘은 특히 흥미롭습니다. 멀웨어의 주요 수법은 피해자로부터 훔친 GitHub 자격 증명으로 새 공개 GitHub 저장소를 만드는 것입니다. 이 저장소에는 특징적인 표식이 있습니다 — 'Sha1-Hulud: The Second Coming'이라는 설명입니다.
그러나 여기서 교묘한 점이 있습니다. 감염된 머신에서 GitHub 자격 증명을 찾지 못해도 멀웨어는 포기하지 않습니다. 대신 GitHub에서 같은 특징적인 설명을 가진 다른 저장소를 검색해, 그 저장소에서 자격 증명을 훔쳐 자신의 유출에 활용합니다.
중요한 함의: 탈취된 자격 증명이 전혀 다른 GitHub 계정 아래에서 유출될 수 있어 탐지가 크게 어려워집니다.
단일 GitHub 사용자 계정에 여러 무관한 피해자의 데이터가 섞여 있을 수 있습니다.
단계: 지속적 접근을 위한 셀프 호스트 GitHub 러너
침해된 머신에 대한 지속적 접근을 유지하기 위해 멀웨어는 셀프 호스트 GitHub Actions 러너를 설정합니다. 특히 악랄한 이유는 다음과 같습니다:
- 정상 GitHub 인프라를 사용하므로 악성 트래픽으로 탐지하기 어려움
- 공격자가 GitHub의 정상 워크플로 기능으로 피해자 머신에서 임의 코드 실행 가능
- 인바운드 방화벽 포트를 열거나 리버스 셸을 수립할 필요 없음
- 보안 팀이 이를 정상 DevOps 자동화로 간과할 수 있음
단계: 자율적 자가 확산
Shai-Hulud 2.0을 단순 멀웨어가 아닌 진정한 웜으로 만드는 요인입니다. 개발자 머신을 침해하고 npm 자격 증명을 훔친 뒤 자동으로:
- 해당 개발자가 공개한 최대 100개 패키지 식별
- 감염된 패키지에서 자신의 악성 코드 읽기(C&C 서버 불필요!)
- 그 코드를 피해자의 다른 패키지에 주입
- 이 패키지들의 새 버전을 npm에 게시
이 자가 증식은 공격자 개입 없이 자동으로 일어나 웜이 npm 생태계 전체에서 기하급수적으로 확산할 수 있게 합니다.
최후 수단: 데이터 파괴 멀웨어가 자가 증식과 유출 모두에 실패하면 초토화 전술의 폴백이
있습니다: 사용자 홈 디렉터리 전체 삭제를 시도합니다. 이 파괴적 행동은 공격자가 접근 유지보다 자신의 흔적을 지우는 것을
우선한다는 점을 시사합니다.
피해 여부 확인 방법
조기 발견이 매우 중요합니다. 즉시 확인해야 할 주요 침해 지표(IOC)는 다음과 같습니다:
즉시 취할 조치:
- node_modules 내 악성 파일 확인: 특히 의심스러운 preinstall 스크립트와 함께 있는
setup_bun.js또는bun_environment.js를 포함한 패키지 검색. 2.GitHub에서 유출용 저장소 검색: 조직 GitHub 계정 아래 'Sha1-Hulud: The Second Coming' 설명을 가진 저장소를 찾으세요. 여기에 탈취된 자격 증명이 포함되어 있을 수 있습니다. 3.예상치 못한 GitHub 러너 확인: 조직의 셀프 호스트 러너를 점검하고 의도하지 않게 설정된 것이 없는지 확인. 4.최근 패키지 업데이트 확인: npm 패키지를 유지보수 중이라면, 특히 2025년 11월 24일 전후에 모르는 사이에 업데이트된 것이 없는지 확인. 5.클라우드 액세스 로그 확인: AWS CloudTrail, Azure 활동 로그, Google Cloud 감사 로그에서 비밀 관리 서비스나 메타데이터 서비스로의 비정상 API 호출 여부 확인.
침해 확인 시 즉시 대응 절차
피해가 확인되면 시간과의 싸움입니다. 다음 단계를 순서대로 실행하세요:
긴급 대응 체크리스트:
- 모든 자격 증명 즉시 로테이션: GitHub 토큰, npm 토큰, AWS 키, Azure 자격 증명, GCP 서비스 계정, 노출 가능성이 있는 기타 비밀 정보 모두 포함.
2.침해된 npm 토큰 폐기: npmjs.com에 로그인해 모든 인증 토큰을 폐기한 뒤 새 토큰 생성. 3.** 감염된 패키지 비공개 처리 또는 사용 중단 표시: **자신의 패키지에 백도어가 심어졌다면 최근 버전을 즉시 비공개로 전환하거나 보안 경고와 함께 사용 중단(deprecated)으로 표시.
4.셀프 호스트 GitHub 러너 삭제: 조직 GitHub에서 허가되지 않은 셀프 호스트 러너를 모두 제거. 5.유출용 저장소 삭제:'Sha1-Hulud: The Second Coming' 설명을 가진 GitHub 저장소 모두 삭제.
6.모든 시스템 스캔: 감염된 패키지를 설치했을 가능성이 있는 머신에서 포괄적 멀웨어 스캔 실행. 7.이해관계자에게 통지: 다른 사람이 사용하는 패키지를 유지보수 중이라면 침해를 공개하고 사용자에게 업데이트를 권고.
장기 예방 전략
향후 공급망 공격을 막으려면 다층 보안 접근이 필요합니다:
의존성 관리
- 락 파일 사용 및 패키지 무결성 검증
- CI/CD 파이프라인에 의존성 스캔 구현
- 의존성 정기 감사 및 최소화
- 범위 지정 대신 특정 버전 고정(pinning)
런타임 보안
- 예상치 못한 프로세스 실행(Bun 등) 모니터링
- 네트워크 아웃바운드 필터링 구현
- 패키지 설치에 샌드박스 환경 사용
- 모든 패키지 작업에 대한 감사 로그 활성화
자격 증명 관리
- 자격 증명을 평문 파일에 저장하지 않기
- 최소 권한의 단기 토큰 사용
- 비밀 로테이션 정책 구현
- 비밀 저장소 무단 접근 모니터링
모니터링 및 탐지
- 비정상 GitHub 활동에 대한 알림 설정
- 자신의 패키지 npm 게시 이벤트 모니터링
- 클라우드 환경에서 메타데이터 서비스 접근 추적
- 이상 탐지를 위한 행동 분석 구현
큰 그림:
2025년 공급망 보안
Shai-Hulud 2.0 공격은 공급망 위협의 큰 진화를 보여 줍니다. 타이포스쿼팅과 사회공학으로 악성 패키지를 게시하던 이전 공격과 달리, 이 웜은 개발자가 이미 사용 중인 정상적이고 신뢰받는 패키지를 침해합니다.
특히 우려되는 것은 이 공격의 자율적 성격입니다. 기존 멀웨어 캠페인은 공격자의 지속적 개입이 필요하지만, 자가 증식 웜은 사람 개입 없이 기하급수적으로 확산할 수 있습니다. 한 번 풀리면 완전히 억제하기는 거의 불가능합니다.
npm 생태계의 대응은 신속했습니다 — 증거에 따르면 npm은 2025년 11월 24일 UTC 오후 6시경 추가 패키지 감염을 막기 위한 대책을 시행했습니다. 그러나 이미 감염된 패키지로 인한 피해 복구에는 개발자가 의존성을 업데이트하고 침해된 자격 증명을 로테이션하는 데 수개월이 걸릴 수 있습니다.
개발 팀을 위한 핵심 교훈:
-신뢰는 이분법적이지 않다: 신뢰받는 메인테이너의 패키지도 침해될 수 있습니다. 심층 방어 전략을 구현하세요. -설치는 실행이다: 패키지 설치 스크립트는 임의 코드를 실행할 수 있습니다. npm install을 보안 관련 작업으로 취급하세요. -자격 증명이 가장 중요한 자산: 적절한 자격 증명 관리는 선택이 아닙니다 — 억제된 사고와 치명적 침해를 가르는 차이입니다. -모니터링이 생명을 구한다: 이 공격을 조기에 탐지한 조직은 견고한 모니터링 체계를 갖추고 있었습니다. 관측 가능성에 투자하세요.
결론: 진화하는 위협에 경계를 유지하라
Shai-Hulud 2.0 웜은 JavaScript 생태계 전체에 울리는 경종입니다. 796개 패키지가 침해되고 주간 2,000만 건 이상의 다운로드가 영향을 받았다는 사실은 공급망 보안을 더 이상 미룰 수 없음을 보여 줍니다.
다행히 보안 커뮤니티가 신속히 대응했고 npm도 확산 억제 조치를 취했습니다. 불행한 점은 이것이 이런 유형의 마지막 공격이 아니라는 것입니다. 패키지 생태계가 성장하고 상호 연결될수록 정교한 공격자에게 점점 더 매력적인 표적이 됩니다.
회복력의 핵심은 모든 공격을 막는 것이 아닙니다 — 그것은 불가능합니다. 대신 침해를 빠르게 탐지하고 피해를 효과적으로 억제하며 신속히 복구할 수 있는 시스템을 구축하는 것입니다. 오늘 공급망 보안에 투자하는 조직이 내일 피할 수 없는 공격에서 살아남을 조직이 됩니다.
최신 정보 확인
이 사건은 진행 중입니다. 보안 연구자들은 새로 영향받은 패키지와 침해 지표를 계속 발견하고 있습니다. npm 보안 권고를
확인하고 SNS에서 보안 연구자를 팔로우해 최신 정보를 받으세요.

