NPM 공급망 보안: safe-install 소개
Node.js 생태계는 공급망 침해 문제로 몸살을 앓고 있습니다. 패키지가 설치 중에 임의의 스크립트를 실행할 수 있는 기능은 일부 빌드 프로세스에는 필수적이지만 개발자에게는 위험한 취약점이 되어 오랫동안 중요한 공격 벡터가 되어 왔습니다. Bun과 같은 일부 현대적인 런타임은 이러한 스크립트를 제한하는 메커니즘을 도입했지만, 표준 npm 생태계는 기본적으로 여전히 대부분 개방되어 있습니다.
설치 스크립트의 과제
많은 npm 패키지는 네이티브 모듈을 컴파일하거나 초기 설정을 수행하기 위해 preinstall, postinstall, 그리고 install 스크립트를 사용합니다. 하지만 이 메커니즘은 의존성 트리 내의 모든 패키지(깊은 하위 의존성 포함)가 npm install 프로세스 중에 사용자의 머신에서 코드를 실행할 수 있도록 허용합니다. 만약 패키지가 침해되면, 악의적인 공격자는 이러한 스크립트를 사용하여 환경 변수, SSH 키를 훔치거나 빌드 파이프라인에 악성 코드를 주입할 수 있습니다.
safe-install 소개
네이티브 npm 기능의 이러한 공백을 메우기 위해, safe-install은 설치 프로세스에 세밀한 제어 수준을 제공하기 위한 경량 도구로 개발되었습니다. 이 도구는 두 가지 주요 보안 강화 기능에에 집중합니다:
1. 신뢰할 수 있는 빌드 의존성
Bun의 "trusted dependencies" 기능과 유사하게, safe-install은 개발자가 기본적으로 설치 스크립트를 비활성화하고, 빌드 또는 설치 스크립트 실행이 허용된 의존성들의 명시적인 허용 목록(allow-list)을 유지할 수 있도록 합니다. 이는 보안 모델을 "모두 허용"에서 "모두 거부, 일부만 허용"으로 전환하여 프로젝트의 공격 표면을 크게 줄여줍니다.
2. 이색적인 하위 의존성 차단
pnpm의 blockExoticSubdeps 설정에서 영감을 얻은 safe-install은 이색적인 하위 의존성(exotic sub-dependencies)을 차단하는 기능을 제공합니다. 이는 package.json에 명시적으로 선언되지 않았거나 의존성 트리에서 예상치 못한 패키지의 설치를 방지하여, 의존성 혼란(dependency confusion) 또는 악성 패키지의 은밀한 추가 위험을 완화합니다.
공급망 보안을 위한 대안적 접근 방식
safe-install이 로컬 보호를 위한 개발자 중심의 도구를 제공하는 반면, 커뮤니티 논의에서는 개발 규모에 따라 서로 다른 전략이 필요함을 강조합니다.
기업급 저장소 관리
대규모 조직의 경우, 표준 관행은 종종 "cowboy installs"에서 완전히 벗어나는 것입니다. Nexus와 Artifactory와 같은 도구는 내부 미러(mirror) 및 프록시 역할을 합니다. 이 모델에서 개발자는 공개 npm 레지스트리에서 직접 가져오지 않고, 대신 IT 부서에서 검증하고 보안 검토를 마친 패키지만이 호스팅되는 내부 저장소에서 가져옵니다.
아티팩트 미러링
단순한 유틸리티와 완전한 기업용 저장소 사이의 중간 지점을 찾는 경우, artifact-keeper와 같은 아티팩트 미러는 패키지를 게이트키핑하는 방법을 제공합니다. 이러한 도구는 어떤 패키지의 어떤 버전이 환경에 들어올 수 있는지 관리하는 더 구조화된 방식을 제공하여, 공개 레지스트리와 로컬 개발 환경 사이의 격리 계층을 제공합니다.
결론
npm 공급망을 보안하는 것은 다층적인 노력입니다. safe-install을 통한 세밀한 스크립트 제어, Artifactory에서의 엄격한 내부 미러 구현, 또는 전문화된 아티팩트 키퍼 사용 여부와 관계없이, 목표는 동일합니다: 설치 단계에서 제3자 코드에 부여하는 신뢰를 줄이는 것입니다.