요약 / 핵심 포인트
NPM 공격 벡터가 활짝 열려 있습니다
소프트웨어 공급망 공격은 극적으로 증가하여 개발 인프라를 직접 표적으로 삼는 정교한 캠페인으로 발전했습니다. 위협 행위자들은 이제 CI/CD 파이프라인에 침투하도록 특별히 설계된 "Shai-Hulud" 웜과 같은 고급 전술을 배포합니다. 이러한 캠페인은 빌드 환경을 손상시키고 자격 증명을 훔쳐 공격자에게 조직 내에서 깊고 지속적인 접근 권한을 부여하는 것을 목표로 합니다.
공격자들은 주로 AWS, GitHub 또는 npm과 같은 민감한 토큰을 유출하는 것을 목표로 합니다. 이러한 토큰은 클라우드 리소스, 코드 저장소 및 사용자 데이터에 대한 특권 접근 권한을 부여합니다. 그들은 널리 사용되는 패키지를 하이재킹하거나 악성 유사 패키지를 배포하는 등 다양한 교활한 방법을 통해 이를 달성합니다. 이 타이포스쿼팅 전략은 개발자들이 손상된 종속성을 설치하도록 속이며, 이는 종종 합법적인 것과 구별하기 어렵습니다.
JavaScript 생태계의 거대한 규모는 비할 데 없는 공격 표면을 제공하며, 광범위한 침해에 대한 거부할 수 없는 표적이 됩니다. 생태계의 기본 패키지 관리자인 npm은 현재 250만 개 이상의 패키지를 호스팅하고 매주 수십억 건의 다운로드를 처리합니다. 이러한 엄청난 상호 연결성은 단일 손상된 종속성 또는 악성 패키지가 전 세계적으로 수많은 프로젝트와 조직을 빠르게 감염시켜 치명적인 보안 침해로 이어질 수 있음을 의미합니다.
30초의 유예 기간
npm 공급망 공격의 홍수에 맞서는 놀랍도록 간단하면서도 강력한 방어책이 있습니다: 바로 최소 패키지 출시 기간을 구현하는 것입니다. 이 "유예 기간"은 배포 비용이 들지 않으면서도 상당한 보호를 제공하는 저렴하고 효과적인 보안 조치 역할을 합니다. 이는 새로 게시된 코드의 즉각적인 설치를 방지하며, 이는 초기 침해의 일반적인 벡터입니다.
작동 방식은 다음과 같습니다. npm, pnpm 또는 Bun과 같은 패키지 관리자는 방금 게시된 버전이 아닌, 사용자의 기간 요구 사항을 충족하는 최신 패키지 버전을 가져옵니다. 예를 들어, 24시간 최소 기간을 설정하면 빌드 시스템은 해당 일 내에 출시된 모든 패키지를 무시합니다. 이는 새로운, 검증되지 않은 릴리스에 대한 가장 취약한 기간을 우회하여 중요한 지연을 보장합니다.
이 간단한 구성은 신속한 "스매시 앤 그랩" 사건에 매우 효과적입니다. 이는 중요한 시간 버퍼를 생성하여 보안 도구, 자동 스캐너 및 경계하는 오픈 소스 커뮤니티가 악성 패키지가 환경을 감염시키기 전에 발견하고 플래그를 지정할 수 있도록 합니다. pnpm은 심지어 기본 최소 출시 기간을 1일로 설정하여 다른 사람들이 모방해야 할 강력한 기준을 제시합니다.
잠금 설정: npm, pnpm 및 Bun용 코드
최소 출시 기간을 구현하는 것은 신속하고 영향력 있는 보안 업그레이드를 제공합니다. 이 적은 노력의 변경은 새로운 악성 패키지에 대한 노출을 크게 줄입니다. 인기 있는 JavaScript 패키지 관리자 전반에 걸쳐 설정을 잠그는 방법은 다음과 같습니다.
npm의 경우, 전역 `.npmrc` 파일에 `min-release-age`를 적용하십시오. `min-release-age=7`로 설정하면 새 패키지를 설치하기 전에 7일간의 보류 기간이 적용되며, 이는 위협을 탐지하는 데 중요한 기간입니다. 이 필수적인 보호 기능을 활용하려면 npm CLI 버전이 11.10.0 이상인지 확인하십시오.
pnpm은 `pnpm-workspace.yaml` 또는 전역 설정에서 `minimumReleaseAge`를 구성하지만, 값을 분 단위로 지정합니다. 7일 지연을 위해서는 `minimumReleaseAge: 10080`이 필요합니다. 특히, pnpm은 24시간의 강력한 기본 쿨다운을 설정하여 선제적 보안을 선도하고 있습니다. 자세한 내용은 Mitigating supply chain attacks | pnpm에서 확인하세요.
Bun은 생태계의 일관성을 따르지 않고 `minimumReleaseAge`에 초 단위를 사용합니다. 7일 지연을 위해 `bunfig.toml`의 `[install]` 섹션 아래에 `minimumReleaseAge = 604800`을 추가하세요. npm, pnpm, Bun 간의 이러한 단위 불일치는 특이하지만 사소한 개발자 마찰 지점을 강조합니다.
이 간단한 구성은 설치 시 검증된 안정적인 버전을 선호하도록 하여, 초기 supply chain attacks에 대한 위험 프로필을 대폭 줄여줍니다.
이것은 만능 해결책이 아닙니다
최소 릴리스 연령은 기회주의적인 supply chain attacks의 상당 부분을 차단하는 강력하고 적은 노력으로 가능한 방어책을 제공합니다. 그러나 이 중요한 설정은 견고하고 다각적인 보안 전략 내에서 하나의 계층으로만 기능합니다. 어떤 단일 구성도 소프트웨어 supply chain attacks의 동적인 위협 환경에 대한 완전한 해결책이 될 수 없습니다.
개발자는 이 방어책을 여러 다른 필수적인 관행과 통합해야 합니다. 모든 설치가 동일한 종속성 트리를 생성하여 비결정적 빌드를 방지하도록 항상 lockfiles (예: `package-lock.json`, `pnpm-lock.yaml`)를 커밋하고 사용하십시오. 결정적으로, 모든 CI/CD pipelines에서 `npm ci`를 실행하십시오. 이 명령은 lockfile에서 직접 클린 설치를 수행하여 패키지 해결을 우회하고 정확하고 반복 가능한 종속성 설치를 보장합니다. 또한, Snyk 또는 `npm audit`과 같은 도구를 사용하여 알려진 취약점에 대해 프로젝트 종속성을 정기적으로 감사하여 위험을 식별하고 해결하십시오.
개별 프로젝트 구성 외에도, 더 광범위한 생태계 수준의 보안 강화가 필수적입니다. GitHub와 같은 플랫폼은 의무적인 FIDO-based 2FA 및 OpenID Connect (OIDC)를 통한 trusted publishing 채택을 포함하여 더 강력한 개발자 계정 보안을 적극적으로 추진하고 있습니다. 이러한 이니셔티브는 많은 supply chain attacks의 주요 벡터인 손상된 개발자 계정 및 도난당한 자격 증명을 직접적으로 다룹니다. 소스에서 무단 패키지 업로드를 방지함으로써, 이러한 발전은 전체 오픈소스 생태계의 보안 태세를 크게 향상시킵니다.
자주 묻는 질문
npm packages의 최소 릴리스 연령이란 무엇인가요?
이는 패키지 관리자가 설정된 기간(예: 7일) 동안 새로 출시된 패키지 버전을 설치하지 못하도록 하여, 최근에 게시된 악성 코드를 피하는 보안 설정입니다.
패키지 설치를 지연하는 것이 좋은 보안 조치인 이유는 무엇인가요?
대부분의 악성 패키지는 몇 시간 또는 며칠 내에 발견되어 레지스트리에서 제거됩니다. 지연, 즉 "쿨다운 기간"은 이 중요한 고위험 기간 동안 해당 패키지를 설치하지 않도록 보장합니다.
모든 주요 패키지 관리자가 이 기능을 지원하나요?
네. npm은 `min-release-age`(일)를 사용하고, pnpm은 `minimumReleaseAge`(분)를 사용하며, Bun은 `minimumReleaseAge`(초)를 사용하고, Yarn은 `npmMinimalAgeGate`를 사용합니다.
설정하기에 좋은 릴리스 연령은 얼마인가요?
보수적인 접근 방식으로는 7일이 일반적으로 권장됩니다. pnpm은 이제 기본적으로 24시간으로 설정되어 있으며, 이는 대부분의 "스매시 앤 그랩" 공격을 방지하기 위한 강력한 기준이기도 합니다.