한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 · 정보보안 ·

NPM 공급망 공격 막는 'safe-npm' 오픈소스 공개...90일 이상 검증된 패키지만 설치

발행일
읽는 시간3분 14초

새로 해킹된 NPM 패키지 자동 차단하는 보안 도구 등장, 기본 90일 검증 기간 적용

[한국정보기술신문] NPM 생태계의 공급망 공격을 차단하는 새로운 오픈소스 도구가 공개됐다. 'safe-npm'으로 명명된 이 도구는 일정 기간 동안 공개된 패키지 버전만 설치하도록 제한해 갑작스러운 패키지 해킹으로부터 프로젝트를 보호한다.

개발자 Kevin Slin이 공개한 safe-npm은 NPM 패키지 설치 시 기본 90일 이상 공개된 버전만 설치하는 방식으로 작동한다. 이는 보안 커뮤니티가 악성 릴리스를 발견하고 보고할 수 있는 충분한 시간을 확보하기 위한 조치다.

NPM 공급망 공격은 최근 급증하는 보안 위협이다. 공격자들은 주로 관리자 자격 증명을 탈취하거나, 인기 패키지에 악성 업데이트를 게시하거나, 방치된 패키지를 장악하는 방식으로 공격을 감행한다. 이러한 공격은 대부분 갑작스럽게 발생하며, 어제까지 안전했던 패키지가 오늘 해킹될 수 있다는 점에서 위험성이 크다.

작동 원리와 주요 기능

safe-npm은 패키지 설치 과정에서 여러 단계의 검증을 거친다. 먼저 package.json 파일이나 명령줄 인수에서 의존성을 읽어들인 후, NPM 레지스트리를 조회해 사용 가능한 모든 버전을 확인한다. 이후 최소 기간 임계값보다 최근에 게시된 버전을 필터링하고, 시맨틱 버저닝 요구사항과 기간 요구사항을 모두 충족하는 최신 버전을 선택해 설치한다.

예를 들어 개발자가 react 버전 18 이상을 요구했는데 악성 코드가 포함된 react 18.5.0 버전이 어제 게시됐다면, safe-npm은 최소 90일 이전에 공개된 최신 버전을 대신 설치한다. 이를 통해 해킹된 패키지가 프로젝트에 유입되는 것을 원천적으로 차단할 수 있다.

도구는 다양한 설정 옵션을 제공한다. 최소 기간 요구사항은 기본 90일이지만 사용자가 자유롭게 조정할 수 있다. 최대 보안이 필요한 프로덕션 시스템에서는 180일로 늘리고, 새로운 기능이 필요하면서 약간의 위험을 감수할 수 있다면 30일로 줄일 수 있다.

세밀한 제어 옵션

특정 패키지를 기간 요구사항에서 제외하는 기능도 있다. 타입스크립트나 빌드 도구처럼 신뢰할 수 있고 빠르게 발전하는 패키지, 조직 내부 패키지, 긴급하게 최신 기능이 필요한 패키지 등을 ignore 옵션으로 지정할 수 있다. 이 경우 해당 패키지는 시맨틱 버저닝 범위는 준수하되 최소 기간은 무시한다.

strict 모드를 활성화하면 기간 요구사항을 충족하는 버전으로 해결할 수 없는 의존성이 하나라도 있을 경우 오류를 발생시킨다. 이는 CI/CD 파이프라인에서 문제가 있는 패키지를 건너뛰기보다 빌드를 실패시키고 싶을 때, 또는 확실성이 필요한 프로덕션 배포 상황에서 유용하다.

개발 의존성과 프로덕션 의존성을 구분해 처리하는 기능도 제공된다. dev 옵션으로 개발 의존성만 설치하거나, prod-only 옵션으로 프로덕션 의존성만 설치할 수 있다. 이를 통해 개발 도구와 프로덕션 코드에 서로 다른 기간 정책을 적용할 수 있다.

dry-run 모드는 실제 변경 없이 어떤 버전이 설치될지 미리 확인할 수 있게 해준다. 설정을 테스트하거나 사용 가능한 버전을 파악하고, 프로덕션 시스템에 변경을 가하기 전에 활용할 수 있다.

실제 활용 사례

실제 공격 시나리오를 살펴보면 safe-npm의 효용성이 명확해진다. 인기 패키지의 관리자 자격 증명이 탈취돼 공격자가 악성 코드가 포함된 새 버전을 게시했다고 가정하자. 일반적인 설치 방식을 사용하는 프로젝트는 즉시 악성 버전을 설치하게 된다. 하지만 safe-npm을 사용하면 90일 이전에 공개된 최신 버전을 계속 사용하게 되고, 그 사이 보안 연구자들이 해킹을 발견해 보고하면 악성 버전이 제거된다. 결과적으로 해킹된 버전을 설치하지 않게 되는 것이다.

CI/CD 파이프라인에서는 strict 모드와 함께 120일 이상의 기간 요구사항을 설정해 어떤 패키지도 요구사항을 충족하지 못하면 빌드를 실패시킬 수 있다. 또는 프로덕션 의존성에만 엄격한 정책을 적용하고 개발 의존성은 더 유연하게 허용할 수도 있다.

긴급하게 특정 패키지를 업데이트해야 하는 상황에서는 해당 패키지를 ignore 목록에 추가해 일시적으로 기간 요구사항을 우회할 수 있다. 이는 중요한 보안 패치가 포함된 패키지를 즉시 적용해야 할 때 유용하다.

한계와 보안 전략

개발자는 safe-npm의 한계도 명확히 밝히고 있다. 처음부터 악성이었던 패키지는 보호할 수 없고, 합법적인 새 기능과 버그 수정에 대한 접근이 지연되며, 오래된 버전에 발견되지 않은 취약점이 없다는 신뢰가 필요하다. 또한 기간 기반 필터링은 경험적 방법일 뿐 절대적 보장은 아니다.

보안은 상충 관계에 관한 것이라고 개발자는 설명한다. safe-npm은 최신 업데이트를 갑작스러운 공급망 해킹으로부터의 보호와 맞바꾸는 것이다. 이는 심층 방어 전략의 한 계층일 뿐이며, 정기적인 보안 감사, 새 패키지 추가 전 의존성 검토, 보안 권고 모니터링, 락 파일 사용, 샌드박스나 컨테이너 환경 실행 등과 함께 사용돼야 한다.

도구는 NPM을 통해 전역으로 설치할 수 있으며, Node.js 버전 18 이상을 요구한다. ISC 라이선스로 공개돼 있어 자유롭게 사용할 수 있다. 소스 코드는 GitHub에서 확인할 수 있으며, 테스트 스위트도 포함돼 있어 개발자들이 직접 검증하고 기여할 수 있다.

NPM 생태계의 보안이 점점 더 중요해지는 상황에서 safe-npm은 개발자들에게 실용적인 방어 수단을 제공한다. 완벽한 해결책은 아니지만, 공급망 공격의 위험을 크게 낮출 수 있는 효과적인 도구로 평가된다.

한국정보기술신문 정보기술분과 강민규 기자 news@kitpa.org

한국정보기술신문