원문 : https://hackerone.com/reports/827052

 

GitLab에서 발견된 Path Traversal 취약점으로 무려 $20,000의 바운티를 받은 보고서입니다.

 

취약점 및 방법

이처럼 issue를 새로 생성할 때 Description에 Markdown으로 작성할 수 있습니다.

이때 ![file](./filepath) 형식으로 파일에 대한 링크를 삽입할 수 있습니다.

아래에는 filepath로부터 파일을 가져오는 부분의 소스코드입니다.

 

 @text.gsub(@pattern) do |markdown|
          file = find_file(@source_project, $~[:secret], $~[:file])
          break markdown unless file.try(:exists?)

          klass = target_parent.is_a?(Namespace) ? NamespaceFileUploader : FileUploader
          moved = klass.copy_to(file, target_parent)
...
   def find_file(project, secret, file)
        uploader = FileUploader.new(project, secret: secret)
        uploader.retrieve_from_store!(file)
        uploader
      end

find_file내부에서 path traversal을 체크하는 로직이 없습니다. 또는 find_file하기전 인자에 대한 검증이 없습니다.

해당 보고서의 제보자는 ![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)/etc/password파일이 다운로드 가능하다는 것을 보여주었습니다.

 

파급력

서버내의 어떤 파일이든 접근할 수 있습니다.

 

원인

find_file시 path traversal에 대한 검증이 전혀 없었기 때문에 취약점이 발생하였습니다.

https://gitlab.com/gitlab-org/gitlab/-/commit/7cb0e02a9392d2d7abd8e3941c6127aa7e7bd240#5f0477280d218b25de26ddd2af0e8a5a706a76ed

 

Raise error on path traversal in UploadsRewriter (7cb0e02a) · Commits · GitLab.org / GitLab

GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more. Self-host GitLab on your own servers, in a container, or...

gitlab.com

위의 링크는 해당 취약점을 수정한 커밋이고 내용은 아래와 같습니다.

 

 

복사했습니다!