1P by GN⁺ 10일전 | ★ favorite | 댓글 1개
  • 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+0go-templateAsyncAPI 관련 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 알고리즘과 관련이 없고, 이름도 그런 패러디 의도는 아님이라고 설명함