Fuzzing
# Fuzzing

Nella programmazione e nello sviluppo software, il fuzzing (o fuzz testing)è una tecnica automatizzata di collaudo del software che prevede l'immissione di dati non validi, imprevisti o casuali come input di un programma tramite appositi programmi detti fuzzer. Il programma da testare viene quindi monitorato per rilevare eventuali errori o falle di sicurezza di un software come arresti anomali, asserzioni errate interne al codice o potenziali memory leak.

Tipicamente i fuzzer vengono utilizzati per testare programmi che accettano input strutturati. Questa struttura è specificata, ad esempio, in un formato di file o in un protocollo e distingue gli input validi da quelli non validi. Un fuzzer efficace genera input semi-validi che sono "abbastanza validi" in quanto non vengono rifiutati direttamente dal parser, ma creano comportamenti imprevisti più in profondità nel programma e sono quindi definiti "abbastanza non validi", ovvero fanno saltare fuori i cosiddetti "corner case" (ovvero casi limite non preventivati) che non sono stati adeguatamente trattati.

## Storia

Il termine "fuzz" trae origine da un progetto didattico dell'autunno 1988 tenuto da Barton Miller presso l'Università del Wisconsin, i cui risultati vennero successivamente pubblicati nel 1990. Il progetto serviva per testare l'affidabilità dei programmi a riga di comando UNIX, eseguendo un gran numero di input casuali in rapida successione fino al loro arresto anomalo. Il team di Miller riuscì a mandare in crash dal 25 al 33% delle utility UNIX testate, eseguendo poi il debug di ciascuno degli arresti anomali per determinarne la causa e classificando ogni errore rilevato. Per consentire ad altri ricercatori di condurre esperimenti simili con altri software, il codice sorgente dei tool sviluppati, le procedure di test e i dati grezzi dei risultati vennero resi pubblicamente disponibili.

## Tipi

Un fuzzer può essere classificato nei seguenti modi:

* "generation-based" o "mutation-based" a seconda che gli input siano generati da zero oppure modificando gli input esistenti;
* strutturato o non strutturato a seconda che si abbia conoscenza o meno della struttura di input;
* "white box", "black box" o "grey box" a seconda che si abbia conoscenza o meno della struttura del programma.

## Usi

Il fuzzing viene utilizzato principalmente come tecnica automatizzata per esporre le vulnerabilità nei programmi critici per la sicurezza che potrebbero essere sfruttati con intenzioni dannose. Più in generale, il fuzzing viene utilizzato per dimostrare la presenza di bug piuttosto che la loro assenza. L'esecuzione di un collaudo di tipo fuzz per diverse settimane senza trovare un bug non dimostra che il programma è corretto. Dopotutto, il programma potrebbe ancora fallire per un input che non è stato ancora eseguito, ma di contro eseguire un programma per tutti i potenziali input sarebbe proibitivo. Se l'obiettivo è quello di dimostrare che un programma è corretto per tutti gli input, deve esistere una specifica formale e devono essere utilizzate le tecniche dei metodi formali.

