Shai Hulud가 두 번째 공급망 공격을 개시
(aikido.dev)- Shai Hulud 2.0이 npm 생태계를 다시 공격하며 Zapier, ENS Domains, AsyncAPI, PostHog, Postman 등 주요 프로젝트의 패키지를 감염
- 악성코드는 설치 과정 중 자동 실행되어 개발자 시스템과 클라우드 환경의 비밀정보 탈취
- 감염된 시스템에서 TruffleHog를 이용해 API 키, 토큰, 비밀번호 등을 찾아 공개 GitHub 저장소에 업로드
- 이번 공격은 이전보다 확장되어 최대 100개 패키지 감염, 인증 실패 시 홈 디렉터리 파일 삭제 기능 포함
- npm 생태계의 신뢰 체계를 위협하는 대규모 공급망 공격으로, 모든 개발팀의 비밀정보 점검 및 교체 필요성 부각
Shai-Hulud 캠페인 개요
- Shai-Hulud는 npm 생태계에서 자가 복제되는 웜 형태의 악성코드로, 감염된 개발 환경을 통해 빠르게 확산
- 감염 시 TruffleHog를 사용해 API 키, 토큰 등 노출된 비밀정보를 검색
- 수집된 정보는 공개 GitHub 저장소로 전송되며, 이후 새로운 악성 패키지를 npm에 게시해 확산
- 공격자는 이번 공격을 “Second Coming” 이라 명명
- npm이 12월 9일 구형 토큰 폐기를 예고한 시점에 맞춰 공격이 재개됨
공격 타임라인
- 8월 27일: S1ngularity 캠페인 보고서 공개
- 9월 16일: 첫 번째 Shai-Hulud 공격 발생
- 9월 18일: 기술 분석 및 페이로드 동작 보고
- 11월 24일: npm 토큰 폐기 직전 두 번째 공격(Second Coming) 발생
공격 방식의 변화
- 이번 공격은
setup_bun.js파일을 통해 Bun 런타임을 설치하고, 이후bun_environment.js를 실행 - 무작위 이름의 GitHub 저장소를 생성해 탈취 데이터를 업로드
- 감염 대상 패키지 수가 20개에서 100개로 증가
- GitHub 또는 npm 인증 실패 시 사용자 홈 디렉터리 전체 삭제 기능 포함
감염된 패키지
- 총 492개 npm 패키지가 감염되었으며, 월간 다운로드 수는 1억 3,200만 회에 달함
- 주요 피해 프로젝트: Zapier, ENS Domains, AsyncAPI, PostHog, Postman, Browserbase
- 예시 패키지:
@zapier/zapier-sdk,@ensdomains/ensjs,@asyncapi/cli,posthog-js,@postman/pm-bin-linux-x64등
비밀정보 유출
- 악성코드는 “Sha1-Hulud: The Second Coming” 설명이 포함된 GitHub 저장소에 비밀정보를 업로드
- 현재까지 26,300개 이상의 저장소가 노출된 것으로 확인
공격자의 실수
- 일부 패키지에는
setup_bun.js만 포함되고bun_environment.js가 누락되어 웜이 완전 실행되지 않음 - 이로 인해 공격 확산 범위가 제한됨
감염 경로 및 최초 감염 지점
- 최초 감염은 2025년 11월 24일 03:16:26 GMT+0에
go-template및 AsyncAPI 관련 36개 패키지에서 시작 - 이후 PostHog(04:11:55) , Postman(05:09:25) 순으로 확산
- AsyncAPI CLI 저장소에서 악성 브랜치 생성 후 배포된 코드가 확인됨
잠재적 영향
- 설치 시 자동 실행되어 개발자 로컬 환경, 빌드 시스템, 클라우드 자격증명에 접근 가능
- 탈취된 비밀정보를 통해 추가 계정 침해 및 악성 패키지 게시 가능성
- npm 생태계의 신뢰 기반 공급망 보안에 심각한 위협
보안 대응 권고
- Zapier 및 ENS 관련 npm 의존성 전수 점검
- GitHub, npm, 클라우드, CI/CD 비밀정보 전면 교체
- GitHub에서 “Sha1-Hulud: The Second Coming” 설명이 있는 저장소 탐색
- CI 환경에서 npm
postinstall스크립트 비활성화 - 패키지 버전 고정 및 MFA 활성화, Safe-Chain 등 도구로 악성 패키지 차단
결론
- Shai-Hulud 2.0은 npm 공급망을 겨냥한 대규모 재공격으로,
수백 개의 인기 패키지와 수천 개의 GitHub 저장소가 영향을 받음 - 모든 개발팀은 의존성 검증, 비밀정보 교체, 자동 설치 스크립트 차단을 즉시 수행해야 함
Hacker News 의견
-
Bubblewrap(bwrap) 을 언급할 만함. 이 도구는 npm/node 환경에서 발생할 수 있는 대부분의 공격 벡터를 제거하거나, 최소한 임의 코드 실행 시 피해를 제한할 수 있음
완벽한 해결책은 아니지만, 간단한 래퍼 스크립트와 함께 쓰면 rootless Podman 컨테이너보다 훨씬 낫다고 생각함
Bubblewrap GitHub 링크 -
Python으로 작성된 스크립트를 공유함. 이 스크립트는 내 저장소 중 pnpm이나 npm lock 파일에 손상된 패키지가 포함되어 있는지 확인해줌
스크립트 링크 -
처음엔 중복(Dup)으로 보였지만, 실제로는 다른 기사였음
관련 링크- 관련 댓글들을 하나로 병합했다고 설명함. 링크가 다르더라도 토론 주제가 실질적으로 같으면 병합 기준에 부합함. 두 번째 링크에 추가 정보가 있어서 원문 상단에 함께 표시했다고 함
- 이 기사에는 추가 정보가 꽤 많다고 언급함
- 같은 링크의 재제출에는 “Dup”, 다른 링크지만 같은 사건에 대한 글에는 “See also”를 쓰라고 제안함
- 중복이 아니라, 같은 사건을 다루지만 내용이 다른 기사라고 강조함
- 참고용으로 Shai-Hulud Returns: Over 300 NPM Packages Infected (helixguard.ai)을 함께 제시함
-
중복 토론은 여기서 진행 중이라고 안내함
-
제목에 오타가 있다고 지적함. 현재 HN 제목은
SHA1-Hulud the Second Comming – Postman, Zapier, PostHog All Compromised via NPM
이지만, 올바른 표기는 Shai-Hulud임- 하지만 실제로 비밀정보가 업로드된 저장소 이름은
Sha1-Hulud: The Second Coming이라서 혼동이 생긴 듯함 - 웜 자체가 GitHub에
sha1-hulud라는 이름으로 비밀을 게시하고 있음
관련 GitHub 검색 링크 - “coming”의 철자도 m이 하나만 있어야 함이라며, 혹시 의도된 말장난인지 묻는 의견도 있음
- 다운보트 이유를 모르겠다고 하며, 실제 공격은 SHA1 알고리즘과 관련이 없고, 이름도 그런 패러디 의도는 아님이라고 설명함
- 하지만 실제로 비밀정보가 업로드된 저장소 이름은