Lo sfocato fa riferimento a test dell'input casuale . Confrontalo con uno scenario in cui sottoponi un programma a un insieme di input conosciuti, che altrimenti potresti chiamare test dell'unità . L'idea di base è quella di generare un numero elevato di input in un programma nella speranza di trovare una combinazione di input che causi un comportamento errato, sia per rilevare bug sia per cercare la base per costruire un attacco. Non ci sono in realtà strumenti di fuzzing per scopi generici perché la fuzzing tende ad essere specifica per l'applicazione e gli input non possono essere completamente casuali.
Ad esempio, supponiamo di avere un programma che legge un file XML, esegue un calcolo su quel file e quindi produce un altro file come output. Per sfogliare quel programma è possibile generare in modo casuale file XML e inviarlo al programma. Non puoi necessariamente sapere quale output dovrebbe produrre il tuo programma (altrimenti non avresti avuto bisogno del programma), ma potresti dire:
- Il programma dovrebbe sempre terminare entro 10 secondi
- Il programma non dovrebbe bloccarsi
- Il programma dovrebbe sempre produrre un file di output, anche se non possiamo verificare che il file di output sia corretto
- Potrebbe essere possibile verificare alcuni attributi dell'output, ad esempio se il file di input XML contiene 27 tag di livello superiore, quindi il file di output dovrebbe avere 27 righe.
Quindi generi a caso un milione di file XML che eseguono il tuo programma un milione di volte, e ogni volta che una di queste condizioni non viene soddisfatta, registri quali input hanno causato il problema apparente. Quindi uno sviluppatore può utilizzare quegli input per trovare, eventualmente, qualunque condizione li abbia causati.
Si noti che stiamo usando file XML casuali, non file totalmente casuali. Un file di input totalmente casuale sarebbe una sequenza casuale di caratteri. Ci sono un numero enorme di file totalmente casuali che non costituiscono un XML valido e non testeranno il tuo programma in alcun modo produttivo. Un fuzzer totalmente casuale probabilmente non genererebbe mai un file XML valido per testare realmente la logica del programma. Questo è il motivo principale per cui non esiste un programma generale di fuzzing: gli input casuali devono essere significativi piuttosto che totalmente e veramente casuali nella maggior parte dei casi.
La generazione di input non validi totalmente casuali può essere significativa, specialmente se si vuole assicurare che il proprio programma non si blocchi in caso di input mal formati. Ma questo è essenzialmente test della validazione degli input e non della logica del programma. Puoi usare fuzzing per testare entrambe le cose.