
# Эксплойт PoC для CVE-2021-21017 Эксплойт, подтверждающий концепцию, для CVE-2021-21017 — ошибки несоответствия типов в Adobe Reader, приводящей к чтению за пределами буфера и переполнению кучи, с техническим анализом и рекомендациями по обнаружению.
# Плагин 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;
}
.............................................................
.............................................................
}
При построении абсолютного URL из относительного по отношению к baseURL PDF-документа для использования в таких API, как: app.launchURL, document.submitForm или app.media.createPlayer,
если baseURL выглядит как строка UTF-16BE, относительный URL также обрабатывается как строка UTF-16BE при выполнении конкатенации, хотя на самом деле это строка ANSI.
Это может привести, с одной стороны, к чтению за пределами границ буфера. С другой стороны, при выделении памяти под целевой буфер относительный URL «измеряется» как строка ANSI. Этого, конечно, недостаточно, если происходит чтение за пределами границ. (строка + завершающий NULL, заполняющий целый блок кучи).
Что это значит?
Чаще всего это приводит к сбою, а иногда и к перезаписи byteLength объекта ArrayBuffer значением 0xFF.
Если у вас есть вопросы, не стесняйтесь связаться со мной в Twitter: https://twitter.com/Zeusb0x
В каталоге PDF-документа будет запись URI, содержащая косвенную ссылку на объект-словарь. В свою очередь, в нём будет запись Base, которая и является фактическим baseURL. Скорее всего, она будет представлена в шестнадцатеричной нотации и будет начинаться с символов \xFE\xFF. (см. PoC). К счастью, это единственный способ изменить baseURL документа в обычном, непривилегированном контексте. Попытка сделать это из JavaScript вызовет исключение безопасности.