깃허브 Dependabot 사용하는 방법

Jay·2024년 10월 6일
2
post-thumbnail

최근 진행 중인 프로젝트에서 GitHub Dependabot을 활용해 보안 취약점을 해결하고 있습니다. 그런데 어느 날 보니, 제안된 PR들이 쌓여 있었고, 가장 마지막 PR은 4개월 전의 것이었습니다. 담당 동료에게 물어보니, Dependabot이 익숙하지 않아 작업이 지연되고 있었다고 합니다.

마침 사내 스터디에서 Dependabot을 학습한 터라, 사용 가이드를 문서로 정리해두면 이런 문제를 예방할 수 있겠다고 생각해 모던 리액트 Deep Dive의 내용을 토대로 이 글을 작성하였습니다.

Dependabot이란?

Dependabot은 깃허브에서 제공하는 기능 중 하나로, 의존성에 문제가 있다면 이에 대해 알려주고 가능하다면 해결할 수 있는 풀 리퀘스트까지 열어줍니다.

원격 저장소를 확인해 보면 Dependabot을 통해 어떤 의존성에 문제가 있는지 확인할 수 있습니다.

개별 취약점 살펴보기

깃허브의 Dependabot은 취약점을 Critical, High, Moderate, Low의 4단계로 분류합니다.(Critical의 심각도가 가장 높고, Low의 심각도가 가장 낮음).

  1. 취약점을 발견한 파일의 경로입니다. dependencies에 직접 명시한 경우 package.json이 발견되는 경우도 있으며, dependencies가 의존하고 있는 패키지에서 발견되는 경우 이렇게 lock파일이 명시됩니다.

  2. 취약점을 바로 수정할 수 있는 경우 표시되는 버튼입니다. Dependabot은 단순히 패키지의 취약점을 검사해 주는 것 뿐만 아니라 취약점을 수정할 수 있다면 풀 리퀘스트도 생성해 줍니다. 하지만 모든 취약점에 대해 풀 리퀘스트가 생성되는 것은 아닙니다. Dependabot이 수정 가능하다고 판단하는 경우에만 풀 리퀘스트가 생성되며, 그렇지 않은 경우에는 취약점만 알려줍니다.

  3. 보안 취약점의 심각도를 나타냅니다. CVE란 ‘Common Vulnerabilities and Exposures’의 약자로, 공개적으로 알려진 컴퓨터 보안 결함 목록을 나타냅니다. CVE는 미국 국토안보부 산하의 사이버 보안 및 보안국의 재정 지원을 받아 MITRE Corporation에서 감독합니다. 이 취약점의 경우 CVE-2024-4068에 해당하는 것을 확인할 수 있습니다.

  4. 취약점의 자세한 정보를 나타냅니다. 어떤 패키지가 취약점으로 지정됐는지, 현재 사용 중인 버전은 무엇이며, 어느 버전을 설치해야 해결할 수 있는지 그리고 해당 취약점이 발생하는 상황과 조심해야 할 것들을 나타냅니다. 이 취약점은 braces 패키지 3.0.2 버전 이하에서 발견할 수 있는 취약점으로, 악의적인 사용자가 쌍이 맞지 않는 중괄호를 입력으로 보내면 프로그램 충돌이 발생할 수 있다는 취약점이 존재합니다.

문제가 무엇인지 확인했다면, 문제의 패키지가 어디에 설치 되어 있는지 확인해볼 수 있습니다. package.json을 살펴보면 직접적으로 문제가 되는 braces를 설치해서 사용하는 곳은 없습니다. 대부분의 의존성은 package.json보다는 yarn.lock에 숨어 있는 경우가 많습니다. 패키지가 어디에 설치돼 있고 어느 패키지에 의존 중인지 확인해 보려면 다음 명령어를 입력해보면 됩니다.

>> yarn why braces
├─ chokidar@npm:3.5.3
│  └─ braces@npm:3.0.2 (via npm:~3.0.2)
│
├─ chokidar@npm:3.6.0
│  └─ braces@npm:3.0.2 (via npm:~3.0.2)
│
└─ micromatch@npm:4.0.5
   └─ braces@npm:3.0.2 (via npm:^3.0.2)

chokidar, micromatch에서 braces를 사용하고 있음을 알 수 있습니다. 다른 방법으로는 chokidar를 방문해서 braces의 의존성을 확인하면 어떤 버전으로 사용하고 있는지 확인할 수 있습니다. 원격 저장소를 방문하면 chokidar이 해당 패키지를 어떻게 사용하고 있는지 살펴볼 수도 있습니다.

취약점 해결하기

모든 취약점이 실제 서비스의 보안 취약점으로 연결되는 것은 아니며, 취약점이 발생할 수 있는 시나리오를 만들지 않는다면 취약점이 존재한다 하더라도 크게 문제가 되지 않을 수 있습니다. 직접적으로 영향이 없을 것으로 판단되는 패키지에 대해서는 시급성을 낮춰서 대응하는 것이 좋습니다.

가장 쉽게 해결할 수 있는 것은 깃허브 Dependabot이 풀 리퀘스트를 열어준 경우입니다. 풀 리퀘스트를 열어줬다는 것은 이미 취약점을 해결한 패치가 존재한다는 것을 의미합니다. 이 풀 리퀘스트를 검토해서 병합이 가능한지 살펴보면 됩니다.

풀 리퀘스트의 제안은 braces를 3.0.3 버전으로 업그레이드 하는 것입니다.

여기서 선택할 수 있는 방법은 크게 두 가지입니다. 이 풀 리퀘스트의 제안대로 braces를 3.0.3 버전으로 업그레이드 하는 것입니다. Dependabot이 연 PR의 제안대로 업데이트해도 문제가 없다면, 풀리퀘스트를 머지하는 방식으로 보안 취약점을 손쉽게 해결할 수 있습니다.

그러나 만약 패키지의 주 버전 업데이트가 수행 되어야 한다면, 유의적 버전 2.0.0법칙에 따라 이전 버전과 호환되지 않는 변경이 이뤄졌을 수 있기에 해당 패키지를 사용하는 코드를 꼼꼼히 확인해 보아야 합니다. 변경 사항을 가장 쉽게 확인해 볼 수 있는 방법은 깃허브 저장소에 있는 릴리즈 노트입니다. (예시: axios 릴리즈 노트 Releases · axios/axios)

릴리즈 노트에는 버전 업데이트에 따른 변경 내용이 기록되어 있습니다. 그럼에도 해당 내용은 수기로 기록하는 경우가 많기 때문에 누락되는 경우가 많으니 주의해야 합니다. 이 경우에는 실제 버전 별로 코드를 비교해 보거나 실제 버전 업 된 패키지를 설치해서 특별한 이상 없이 정상적으로 동작하는지 확인해 보는 것이 좋습니다.

참고

모던 리액트 Deep Dive 9.2.3
Dependabot 빠른 시작 가이드

0개의 댓글