Fuzzing: cosa si cela dietro il metodo di test automatico?
Il fuzzing, noto anche come fuzz testing, è un metodo automatizzato che si rivela particolarmente efficace nell’individuare la presenza di vulnerabilità nei software. In questo articolo vi presentiamo questa procedura di test e vi spieghiamo quali sono i suoi vantaggi e svantaggi, nonché i diversi strumenti di fuzzing disponibili.
Cos’è il fuzzing (fuzz testing)?
Il fuzzing, detto anche fuzz testing, è un metodo sviluppato dallo scienziato Barton Miller per testare i software in modo sistematico alla ricerca di vulnerabilità. Lo scopo del metodo non è tanto quello di interpretare il codice sorgente del programma, quanto più di considerare il software come una black box e il suo contenuto come dato di fatto. Tutte le possibili interfacce di inserimento dati vengono richiamate in modo automatico e alimentate con dati casuali. A seconda delle dimensioni del progetto software testato, questo processo può protrarsi per ore o persino giorni.
Obiettivo del fuzz testing è verificare se, per tutte le possibili varianti di input, il programma dispone delle reazioni necessarie. Gli input insensati o erronei dovrebbero essere il più possibile intercettati con routine di gestione degli errori. Se, per determinati dati di input, queste routine non sono presenti oppure non funzionano correttamente, la conseguenza può essere un crash del programma. La prassi tecnica di verificare i software tenendo conto di tutte le eventualità è ormai da tempo parte integrante degli ambienti di sviluppo nel settore dello sviluppo web. Da anni, ad esempio, numerose applicazioni web vengono testate in diversi web client o versioni dei browser utilizzando il cross browser testing al fine di verificarne la funzionalità.
Quali sono le tipologie di fuzzing?
In linea generale si distingue tra tre varianti di fuzzing:
Application fuzzing
Nell’ambito di questo approccio di fuzz testing vengono testate funzioni quali i pulsanti e i campi di immissione di programmi grafici o le opzioni dei programmi della riga di comando. Il test consiste nel richiamare le funzioni in modo mirato con una frequenza o una velocità innaturali, oppure nel compilare i campi di immissione con contenuti troppo grandi.
Protocol fuzzing
Per lo scambio di dati si utilizzano protocolli, ad esempio l’Hypertext Transfer Protocol (HTTP) sul web. I dati trasferiti devono essere forniti in un determinato formato. Il protocol fuzzing ha lo scopo di verificare il comportamento del programma in caso di invio di contenuti con formato errato. In particolare, è importante che i contenuti inviati non siano accidentalmente interpretati come comandi e, pertanto, eseguiti su un server.
File format fuzzing
Gli strumenti di fuzzing che si basano sull’approccio del file format fuzzing generano file errati che vengono immessi nel software da testare allo scopo di essere elaborati. I file hanno un formato standardizzato come .jpg per i file immagine, così da poter essere scambiati tra varie applicazioni. Possono determinarsi problemi nel caso in cui il file aperto non presenta il formato atteso. In una versione avanzata è anche possibile testare funzioni implementate, ad esempio i processi di compressione dei file video.
Come funziona il fuzzing nello specifico?
Ricostruire il funzionamento di un software è un’attività complessa e dispendiosa. Spesso la lingua di programmazione è costituita da diverse migliaia di righe di codice sorgente, che vengono rese ancor più impenetrabili da ramificazioni e funzioni integrate. Inoltre, una volta compilato, il codice sorgente deve essere ricostruito (ossia decompilato), operazione che non sempre è possibile.
Il fuzzing persegue pertanto un approccio diverso: genera tutti i dati casuali immaginabili di un determinato tipo, in modo tale da coprire il massimo numero possibile di varianti di input. Il fuzzing rappresenta l’interfaccia per l’input automatizzato. Questo può avvenire a diversi livelli. Nell’ambito dell’application fuzzing, ad esempio, si simulano diversi tipi di dati, che in seguito sono inoltrati a un software. Il test può essere eseguito anche su possibili lunghezze e formati di dati degli input. Il protocol fuzzing utilizza pacchetti di dati creati autonomamente. Un’altra possibilità consiste nell’intercettare dei contenuti, manipolarli e restituirli. Il file format fuzzing funziona invece con file di test generati casualmente. I fattori da testare sono, ad esempio, la dimensione, la struttura e i marcatori (flag) utilizzati.
Ambiti di applicazione del fuzz testing
L’ambito di applicazione principale del fuzzing è la garanzia di qualità nello sviluppo di software. In ragione dell’elevato grado di automatizzazione è possibile testare regolarmente i software in un ambiente di test appositamente predisposto. Con lo sviluppo agile, questo ambiente di test può essere integrato in processi già esistenti. Tuttavia, anche i software già distribuiti possono essere testati nell’ambito di un audit di sicurezza, ad esempio per accertarne l’idoneità a impieghi rilevanti per la sicurezza.
Ovviamente, il fuzzing può essere utile anche per individuare potenziali exploit. Tuttavia, il metodo consente di scoprire soltanto i possibili punti di attacco attraverso gli errori delle funzioni del programma, poiché gli strumenti di fuzzing non offrono in ultima analisi alcun accesso alle strutture interne del software testato.
Vantaggi e svantaggi del fuzzing
Vantaggi del fuzzing | Svantaggi del fuzzing |
---|---|
Possibilità di garantire uno standard di qualità uniforme attraverso test preparati | Gestione talvolta complessa dei software |
Aumento della stabilità del software | Dispendio di lavoro aggiuntivo |
Miglioramento della sicurezza | Impossibilità di circoscrivere le cause quando si individuano errori |
Disponibilità di strumenti gratuiti di comprovata efficacia | Possibilità di usi illeciti da parte degli sviluppatori di malware |
Panoramica dei migliori strumenti di fuzzing
Sul mercato esistono molteplici strumenti di fuzzing, sia gratuiti che a pagamento, che offrono funzionalità diverse. Ecco una piccola panoramica:
- American Fuzz Lop: può compilare autonomamente il codice sorgente e testarlo; per questo motivo, appartiene a una categoria di programmi denominati anche “Grey Box Fuzzer”. Se il testo sorgente non è disponibile, viene eseguita un’emulazione con QEMU (Quick Emulator).
- Fuzzino: offre una libreria per la generazione di dati di input che possono essere utilizzati per testare le applicazioni (basate su protocollo).
- LibFuzzer: libreria che fa parte dell’infrastruttura di compilazione LLVM.
- ClusterFuzz: ambiente di test originariamente sviluppato da Google per testare il browser Chrome.
- Sulley: offre una raccolta di strumenti nel linguaggio di programmazione Python; adatto in particolare per eseguire test semplici, come la generazione di dati casuali.
- Peach: soluzione fortemente automatizzata per il fuzz testing di hardware e software.
- Powerfuzzer: offre diversi scenari di attacco, come iniezioni SQL; è utilizzato attraverso un’interfaccia utente grafica basata sul web.
Strumento fuzz testing | Sviluppatore | Licenza | Categoria | Peculiarità |
---|---|---|---|---|
American Fuzz Lop (AFL) | Michael Zalewski | Open source | Application | Approccio grey box |
Fuzzino | Fraunhofer Institut | Open source | Protocol | Adatto per test speciali |
LibFuzzer | LLVM Team | Open source | Application | Integrato nell’infrastruttura di compilazione |
ClusterFuzz | Open source | Application | Integra tool come AFL | |
Sulley | OpenRCE | Open source | Protocol | File, integrabilità semplice |
Peach | Peachtech | Commerciale | Application | Elevata automatizzazione |
Powerfuzzer | Marcin Kozlowski | Open source | Application | Integrato in KALI-Linux |
Possibili alternative al fuzz testing
A seconda della finalità applicativa, esistono delle alternative al fuzz testing che perseguono un approccio diverso e forniscono risultati diversi. Qui di seguito vi presentiamo una sintesi delle principali alternative.
Reverse engineering
Per i ricercatori nel campo della sicurezza, il reverse engineering fa parte degli strumenti standard del mestiere. Con questo termine si indica l’attività di analisi svolta dopo la decompilazione (ritrascrizione nei linguaggi di programmazione) oppure dopo il disassemblaggio (traduzione nel linguaggio macchina assembler). Si tratta di un processo molto complesso e suscettibile di errori. Tuttavia, in caso di successo, permette di ottenere tutti i dettagli relativi alla funzionalità del programma.
Debugging
Il debugging è un processo di ricerca errori utilizzato nell’ambito dello sviluppo di software. I programmi sono eseguiti temporaneamente nell’ambiente di sviluppo prima della finalizzazione. Lo sviluppatore può inserire dei punti di interruzione (break points) in corrispondenza dei quali il programma di blocca. Qui può leggere i contenuti delle variabili utilizzate e verificarne la correttezza. Il debugging viene utilizzato anche nell’ambito del reverse engineering.
Module testing
I software complessi sono spesso creati su base modulare. Una prassi ormai consolidata consiste nel verificare i singoli componenti già nell’ambito di cosiddetti test modulari in idonei ambienti di test.
In sintesi
Nella maggior parte dei casi gli errori e le falle di sicurezza dei software sono legati a una perdita di stima e fiducia degli sviluppatori. La totale assenza di errori è un’utopia, cosa di cui la maggior parte degli utilizzatori di programmi dovrebbe essere consapevole. Con il fuzzing, tuttavia, lo sviluppatore dispone di una potenziale soluzione per individuare gli errori prima che vengano segnalati da soggetti terzi. In ogni caso, il metodo promuove la stabilità e la sicurezza dei software. Tutti validi motivi, questi, per integrare il fuzz testing nella propria garanzia di qualità.