
Prueba de concepto del exploit para CVE-2021-21017, una confusión de tipos en Adobe Reader que provoca una lectura fuera de los límites y un desbordamiento de montón, con análisis técnico y orientación de detección.
# IA32 plugin, ver. 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;
}
.............................................................
.............................................................
}
Al construir una URL absoluta a partir de una relativa al baseURL de un documento PDF para ser utilizada por APIs como: app.launchURL, document.submitForm o app.media.createPlayer,
si el baseURL parece ser una cadena UTF-16BE, la relativa también se trata como una cadena UTF-16BE al realizar la concatenación, aunque en realidad es una cadena ANSI.
Esto puede resultar en un acceso de lectura fuera de límites por un lado. Por otro lado, al asignar memoria para contener el búfer de destino, la URL relativa se "mide" como una cadena ANSI. Esto, por supuesto, no es suficiente si se produce una lectura fuera de límites. (cadena + el terminador NULL llenando un chunk completo del heap).
¿Qué significa esto?
La mayoría de las veces resultará en un fallo y ocasionalmente en sobrescribir el byteLength de un ArrayBuffer a 0xFF.
Si tienes preguntas, no dudes en contactarme en twitter: https://twitter.com/Zeusb0x
El catálogo del documento PDF tendrá una entrada URI que contiene una referencia indirecta a un objeto de diccionario. Este, a su vez, tendrá una entrada Base, que es el baseURL real. Lo más probable es que esté presente en notación hexadecimal y comience con los caracteres \xFE\xFF. (ver PoC). Afortunadamente, esta es la única forma de cambiar el baseURL de un documento en un contexto normal y sin privilegios. Intentar hacerlo desde JavaScript lanzará una excepción de seguridad.