Ho fatto questa domanda su StackOverflow ma non ho ricevuto risposte, quindi ho pensato che avrei tentato la fortuna qui poiché la fuzzing è strettamente correlata alla sicurezza e spesso utilizzata nei test di valutazione della vulnerabilità.
Attualmente sto scrivendo un fuzzer che genererà un payload basato su un formato di specifica personalizzato.
Tutto va bene e sono contento della prima versione che ho scritto, ma ho riscontrato un problema durante il tentativo di applicare questo fuzzer a un'attività che non era il mio caso di utilizzo iniziale.
Il problema è legato al modo in cui l'input del fuzzer influirà sull'ambiente di test.
per esempio:
-
Se il metodo testato costruisce un buffer con dimensioni variabili, cosa succederebbe se il valore generato fosse
2^64
e attivasse un errore di memoria esaurita (OOM)? -
Se il metodo di test rimuove un file specificato da una variabile nomefile cosa accadrebbe se il valore generato fosse
*
e l'intera directory venisse cancellata?
Naturalmente questi sono solo alcuni esempi ingenui, ma il punto è che sto cercando di trovare un modo per ridurre le conseguenze del fuzzing sull'ambiente di test (pur rimanendo comunque portatile se possibile).
Ciò renderebbe il fuzzer più sicuro da usare ma anche più fluido perché i casi di test fuzz potevano essere facilmente concatenati ed eseguiti in parallelo senza rompere o corrompere l'ambiente a ogni altro payload.
Ci sono alcune soluzioni radicali come:
- non utilizza il metodo fuzzing su metodi che potrebbero avere effetti collaterali e conseguenze critiche
- black-listing / white-elenca alcuni input in determinati casi d'uso
Entrambi sono davvero limitanti secondo me e rendono difficile l'uso generico del fuzzer nei test fuzz black-box.
Altre possibili soluzioni come:
- esecuzione di test in una VM senza testa come Vagrant
- esecuzione di test in un contenitore Linux come Docker
- intercettando determinate syscalls come le chiamate I / O e disinfettando i loro input
sono validi ma tutti soffrono del problema che sono di altissimo livello. Anche Syscalls e Docker hanno il problema di non essere molto portabili.
In che modo più fuzzer professionisti / aziendali gestiscono questo problema?
Immagino che il software di testing black-box abbia probabilmente risolto questo problema in modo portatile, non è vero?