깃허브, npm v12서 '설치 스크립트 자동 실행' 기본 차단한다...깃·원격 URL 의존성도 기본 차단해 공급망 보안 강화
깃허브가 npm v12에서 의존성 설치 스크립트의 자동 실행을 기본 차단한다.
[한국정보기술신문] 깃허브(GitHub)가 자바스크립트 패키지 관리 도구 'npm'의 다음 주요 버전인 v12에서 패키지를 설치할 때 작동하던 여러 자동 기능을 기본값으로 막기로 했다. 깃허브는 6월 9일(현지시간) 변경 안내(체인지로그)를 통해, 그동안 'npm install' 명령이 별도 확인 없이 자동으로 처리하던 동작들을 v12부터는 이용자가 직접 허용해야만 작동하도록 바꾼다고 밝혔다. 핵심은 의존성(다른 사람이 만든 외부 코드 묶음)에 들어 있는 설치 스크립트가 자동으로 실행되지 않게 하는 것이다. 깃허브는 이번 변경이 모두 보안과 관련된 것이라며, 악성 코드가 끼어들 수 있는 통로를 좁히기 위한 조치라고 설명했다. npm v12는 오는 7월 출시될 것으로 예상된다.
npm은 전 세계 개발자들이 자바스크립트 프로그램을 만들 때 쓰는 코드 묶음을 내려받고 관리하는 도구다. 여기서 패키지란 다른 개발자가 미리 만들어 공개해 둔 코드 꾸러미를 말하며, 의존성은 내 프로그램이 작동하기 위해 끌어다 쓰는 이런 외부 패키지를 가리킨다. 'npm install'은 프로그램에 필요한 의존성을 한꺼번에 내려받아 설치하는 명령으로, 거의 모든 자바스크립트 개발 과정에서 가장 기본적으로 쓰인다. 이번에 바뀌는 기본값은 이미 현재 버전인 npm 11.16.0 이상에서 경고 형태로 미리 제공되고 있어, 개발자는 v12로 올리기 전에 자신의 환경을 점검해 둘 수 있다.

가장 큰 변화...설치 스크립트 자동 실행 차단
세 가지 변경 가운데 가장 큰 것은 설치 스크립트를 자동으로 실행하지 않게 한 점이다. 설치 스크립트란 패키지를 내려받아 설치하는 과정에서 함께 실행되도록 패키지 안에 미리 심어 둔 명령을 말한다. 지금까지 npm은 설치 직전·도중·직후에 정해진 스크립트('preinstall', 'install', 'postinstall')를 자동으로 실행해 왔다. v12에서는 이용자가 명시적으로 허용한 패키지가 아니면 이런 스크립트가 실행되지 않는다.
이 변경에는 'node-gyp'를 이용한 자동 빌드도 포함된다. node-gyp는 패키지가 컴퓨터에 맞춰 일부 코드를 직접 만들어 내도록 돕는 도구로, 패키지에 별도 스크립트가 없더라도 npm이 알아서 빌드를 돌려 주던 경우가 있었는데 이 또한 기본적으로 막힌다. 또 깃(Git)이나 파일·링크 방식으로 끌어온 의존성에서 자동 실행되던 'prepare' 스크립트도 같은 방식으로 차단된다.
깃허브는 차단될 항목을 미리 확인하는 방법도 함께 안내했다. 'npm approve-scripts --allow-scripts-pending' 명령을 실행하면 어떤 스크립트가 막힐지 미리 볼 수 있다. 이후 신뢰하는 패키지는 'npm approve-scripts'로 허용하고, 그렇지 않은 것은 'npm deny-scripts'로 막으면 된다. 이렇게 정한 허용 목록은 프로그램의 설정 파일인 'package.json'에 기록되며, 협업하는 동료들과 공유되도록 저장소에 함께 올려 두어야 한다고 깃허브는 설명했다.
깃·원격 URL 의존성도 기본 차단
나머지 두 변경은 외부에서 코드를 끌어오는 경로를 좁히는 데 초점이 맞춰져 있다. 먼저 v12부터는 깃 저장소에서 의존성을 가져오는 기능이 기본적으로 꺼진다. 이를 다시 쓰려면 '--allow-git'이라는 선택지를 직접 붙여야 한다. 깃허브는 이 조치가 코드가 몰래 실행되는 한 가지 통로를 막는다고 설명했다. 깃 의존성 안에 들어 있는 설정 파일('.npmrc')이 컴퓨터가 사용하는 깃 실행 파일 자체를 바꿔치기할 수 있었는데, 스크립트 실행을 막는 기존 선택지('--ignore-scripts')를 쓰더라도 이 경로는 닫히지 않았기 때문이다. 이 변경은 지난 2월 18일 한 차례 예고됐으며, npm 11.10.0 이상에서 이미 쓸 수 있다.
원격 주소에서 의존성을 가져오는 기능도 마찬가지로 기본 차단된다. 인터넷 주소(URL)에 올려 둔 압축 파일 형태의 패키지가 여기에 해당하며, 직접 끌어오든 다른 패키지를 통해 간접적으로 딸려 오든 모두 막힌다. 이 기능을 쓰려면 '--allow-remote'를 붙여 허용해야 하며, 해당 선택지는 npm 11.15.0 이상에서 제공된다. 다만 내 컴퓨터 안의 파일이나 폴더에서 패키지를 가져오는 관련 기능('--allow-file', '--allow-directory')은 이번 v12에서 기본값을 바꾸지 않는다.
왜 바꾸나...'공급망 공격' 차단이 목적
이번 조치는 이른바 '소프트웨어 공급망 공격'을 막기 위한 것이다. 공급망 공격이란 내가 직접 만든 코드가 아니라, 내가 가져다 쓰는 외부 패키지에 악성 코드를 몰래 심어 두는 수법을 말한다. 오늘날 프로그램 하나는 수백, 수천 개의 외부 패키지에 기대어 만들어지는 경우가 많은데, 그중 단 하나에라도 악성 코드가 섞여 들면 그것을 가져다 쓴 수많은 개발자와 이용자가 한꺼번에 피해를 볼 수 있다.
특히 설치 스크립트는 공격자들이 즐겨 노리는 통로로 지목돼 왔다. 패키지를 설치하기만 해도 정해진 명령이 자동으로 실행되는 만큼, 여기에 악성 명령을 끼워 넣으면 이용자가 코드를 들여다보기도 전에 피해가 발생할 수 있기 때문이다. npm은 전 세계에서 가장 널리 쓰이는 패키지 저장소인 만큼, 인기 있는 패키지가 한 번 공격당하면 그 여파가 빠르게 번지는 구조다. 그동안 보안 업계에서는 패키지 설치 단계에서 코드가 자동 실행되는 방식 자체가 위험하다는 지적이 꾸준히 제기돼 왔다.
깃허브가 v12의 변경을 모두 보안 목적으로 못 박고, '자동으로 실행되던 동작'을 '이용자가 직접 허용해야 실행되는 동작'으로 바꾼 것도 이런 위험을 줄이기 위한 것으로 풀이된다. 다만 기존 방식에 맞춰 작업 환경을 꾸려 온 개발자라면, 설치 과정에서 꼭 필요했던 스크립트까지 막혀 한동안 추가 점검이 필요할 수 있다. 깃허브가 v12 출시에 앞서 현재 버전부터 경고를 띄워 미리 점검하도록 한 것도 이런 혼란을 줄이려는 조치로 보인다.
어떻게 대비하나...11.16.0으로 올려 경고 점검
깃허브는 개발자가 v12 출시 전에 대비할 수 있는 방법도 안내했다. 먼저 npm을 11.16.0 이상으로 올린 뒤 평소처럼 설치를 한 차례 실행하고, 그 과정에서 나타나는 경고를 살펴보면 된다. 이어 'npm approve-scripts --allow-scripts-pending' 명령으로 어떤 패키지가 스크립트를 갖고 있는지 확인하고, 그중 믿을 수 있는 것만 허용한 다음 갱신된 package.json 파일을 저장소에 올려 두면 된다.
이렇게 해 두면 v12로 올린 뒤에도 미리 허용해 둔 스크립트만 계속 실행되고, 허용하지 않은 스크립트는 더 이상 작동하지 않는다. 깃허브는 'npm approve-scripts'와 'npm deny-scripts' 명령, 그리고 'npx'나 전역 설치에 적용되는 설정과 관련한 자세한 내용을 공식 문서에서 확인할 수 있다고 밝혔다. 아울러 이번 변경에 대한 의견과 질문은 커뮤니티 토론 게시판에서 받고 있다고 덧붙였다.
한국정보기술신문 정보보안분과 안서진 기자 news@kitpa.org











