공급망 공격 완화하기

때때로 npm 패키지가 손상되어 악성 코드와 함께 게시되는 경우가 있습니다. 다행히 Socket, Snyk, Xygeni, Aikido와 같은 회사들이 이렇게 손상된 패키지를 조기에 탐지합니다. 보통 npm 레지스트리는 몇 시간 내에 영향을 받은 버전을 제거합니다. 하지만 악성 코드가 게시된 시점과 탐지된 시점 사이에는 항상 시간 간격이 있으며, 그동안 위험에 노출될 수 있습니다. 다행히 pnpm으로 위험을 최소화하기 위해 할 수 있는 일들이 있습니다.

위험한 postinstall 스크립트 차단하기#

지금까지 대부분의 손상된 패키지는 설치 즉시 코드를 실행하기 위해 postinstall 스크립트를 사용했습니다. 이를 완화하기 위해 pnpm v10은 종속성의 postinstall 스크립트 자동 실행을 비활성화합니다. dangerouslyAllowAllBuilds를 사용해 전역적으로 다시 활성화하는 설정이 있지만, allowBuilds를 사용해 신뢰할 수 있는 종속성만 명시적으로 나열하는 것을 권장합니다. 이렇게 하면 과거에 빌드가 필요하지 않았던 종속성의 손상된 버전이 게시되더라도 갑자기 악성 스크립트를 실행하지 않습니다. 그래도 postinstall 스크립트가 있는 신뢰할 수 있는 패키지를 업데이트할 때는 it might get compromised 때문에 주의하는 것을 권장합니다.

특이한 전이 종속성 방지하기#

blockExoticSubdeps를 true로 설정하면 전이 종속성이 특이한 소스(git 저장소나 직접 tarball URL 등)를 사용하지 못하도록 막을 수 있습니다. 이렇게 하면 모든 전이 종속성이 신뢰할 수 있는 소스에서 해석되므로 공급망 공격의 위험이 줄어듭니다.

종속성 업데이트 지연하기#

손상된 패키지를 설치할 위험을 줄이는 또 다른 방법은 종속성 업데이트를 지연하는 것입니다. 악성 코드는 보통 빠르게 탐지되므로, 업데이트를 24시간 지연하면 잘못된 버전을 설치하는 것을 대부분 방지할 수 있습니다. minimumReleaseAge 설정은 버전이 게시된 후 pnpm이 이를 설치하기 전까지 지나야 하는 최소 분 단위 시간을 정의합니다. 버전 v11에서 이 설정의 기본값은 1440(1일)이며, 새로 게시된 패키지는 게시된 지 최소 1일이 지나야 해석됩니다. 이를 사용하지 않으려면 pnpm-workspace.yaml에서 minimumReleaseAge: 0을 설정하세요. 새 버전을 설치하기 전에 일주일을 기다리도록 10080으로 설정할 수도 있습니다.

신뢰 강제하기: trustPolicy 사용#

공급망을 더욱 보호하기 위해 pnpm은 trustPolicy 설정도 지원합니다. 이 설정을 no-downgrade로 지정하면, 이전 릴리스에 비해 패키지의 신뢰 수준이 낮아진 경우(예: 이전에는 신뢰할 수 있는 게시자가 게시했지만 이제는 출처 증명만 있거나 신뢰 증거가 없는 경우) 해당 패키지의 설치를 막습니다. 이를 통해 손상되었을 가능성이 있거나 신뢰도가 낮은 버전의 설치를 피할 수 있습니다.

특정 패키지나 버전이 신뢰 정책 검사를 우회하도록 허용해야 하는 경우 trustPolicyExclude 설정을 사용할 수 있습니다. 이는 신뢰 요구 사항을 충족하지 않을 수 있지만 여전히 안전하게 사용할 수 있는 알려진 패키지에 유용합니다.

또한 trustPolicyIgnoreAfter 설정을 사용하면 지정된 시간보다 오래전에 게시된 패키지에 대해 신뢰 검사를 무시할 수 있습니다. 이는 서명이나 출처 증명을 사용한 게시 절차가 없는 오래된 버전의 패키지에 유용합니다.

Lockfile 사용하기#

말할 필요도 없이, 항상 lockfile로 종속성을 고정해야 합니다. 예상치 못한 업데이트를 방지하려면 lockfile을 저장소에 커밋하세요.

종속성을 출처 레지스트리에 고정하기#

둘 이상의 레지스트리에서 설치하는 경우, 특정 레지스트리에서 가져와야 하는 패키지에는 namedRegistries 별칭을 사용하세요. 버전 v11.20.0부터 pnpm은 해당 패키지를 lockfile에 레지스트리가 지정된 키(<name>@<registryName>:<version>)로 기록하므로, 같은 이름과 버전을 게시하는 다른 레지스트리가 패키지를 몰래 대체할 수 없습니다. Named registries in the lockfile을 참고하세요. 별칭 없이 설치된 패키지는 이전과 같이 기본 registries 설정을 통해 해석됩니다.