
# CVE-2021-21017 개념 증명 익스플로잇 CVE-2021-21017에 대한 개념 증명 익스플로잇으로, Adobe Reader의 타입 혼동(type confusion)으로 인해 발생하는 경계를 벗어난 읽기(out-of-bounds read) 및 힙 오버플로(heap overflow) 취약점을 다루며, 기술 분석 및 탐지 지침을 포함합니다.
# IA32 플러그인, 버전 2020.013.20074.
char * __cdecl FUN_2581894c(char *base_url,LPCSTR rel_url)
{
............................................................
............................................................
if ((base_url != (char *)0x0) && (rel_url != (LPCSTR)0x0)) {
if ((*base_url == -2) && (base_url[1] == -1)) {
iVar6 = bytes_len(base_url);
pcVar7 = base_url + iVar6;
pcVar8 = rel_url + 2;
do {
do {
cVar3 = *pcVar8;
pcVar1 = pcVar8 + 2;
*pcVar7 = cVar3;
pcVar2 = pcVar7 + 2;
cVar4 = pcVar8[1];
pcVar7[1] = cVar4;
pcVar7 = pcVar2;
pcVar8 = pcVar1;
} while (cVar3 != '\0');
} while (cVar4 != '\0');
}
else {
lstrcatA(base_url,rel_url);
}
return base_url;
}
.............................................................
.............................................................
}
PDF 문서의 baseURL을 기준으로 상대 URL로부터 절대 URL을 생성할 때, 이를 app.launchURL, document.submitForm 또는 app.media.createPlayer와 같은 API에서 사용하는 경우,
baseURL이 UTF-16BE 문자열로 보이면, 상대 URL도 실제로는 ANSI 문자열임에도 불구하고 연결(concatenation)을 수행할 때 UTF-16BE 문자열로 취급됩니다.
이로 인해 한편으로는 경계를 벗어난 읽기(Out-of-bounds read)가 발생할 수 있습니다. 다른 한편으로는 대상 버퍼를 보관할 메모리를 할당할 때 상대 URL이 ANSI 문자열로 "측정"됩니다. 물론 OOB 읽기가 발생한다면 이는 충분하지 않습니다. (문자열 + NULL 종결자가 힙 청크 전체를 채우는 경우).
이것이 무엇을 의미할까요?
대부분의 경우 크래시가 발생하며, 때로는 ArrayBuffer의 byteLength를 0xFF로 덮어쓰게 됩니다.
질문이 있으시면 트위터로 연락 주세요: https://twitter.com/Zeusb0x
PDF 문서 카탈로그에는 사전 객체에 대한 간접 참조를 보유하는 URI 항목이 있습니다. 이 사전 객체에는 실제 baseURL인 Base 항목이 있습니다. 이는 대부분 16진수 표기법으로 존재하며 \xFE\xFF 문자로 시작할 것입니다. (PoC 참조). 다행히도 이것이 일반적이고 권한이 없는 컨텍스트에서 문서의 baseURL을 변경할 수 있는 유일한 방법입니다. JavaScript에서 이를 시도하면 보안 예외가 발생합니다.