본문 바로가기
javascript

⚠npm 취약성 수정 방법

by it-square 2021. 12. 30.
반응형

모두들 안녕

이번이 저의 첫 번째 매체 기사인데 가 새 장난감을 가지고 노는 기분입니다. 1년 전부터 글쓰기에 대한 생각이 머릿속에 떠올랐는데 글을 쓸 자신이 없어서… 혹시 사칭증후군일까? 예, 아마도

수석 프런트엔지니어로서 저는 때때로 팀원들에게 제 연구결과와 지식을 공유해야 합니다. 저는 확실히 무언가를 깊이 있게 배울 수 있는 가장 좋은 방법이라고 생각합니다.

지난 주 나는 몇몇 npm 취약점을 고치려고 애쓰고 있었고 나머지 팀원들에게 내가 어떻게 고쳤는지 그리고 그것으로부터 무엇을 배웠는지 설명하기로 결심했다. 그게 내 머릿속에서 촉발됐지, 오! 아마 네 경험에서 뭔가를 쓸 수 있는 가장 좋은 기회일 거야.

 

그래서 이 글을 쓰기로 결심했습니다

문맥

응용 프로그램에서 npm을 패키지 관리자로 사용합니다. 자바스크립트 프로젝트는 npm을 사용하여 다른 사람의 코드 패키지를 설치할 수 있습니다.

우리가 하는 대부분의 프로젝트에는 다수의 타사 라이브러리가 패키지로 포함되어 있습니다.

바퀴를 다시 발명하는 대신 라이브러리를 사용하는 것은 좋지만, 우리는 이 중에서 어떤 도서관이 우리의 애플리케이션에 가장 적합한지 주의해야 합니다.

 

>문제

이러한 라이브러리 중 일부는 보안 취약성이 있으며 일부 취약성은 사소한 영향을 초래할 수 있지만, 일부는 앱에 도입되는 위험이 높아 공격자가 악용할 수 있습니다.

그렇기 때문에 프로젝트의 취약점을 수정하고 탐지하는 것이 우선 순위 목록의 최우선 과제입니다.

️️ npm 위험 취약성 탐지 방법

취약성을 탐지하는 몇 가지 방법이 있습니다. 그 중 몇 가지를 살펴보겠습니다.

 

1-npm 감사

Npm에는 프로젝트의 종속성에 있는 보안 취약점에 대한 정보 테이블을 나열하는 명령이 포함되어 있습니다.

npm 문서에는 다음과 같이 나와 있습니다.

2- Github 보안/Dependabot 알림

프로젝트가 Github에 있는 경우 이 경고에 익숙할 수 있습니다.

 

이러한 취약성을 수정하는 단계

1- 종속성을 최신 버전 로 업데이트하십시오.

 

이렇게 하면 최신 수정/패치가 있는 경우 이를 사용하고 있는지 확인할 수 있습니다.

라이브러리를 업데이트 상태로 유지하는 여러 가지 방법이 있습니다.

한 가지 방법은 앱이 모든 라이브러리를 최신 버전으로 업데이트할 준비가 된 경우 npm 업데이트를 실행하는 것입니다.

https://docs.npmjs.com/cli-commands/update.html

또 다른 방법은 github의 dependabot 을 사용하여 pull 요청을 발생시켜 사용자가 구성한 종속성을 최신 상태로 유지하는 것입니다. 제가 가장 좋아하는 방법인데, 수작업이 아니고 봇이 알아서 하세요.

 

2npm 감사 수정

npm 감사 수정은 SEMVER 규칙을 기반으로 문제를 일으키지 않아야 하는 종속성만 수정합니다. 그것은 일부 취약점을 고치는 첫 번째 단계가 될 것이다.

그러나 안타깝게도 프로젝트에서 발견할 수 있는 많은 취약점은 이러한 방법으로 해결할 수 없습니다.

3- 나머지는 취약성을 해결하기 위해 수행한 단계였습니다.

알려진 해결책을 찾고 있었지만 따라야 할 명확한 단계 목록을 찾을 수 없었기 때문에 이 논리를 사용하여 해결하기로 결정했습니다.

 

라이브러리 library1에 대한 취약성 경고가 있다고 가정해 보십시오.

(1) 직접 사용하지 않는 라이브러리에 대한 패치가 있습니다1.

우리는 library1에 대한 패치를 가지고 있습니다(상상은 4.2.1).

1- 패키지의 스크립트 섹션에 이 코드를 추가합니다.json(아직 없는 경우):

 

npm 문서에는 다음과 같이 명시되어 있습니다.

경고:

이 사례는 의 사례입니다. 우리의 취약점이 최고 수준이 아니니까, 어서 가자!

2- 그런 다음 이 새 섹션을 추가하고(아직 없는 경우) 다음 코드 줄을 추가합니다.

 

강제 결의안은 나머지 설치 전에 이러한 결의안 섹션을 강제로 설치합니다.

3- 이제 터미널에서 npm ci를 실행하면 취약성이 사라집니다!

(2) 직접 사용하지 않는 라이브러리1용 패치가 없습니다.

1- 터미널에서 npm 목록 라이브러리1을 실행하여 종속 트리를 확인합니다.

 

다음과 같은 것을 볼 수 있습니다.

이 트리 그래프에서 lib7과 lib8에서 lib1이 어떻게 사용되는지 확인할 수 있습니다.

아마도 여러분은 이 나무에 나타나는 deduped라는 단어에 대해 생각하고 있을 것입니다. deduped는 "dedupled"의 줄임말입니다.

npm 문서에 따르면 npm 중복제거는 다음과 같습니다.

 

2- 이 시점에서 다양한 전략을 따를 수 있습니다.

저는 이 종속성을 수정한 릴리스로 이 트리의 라이브러리를 위에서 아래로 업데이트하려고 했습니다. 따라서 종속성 트리의 이러한 라이브러리 중 하나에 수정 불가능한 이 라이브러리1을 사용하지 않는 릴리스가 있는지 확인하십시오.

그리고 해상도 부분에 추가해 주세요. npm ci를 실행하면 취약성이 어떻게 되었는지 확인할 수 있습니다!

그러나 라이브러리1 의 사용을 피하는 이러한 라이브러리들을 위한 패치가 없을 수 있으며, 그런 다음 이 종속성 트리(이 경우 lib2)에서 최상위 라이브러리를 사용하지 않기 위해 코드를 변경하는 것을 고려해야 한다.

최신 검사 http

 

잠깐만요, 이 모든 단계를 수행해도 이러한 변경 사항을 적용하기에는 충분하지 않습니다…

취약성을 수정한 후에는(npm 감사를 실행하고 경고가 사라짐) 응용 프로그램이 제대로 작동하는지 확인해야 합니다. 왜냐하면 일부 패키지는 최신 버전과 호환되지 않아 응용 프로그램이 손상될 수 있기 때문입니다.

업데이트 검토 계속

이러한 해결 항목을 검토하여 패치 버전이 있는지 확인한 다음 라이브러리를 패치로 릴리스로 업데이트하고 이 해결 항목을 제거해야 합니다.

이러한 라이브러리를 최신 버전으로 업데이트하는 종속 탭을 사용하는 경우 모든 것이 더 쉬워지며, 해상도 항목을 삭제할 수 있는지 확인하는 일만 하면 됩니다.

 

결론들

npm 취약점을 고치는 것은 쉽지 않은 경우가 대부분이지만, 사용자 경험과 제품 자체를 망칠 수 있는 이 성가신 문제에 을 좀 더 신경써야 합니다.

마지막으로, 이 기사가 도움이 된다면 박수 부탁드리며 를 읽어 주셔서 감사합니다!

댓글