[하루한줄] Homebrew package manager의 RCE 취약점
URL
Target
- Homebrew
Explain
MacOs, Linux에서 사용되는 오픈소스 커맨드 라인 패키지 매니저인 Homebrew의 Homebrew Cask에서 원격 코드 실행 취약점이 발견되었습니다. Homebrew Cask는 커맨드 라인에서 GUI 기반 어플리케이션 패키지를 관리할 수 있습니다.
취약점은 Homebrew-cask의 github 저장소 관리에 존재합니다. Homebrew-cask에는 Review-cask-pr
github action이 존재하며 해당 action은 git_diff
를 사용해 pull request된 코드의 변경점을 파싱하고 변경점이 크지 않고 간단한 경우 이를 자동으로 merge합니다. 이때 git_diff
는 다음과 같이 파일을 파싱합니다.
- 각 행에 대해
^diff --git(?: a/(\S+))?(?: b/(\S+))?
정규식과 일치하는 경우 현재 처리중인 파일 정보를 정규식과 일치하는 코드로 변경합니다. - 1단계가 일치하지 않는 경우
git_diff/file.rb
의extract_diff_meta_data
함수의 정규식 중 하나와 일치하는지 확인하고 파일 경로를 변경합니다. - 2단계가 일치하지 않는 경우 파일 내용에 대한 변경으로 처리해
+
,-
에 따라 코드 추가 또는 삭제로 처리합니다.
만약 변경된 파일 내용이 ++ "?b/(.*)
형식으로 시작하면 extract_diff_meta_data
함수의 정규식 중 아래 정규식에 매칭되어 파일 내용에 대한 변경이 아닌 파일 경로 정보로 처리됩니다. 따라서 파일 내용 변경점이 없는 pull request로 자동으로 merge될 수 있습니다.
def extract_diff_meta_data(string)
...
elsif b_path_info = %r{^[+]{3} "?b/(.*)$}.match(string)
@b_path = b_path_info[1]
...
위 취약점은 다음과 같이 악용될 수 있습니다.
Homebrew/Casks에 포함된 루비파일에 임의 코드를 포함한 아래 코드를 추가합니다.
++ "b/#{arbitrary code}" ++ b/Casks/iterm2.r
pull request를 보내면
git_diff
가 파일 경로정보로 처리해 추가된 코드가 무시되고Review-cask-pr
action에서는 변경점이 없는 코드로 인식해 자동으로 저장소에 merge됩니다.- merge된 버전의 패키지를 사용하는 PC에서 원격 코드 실행이 가능합니다.
해당 취약점은 자동으로 pull request를 검사하고 merge하는 automerge
및 review-cask-pr
github action을 제거하고 수동으로 검사 및 승인하도록 패치되었습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.