
Exploit de prueba de concepto para la confusión de tipos en Adobe Reader que conduce a desbordamiento de montón, con análisis detallado de causa raíz y guía 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 usada 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 los límites (OOB) 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 OOB. (cadena + el terminador NULL llenando un bloque completo del heap).
¿Qué significa esto?
Lo más frecuente es que provoque un fallo y, ocasionalmente, sobrescriba 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.