
Preuve de concept pour CVE-2021-21017, une confusion de type dans Adobe Reader conduisant à une lecture hors limites et à un débordement de tas, avec analyse technique et conseils de détection.
# Plugin IA32, 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 telles que : app.launchURL, document.submitForm ou app.media.createPlayer,
si le baseURL ressemble à 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 entraîner une lecture hors limites. D'autre part, lors de l'allocation de mémoire pour contenir le tampon de destination, l'URL relative est « mesurée » comme une chaîne ANSI. Cela ne suffit bien sûr pas si une lecture hors limites se produit. (chaîne + le terminateur NULL remplissant tout un bloc du tas).
Qu'est-ce que cela signifie ?
Cela entraînera le plus souvent un crash et, occasionnellement, l'écrasement de la propriété 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 faisant référence indirectement à un objet dictionnaire. Celui-ci contiendra à son tour une entrée Base, qui est le baseURL réel. Il sera très probablement présent en notation hexadécimale et commencera par les caractères \xFE\xFF. (voir le PoC). Heureusement, c'est la seule façon 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é.