NPM, 스테이징 배포로 패키지 보안 강화 시도
NPM은 최근 발생한 Shai Hulud 공격과 같은 공급망 공격(Supply Chain Attack)을 방지하기 위해 스테이징 배포(Staged Publishing) 기능을 도입함
스테이징 배포는 `npm publish` 대신 `npm stage publish`를 사용하여 패키지를 스테이징 영역에 제출하고, 관리자의 2단계 인증(2FA)을 거쳐야 배포되도록 함
스테이징 배포는 npm CLI 버전 11.15.0 이상, Node.js 버전 22.14.0 이상에서 지원되며, 신규 패키지에는 적용 불가함
커뮤니티에서는 스테이징 배포가 선택 사항(Opt-in)이라는 점을 지적하며, 실질적인 보안 강화 효과에 대한 의문을 제기함
스테이징 배포의 작동 방식
NPM의 스테이징 배포는 패키지 배포 과정을 세 단계로 나눈다. 먼저 `npm stage publish` 명령어를 통해 패키지를 스테이징 영역에 올린다. 이후 관리자는 CLI 또는 npmjs.com에서 스테이징된 패키지를 검토하고, 2단계 인증(2FA)을 거쳐 `npm stage approve` 명령어로 배포를 승인한다. 이 과정을 통해, 잠재적인 악성 코드가 포함된 패키지가 npm 레지스트리(Registry)에 즉시 배포되는 것을 방지한다.
2단계 인증(2FA)의 중요성
스테이징 배포의 핵심은 관리자의 2단계 인증(2FA)이다. 이는 패키지 배포 권한을 가진 계정이 탈취당하더라도, 악의적인 행위자가 패키지를 배포하는 것을 막는 추가적인 방어선(Defense Line) 역할을 한다. 2FA는 CLI 또는 npmjs.com에서 모두 지원되며, 신뢰할 수 있는 게시자(Trusted Publisher)를 사용하는 경우에도 관리자의 승인이 필요하다. 이는 공급망 공격(Supply Chain Attack)의 위험을 줄이는 데 기여한다.
신규 패키지 배포 제한
스테이징 배포는 기존에 npm 레지스트리에 존재하는 패키지에만 적용 가능하다는 점에 유의해야 한다. 즉, 새로운 패키지를 처음 배포할 때는 스테이징 단계를 거칠 수 없다. 이는 스테이징 배포가 패키지 보안(Package Security)을 강화하는 데 기여하지만, 신규 패키지의 경우, 취약점(Vulnerability)을 검증할 수 있는 별도의 절차가 필요함을 시사한다.
커뮤니티의 우려와 한계점
커뮤니티에서는 스테이징 배포가 선택 사항이라는 점에 주목하며, 실질적인 보안 강화 효과에 대한 의문을 제기한다. 즉, 모든 패키지 개발자가 스테이징 배포를 사용하지 않는다면, 악성 패키지가 여전히 레지스트리에 등록될 수 있다는 것이다. 따라서 스테이징 배포의 효과는 광범위한 채택(Wide Adoption) 여부에 달려 있으며, NPM은 개발자들에게 스테이징 배포를 적극적으로 권장할 필요가 있다.