Fuzzing

Nella programmazione e nello sviluppo software, il fuzzing[1] (o fuzz testing) [2]è 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.

Il termine "fuzz" trae origine da un progetto didattico dell'autunno 1988 tenuto da Barton Miller presso l'Università del Wisconsin,[1][3] i cui risultati vennero successivamente pubblicati nel 1990.[4] 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.

Un fuzzer può essere classificato nei seguenti modi:[5][6]

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

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.[7] 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.

  1. ^ a b Fuzzing per la cyber security: che cos'è e come si usa per scoprire vulnerabilità nascoste, su Agenda Digitale, 14 novembre 2019. URL consultato il 24 settembre 2022.
  2. ^ (EN) Tom Gallagher, Bryan Jeffries e Lawrence Landauer, Hunting Security Bugs, Microsoft Press, 2006, ISBN 978-0-7356-2187-9. URL consultato il 24 settembre 2022.
  3. ^ (EN) Barton P. Miller, Fall 1988 CS736 Project List (PDF), su pages.cs.wisc.edu, Computer Sciences Department, University of Wisconsin-Madison, settembre 1988. URL consultato il 27 settembre 2022.
  4. ^ (EN) Barton P. Miller, Lars Fredriksen e Bryan So, An Empirical Study of the Reliability of UNIX Utilities (PDF), in Communications of the ACM, dicembre 1990. URL consultato il 26 settembre 2022 (archiviato dall'url originale il 7 febbraio 2018).
  5. ^ (EN) Michael Sutton, Adam Greene e Pedram Amini, Fuzzing: Brute Force Vulnerability Discovery, Addison-Wesley, 2007, ISBN 978-0-321-44611-4.
  6. ^ (EN) John Neystadt, Automated Penetration Testing with White-Box Fuzzing, su msdn.microsoft.com, Microsoft, febbraio 2008. URL consultato il 27 settembre 2022.
  7. ^ (EN) Richard G. Hamlet, Partition testing does not inspire confidence, vol. 16, dicembre 1990, DOI:10.1109/32.62448.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica