[하루한줄] Homebrew package manager의 RCE 취약점

URL

Broken parsing of Git diff allows an attacker to inject arbitrary Ruby scripts to Casks on official taps

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 는 다음과 같이 파일을 파싱합니다.

  1. 각 행에 대해 ^diff --git(?: a/(\S+))?(?: b/(\S+))? 정규식과 일치하는 경우 현재 처리중인 파일 정보를 정규식과 일치하는 코드로 변경합니다.
  2. 1단계가 일치하지 않는 경우 git_diff/file.rbextract_diff_meta_data 함수의 정규식 중 하나와 일치하는지 확인하고 파일 경로를 변경합니다.
  3. 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]
...

위 취약점은 다음과 같이 악용될 수 있습니다.

  1. Homebrew/Casks에 포함된 루비파일에 임의 코드를 포함한 아래 코드를 추가합니다.

    ++ "b/#{arbitrary code}"
    ++ b/Casks/iterm2.r
  2. pull request를 보내면 git_diff가 파일 경로정보로 처리해 추가된 코드가 무시되고 Review-cask-pr action에서는 변경점이 없는 코드로 인식해 자동으로 저장소에 merge됩니다.

  3. merge된 버전의 패키지를 사용하는 PC에서 원격 코드 실행이 가능합니다.

해당 취약점은 자동으로 pull request를 검사하고 merge하는 automergereview-cask-pr github action을 제거하고 수동으로 검사 및 승인하도록 패치되었습니다.