
Exploit proof-of-concept per CVE-2021-21017: confusione di tipo in Adobe Reader che porta a overflow dell'heap tramite un baseURL PDF manipolato con disallineamento 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;
}
.............................................................
.............................................................
}
Quando si costruisce un URL assoluto da uno relativo al baseURL di un documento PDF da utilizzare con API come: app.launchURL, document.submitForm o app.media.createPlayer, se il baseURL sembra essere una stringa UTF-16BE, anche quello relativo viene trattato come stringa UTF-16BE durante la concatenazione, sebbene sia in realtà una stringa ANSI.
Questo può comportare un accesso in lettura fuori dai limiti da un lato. Dall'altro lato, quando si alloca memoria per contenere il buffer di destinazione, l'URL relativo viene "misurato" come stringa ANSI. Questo ovviamente non è sufficiente se si verifica una lettura OOB. (stringa + il terminatore NULL che riempie un intero chunk dell'heap).
Cosa significa?
Il più delle volte provocherà un crash e occasionalmente sovrascriverà il byteLength di un ArrayBuffer con 0xFF.
Se hai domande, sentiti libero di contattarmi su twitter: https://twitter.com/Zeusb0x
Il catalogo del documento PDF avrà una voce URI che contiene un riferimento indiretto a un oggetto dizionario. Questo a sua volta avrà una voce Base, che è l'effettivo baseURL. Sarà molto probabilmente presente in notazione esadecimale e inizierà con i caratteri \xFE\xFF. (vedi PoC). Fortunatamente questo è l'unico modo per cambiare il baseURL di un documento in un contesto normale e non privilegiato. Tentare di farlo da JavaScript genererà un'eccezione di sicurezza.