node_modules, 안전할까? npm 공급망 공격의 모든 것
2025년 npm 생태계에서 발생한 3번의 대규모 공급망 공격으로 인해 수십억 건의 다운로드(Billions of Downloads)가 노출됨
공격자들은 피싱(Phishing) 공격, 토큰 탈취(Token Theft), 웜(Worm) 감염 등 다양한 방식으로 악성 코드를 배포함
npm은 토큰 만료, 2FA 의무화, 권한 범위 제한(Scoped Permissions) 등 보안 강화 조치를 시행함
3일 딜레이(3-Day Delay), 종속성 감사(Dependency Audit), 잠금 파일(Lock Files) 사용 등 실질적인 보안 방어 전략 제시
2026년에는 공격 고도화가 예상되므로, 지속적인 보안 업데이트(Security Updates)와 선제적 방어(Proactive Defense)가 중요함
npm 공급망 공격의 심각성
2025년 npm 생태계에서 발생한 일련의 공급망 공격은 개발자 계정 탈취(Credential Theft), 암호화폐 탈취(Cryptocurrency Theft), 웜(Worm) 감염 등 심각한 피해를 야기했다.
S1ngularity: GitHub Actions 토큰 탈취를 통해 2,349개의 개발자 계정 정보 유출
Chalk/Debug: 피싱 공격으로 26억 건의 주간 다운로드(Weekly Downloads)를 가진 핵심 패키지(Core Packages)가 악성 코드에 노출
Shai-Hulud 2.0: 자기 복제 웜(Self-replicating Worm)으로 1억 3,200만 건의 월간 다운로드(Monthly Downloads)를 기록하며 생태계 전반에 걸쳐 기하급수적인 피해를 입힘
이러한 공격은 npm 생태계의 취약한 의존성 관리(Vulnerable Dependency Management)와 중앙 집중식 신뢰 모델(Centralized Trust Model)의 문제점을 드러냈다.
node_modules의 취약성 분석
node_modules 폴더는 과도한 크기(Size)와 복잡성(Complexity)으로 인해 공격자에게 매력적인 표적이 된다.
평균 프로젝트: 6개의 직접 의존성(Direct Dependencies) → 28개의 전이 의존성(Transitive Dependencies)
node_modules 폴더 크기: 256MB ~ 700MB (일반적)
프로젝트 내 패키지 수: 1,000개 이상
npm은 설치 시 `preinstall` 및 `postinstall` 스크립트를 실행하여 악성 코드 실행(Malicious Code Execution)의 기회를 제공한다. 또한, JavaScript의 부실한 표준 라이브러리(Poor Standard Library)로 인해 작은 기능 구현에도 외부 패키지를 사용해야 하는 상황이 발생하여 공격 표면(Attack Surface)이 넓어진다.
npm의 대응 및 보안 강화 방안
npm은 2025년 공격 이후 보안 강화를 위한 다양한 조치를 시행했다.
기존 토큰(Classic Tokens) 폐기 및 세션 기반 인증(Session-based Auth) 도입
게시 토큰(Publish Tokens)에 대한 2단계 인증(2FA) 의무화
권한 범위가 제한된 토큰(Granular Access Tokens) 도입 및 90일 만료 기한 설정
이러한 조치 외에도, 개발자는 3일 딜레이(3-Day Delay), 종속성 감사(Dependency Audit), 잠금 파일(Lock Files) 사용, 토큰 범위 제한(Scoped Tokens) 등 실질적인 보안 방어 전략을 적용해야 한다.
공급망 공격 방어를 위한 실질적인 방법
공격으로부터 안전해지기 위해, 개발자는 다음과 같은 실질적인 방어 전략을 적극적으로 활용해야 한다.
3일 딜레이(3-Day Delay): 신규 패키지 설치를 3일간 유예하여 악성 코드 배포 후 탐지 및 제거 기간 확보
종속성 감사(Dependency Audit): `npm audit`를 통해 알려진 취약점(Vulnerabilities)을 검사하고, `npx depcheck`로 사용하지 않는 종속성(Unused Dependencies)을 제거
잠금 파일(Lock Files) 사용: `package-lock.json` 또는 `yarn.lock` 파일을 커밋하여 정확한 버전의 패키지를 설치
토큰 범위 제한(Scoped Tokens): 패키지 게시 권한을 특정 패키지로 제한하여 공격 확산 방지
GitHub 계정 모니터링: 의심스러운 리포지토리(Repositories) 및 커밋(Commits) 감시
SBOM(Software Bill of Materials) 도구 활용: GitLab Dependency Scanning, GitHub Dependabot, Snyk, Socket 등을 통해 지속적인 취약점 모니터링 수행
기업 환경에서의 공급망 보안 강화
기업 환경에서는 앞서 언급한 모든 보안 조치와 더불어, 더욱 강화된 보안 전략을 수립해야 한다.
프라이빗 npm 레지스트리(Private npm Registry) 구축: 보안팀의 검증을 거친 패키지만 내부적으로 사용
자동화된 공급망 모니터링(Automated Supply Chain Monitoring): Snyk, Socket 등 전문 도구를 활용하여 지속적인 보안 위협 감지
이러한 전략을 통해 기업은 공격 표면(Attack Surface)을 최소화하고, 공급망 공격(Supply Chain Attacks)의 위험을 효과적으로 관리할 수 있다. 2026년에는 공격이 더욱 고도화될 것으로 예상되므로, 지속적인 보안 업데이트와 선제적 방어가 필수적이다.