Sciocco muto
I'm just starting out to learn about fuzzing and have made a dumb fuzzer that changes several random bytes in a pdf file to random values, opens it and detects if Acrobat Reader has crashed. What types of bugs can I expect to find using such a method?
Nessuno. Tale sconcertamento "stupido" ha una copertura incredibilmente limitata. Sarei estremamente sorpreso se quell'applicazione si arrestasse effettivamente solo perché alcuni byte nell'input sono stati modificati casualmente. Questo sarebbe il caso anche se il fuzzer stesse provando milioni di campioni al secondo. Comunque tu dici anche che il tuo fuzzer lo apre e vede se si blocca. Questo otterrebbe solo ciò che, qualche tentativo un secondo? Una prova ogni pochi secondi? Nemmeno vicino ne vale la pena.
Il modo in cui alcuni fuzzer professionali funzionano sta generando un processo, interrompendo lo stato della memoria proprio prima che stia per analizzare i dati di destinazione (per saltare lo stato di bootstrap), e quindi riprenderlo. Se non si arresta in modo anomalo entro alcune decine di millisecondi, ritorna allo stato di pausa in cui si trovava prima. Ciò consente la sfocatura a centinaia di volte al secondo al più lento, o decine di migliaia al più veloce.
I assume that a format string vulnerability could be found in case the dumb fuzzer happens to inserts a format string parameter at the right place. I also assume that integer overflows could be found. But what else could be found?
Dipende da come funziona il parser. Senza avere il codice sorgente di Acrobat Reader, non potrei nemmeno iniziare a rispondere a questa domanda. Overflow di buffer, vulnerabilità di formato stringa, overflow di interi, errori logici, ecc. Sono tutti possibili. Devi anche essere consapevole che non tutte le vulnerabilità saranno facili da scoprire, dal momento che alcune parti dell'input possono essere protette con un checksum, un numero magico complesso o possono essere compresse.
Immagina di avere un campo protetto con un semplice checksum. Le probabilità che le modifiche casuali si traducano in una collisione sono piuttosto basse, poiché questo è ciò per cui è stato progettato il checksum e, di conseguenza, un percorso di codice vulnerabile non può mai essere preso. Tuttavia un exploit reale potrebbe semplicemente assicurarsi che il checksum sia valido. Questo è un problema comune con i nuovi utenti che sfogliano il formato rar. L'intero file è coperto da un checksum, quindi non importa quanto ingenuo lo stia facendo qualcuno, non si bloccherà mai. Quando il codice di checksum viene rimosso, risulta essere piuttosto buggato e facile da arrestare. Per evitare questo problema, devi capire il formato e rimuovere il codice di checksum o assicurarti che i tuoi input utilizzino sempre checksum corretti.
Is it possible to find buffer overflows? Since I change only few random bytes, I assume that the chance of overflowing a buffer is actually small or none. Or am I wrong?
Se si modifica un valore che finisce per specificare la dimensione di un buffer, anche se non si modifica la dimensione del buffer, potrebbe comunque verificarsi un overflow. Ad esempio, prendi un contenuto di memoria ipotetico here is some text17
. Questo è composto da un buffer, here is some text
e una dimensione, 17
. Una permutazione che modifica la dimensione in modo che sia inferiore comporterebbe il sovraccarico del buffer una volta elaborato. Ora non è probabile che Acrobat Reader abbia qualcosa di ovvio, ma un bug potrebbe ipoteticamente portare a un risultato simile internamente. Potrei immaginare diverse possibilità.
Fuzzing intelligente
I fuzzer professionali non si limitano a inserire input casuali in un programma per vedere se si blocca. Modificano l'input in modi specifici che possono provocare modifiche nel comportamento dell'obiettivo. Il programma è compilato con un codice speciale inserito che fa sì che riferisca il suo stato interno al fuzzer in ciascun ramo, consentendo al fuzzer di sapere quando un dato input ha portato a un diverso codepath, anche se il suo comportamento esterno non cambia. Questa è la tecnica utilizzata da AFL , uno dei più diffusi fuzzer di uso generale. È abbastanza intelligente da creare un file JPEG valido dal nulla , semplicemente esaminando lo stato di un decodificatore JPEG mentre lo alimenta.
Per scrivere un fuzzer che trova bug reali, è necessario utilizzare la strumentazione binaria come AFL con la possibilità di analizza automaticamente il formato , o scrive un fuzzer sensibile al formato specifico dell'applicazione (cioè uno che è profondamente consapevole delle specifiche del formato PDF, ed è in grado di creare permutazioni su una parola chiave per sintassi base piuttosto che una base per byte ).