
PoC per Foxit Reader CVE-2018-14442
Il PDF è un formato di file utilizzato per rappresentare documenti. Un pdf è composto da molteplici oggetti di dati
Oggetti Primitivi Semplici Integer, Number, Boolean, Null
Oggetti Complessi
| Formato | Nome |
|---|---|
| [.*] | Array |
| (.*) | String |
| <<.*>> | Dictionary |
| <.*> | Hex String |
| /.* | Name |
| stream.*endstream | Stream |
Questi oggetti definiscono l'aspetto di un pdf e il suo contenuto. Le strutture nei pdf sono presenti in 2 tipi di oggetti: Diretti e Indiretti. Un oggetto indiretto inizia con il Numero di oggetto e il Numero di generazione, seguiti dall'oggetto vero e proprio. Gli Oggetti Indiretti possono essere referenziati direttamente in altri oggetti come n m R dove n e m sono rispettivamente i numeri di oggetto e di generazione.
Gli oggetti Dictionary sono i mattoni fondamentali per il documento. Esistono alcuni oggetti dizionario generali necessari per formare una pagina o il documento stesso. Il più importante è il dizionario Root che definisce i collegamenti a tutte le altre Pages, Metadata, Names, ecc., ciascuno dei quali può essere un altro oggetto.
Gli oggetti Stream contengono la maggior parte dei dati binari come font, immagini o dati compressi/crittografati.
Un documento PDF può essere crittografato per proteggerne il contenuto da accessi non autorizzati. La crittografia si applica a tutte le stringhe e agli stream nel file PDF del documento, con alcune eccezioni come il dizionario Encrypt stesso. La crittografia si applica principalmente agli oggetti stream. La crittografia non viene applicata ad altri tipi di oggetti come interi e valori booleani, che vengono utilizzati principalmente per trasmettere informazioni sulla struttura del documento piuttosto che sul suo contenuto.
Le informazioni relative alla crittografia devono essere memorizzate nel dizionario di crittografia del documento, che deve essere il valore della voce "Encrypt" nel dizionario trailer del documento.
CPDF_Parser::StartParse imposta m_pCryptoHandler per gli oggetti indiretti di un pdf che sono crittografati. m_pCryptoHandler dovrebbe essere reso nullo quando CPDF_Parser::ReleaseEncryptHandler viene completato. Invece CPDF_Parser::ReleaseEncryptHandler non rimuove il riferimento al CryptoHandler in CPDF_Parser e rimane dangling.
Successivamente, quando il parser inizia a esaminare gli oggetti referenziati nel dizionario Root, viene chiamato m_pCryptoHandler+8 per decrittare i dati.
Un bug simile è stato corretto in pdfium nel commit 741c362fb75fd8acd2ed2059c6e3e716a63a7ac8. Vedere https://bugs.chromium.org/p/chromium/issues/detail?id=726503
I PDF consentono di incorporare JS nel documento che può essere eseguito automaticamente se inserito in OpenAction di un dizionario di tipo Catalog. Una volta che abbiamo l'esecuzione di JS, possiamo spruzzare oggetti nello spazio del processo in modo da raggiungere un indirizzo prevedibile dove scriveremo la nostra catena ROP.
Quando un documento PDF viene firmato in Foxit Reader, utilizza plugins\jrsys\x86\jrsysMSCryptoDll.dll dalla directory di installazione per leggere le informazioni firmate, che carica jrsysCryptoDll.dll su un indirizzo statico di 0x10000000. Questa dll importa VirtualAlloc, il che rende più semplice eseguire il payload. L'exploit allegato utilizza l'heap spraying per ottenere un layout di memoria prevedibile e usa una catena ROP per allocare una pagina RWX, copiare ed eseguire il payload.
Questo exploit è stato testato utilizzando Foxit Reader 9.0.1.1049 x86 su MS Windows 7 Enterprise Build 7601 SP1 x86. L'exploit richiede che l'heap sia in uno stato specifico; se l'exploit fallisce, si prega di riprovare. Fare riferimento alla dimostrazione video. Questa vulnerabilità è presente anche in Foxit PDF Reader e Converter per Android.
bitcoins.pdf è il pdf appositamente creato che esegue la riallocazione della memoria liberata e attiva il bug principale. Se si desidera riprodurre il crash nel debugger, abilitare Page Heaps per FoxitReader.exe e aprire bitcoins.pdf.
Questo crash è stato trovato da Cloudfuzz - Una piattaforma di fuzzing sviluppata presso Payatu. Ulteriori analisi e sfruttamento sono stati effettuati da Sudhakar