FlawOpen

flawopen.com/Incidents/shai-hulud-npm-worm-september-2025

● npm ecosystem · CWE-506 / CWE-829 · September 2025 · 심각
보안 연구 · FlawOpen

Shai-Hulud: 2025년 9월 npm 웜과 설치 시점의 신뢰

2025년 9월 Shai-Hulud는 침해된 npm 유지관리자 계정과 악성 postinstall 훅을 이용해 자격 증명을 훔치고 감염된 패키지를 추가로 게시했습니다.[1]

💡 알기 쉬운 설명 (ELI5)

공장이 부품 상자를 받았는데 개봉 지침이 자동으로 실행된다고 생각해 보세요. 그 지침은 공장의 배송 출입증을 복사해 다른 공장으로 조작된 상자를 보냅니다. 자동 지침을 막으면 그 진입로는 닫히지만, 부품도 사용 전에 살펴야 합니다.[1]

핵심 개념 및 용어

Lifecycle hook
9월에는 npm postinstall이 설치 중 악성 코드를 실행했습니다. 이는 패키지가 제공한 동작이며 CVE가 붙은 npm 메모리 오류가 아닙니다.
Publishing credential
npm 토큰에는 계정이나 패키지에 설정된 권한이 있습니다. 도난당한 게시 권한이 확산에 쓰였으며 기간, 범위, MFA 요구는 정책에 달려 있습니다.
Trusted publishing / OIDC
OIDC는 승인된 CI 작업이 저장된 npm 토큰 없이 짧은 수명의 게시 자격을 얻게 합니다. 침해된 승인 작업은 여전히 위험합니다.

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 CWE 참조: CWE-506 CWE-829

사고 타임라인

2025-09-14

GitHub는 Shai-Hulud 통지를 받았다고 밝혔습니다.[1]

2025-09-22

GitHub는 침해된 패키지 500개 이상을 제거하고 악성 지표에 맞는 업로드를 차단했다고 보고했습니다.[1]

단계별 공격 실행 흐름

단계 1

변조된 출시

유지관리자 계정으로 수정된 패키지가 게시됐습니다. 피싱은 초기 침해에 관한 가설이며 모든 계정에서 확인된 원인이 아닙니다.[1], [2]

단계 2

설치 시 실행

9월 postinstall은 개발자 또는 CI 권한으로 실행됐습니다. 11월 preinstall 동작을 이 시기로 소급하면 안 됩니다.[1], [3], [2]

단계 3

자격 증명 노출

악성 코드는 설정과 환경에서 npm, GitHub, 클라우드 자격 증명을 찾았습니다. 게시 토큰만 위험한 것은 아니었습니다.[1], [2]

단계 4

복제

도난당한 게시 권한으로 피해자가 관리하는 다른 패키지도 수정해 새 버전으로 게시할 수 있었습니다.[1], [2]

소스 코드 비교: 취약한 구현 vs 보안 패치

안전한 Python 설치 계획 비교입니다. 어느 함수도 npm을 실행하거나 자격 증명을 읽거나 레지스트리에 접속하지 않습니다. npm v10 문서를 기준으로 합니다. 강화 계획은 검토된 잠금 파일을 요구하고 수명주기 스크립트를 막으며 기존 환경을 넘기지 않습니다. 실제 실행기는 신뢰할 수 있는 npm 프로그램과 격리된 홈 및 설정을 준비하고 비밀 파일이나 민감한 마운트를 두지 않아야 합니다. --ignore-scripts는 이후 가져온 코드나 명시적으로 실행한 스크립트를 안전하게 만들지 않으며 잠금 파일도 무해함을 증명하지 않습니다.

취약한 구현
def install_plan(reviewed_lockfile, inherited_env):
    # 계획만 반환하며 패키지를 설치하거나 명령을 실행하지 않습니다.
    return {"argv": ["npm", "ci"],
            "env": dict(inherited_env)}
보안 강화 패치
def install_plan(reviewed_lockfile, inherited_env):
    # 계획만 반환하며 패키지를 설치하거나 명령을 실행하지 않습니다.
    if reviewed_lockfile is not True:
        raise ValueError("Review the lockfile before installation")
    return {"argv": ["npm", "ci", "--ignore-scripts"],
            "env": {}}

엔지니어링 및 시스템 보안 강화 체크리스트

출처