
Preuve de concept d'exploit pour CVE-2021-21017 : confusion de type dans Adobe Reader conduisant à un débordement de tas via une baseURL de PDF malveillant avec un décalage UTF-16BE/ANSI.
# 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;
}
.............................................................
.............................................................
}
Lors de la construction d'une URL absolue à partir d'une URL relative au baseURL d'un document PDF, destinée à être utilisée par des API comme : app.launchURL, document.submitForm ou app.media.createPlayer,
si le baseURL semble être une chaîne UTF-16BE, l'URL relative est également traitée comme une chaîne UTF-16BE lors de la concaténation, alors qu'il s'agit en réalité d'une chaîne ANSI.
Cela peut d'une part conduire à une lecture hors limites. D'autre part, lors de l'allocation mémoire pour le buffer de destination, l'URL relative est « mesurée » comme une chaîne ANSI. Ce qui est bien sûr insuffisant si une lecture hors limites se produit. (chaîne + le terminateur NULL remplissant un bloc heap entier).
Qu'est-ce que cela signifie ?
Cela aboutit le plus souvent à un crash et parfois à l'écrasement du byteLength d'un ArrayBuffer à 0xFF.
Si vous avez des questions, n'hésitez pas à me contacter sur Twitter : https://twitter.com/Zeusb0x
Le catalogue du document PDF contiendra une entrée URI pointant vers une référence indirecte à un objet dictionnaire. Celui-ci aura à son tour une entrée Base, qui est le baseURL effectif. Il sera très probablement présent en notation hexadécimale et commencera par les caractères \xFE\xFF. (voir PoC). Heureusement, c'est le seul moyen de modifier le baseURL d'un document dans un contexte normal et non privilégié. Tenter de le faire depuis JavaScript lèvera une exception de sécurité.