
Uno strumento che crea automaticamente harness di fuzzing basati su una libreria
AutoHarness è uno strumento che genera automaticamente harness di fuzzing per te. Questa idea nasce da un problema concomitante nel fare fuzzing di codebase oggi: grandi codebase hanno migliaia di funzioni e porzioni di codice che possono essere annidate abbastanza in profondità nella libreria. È molto difficile, o talvolta persino impossibile, per i fuzzer intelligenti raggiungere quel percorso di codice. Anche per grandi progetti di fuzzing come oss-fuzz, ci sono ancora parti della codebase che non sono coperte dal fuzzing. Pertanto, questo programma cerca di alleviare questo problema in una certa misura, oltre a fornire uno strumento che i ricercatori di sicurezza possono usare per testare inizialmente una codebase. Questo programma supporta solo codebase scritte in C e C++.
Questo programma utilizza llvm e clang per libfuzzer, Codeql per trovare funzioni e python per il programma generale. Il programma è stato testato su Ubuntu 20.04 con llvm 12 e python 3. Ecco la configurazione iniziale.
sudo apt-get update;
sudo apt-get install python3 python3-pip llvm-12* clang-12 git;
pip3 install pandas lief subprocess os argparse ast;
Segui la procedura di installazione per Codeql su https://github.com/github/codeql. Assicurati di installare gli strumenti CLI e le librerie. Per i miei test, ho memorizzato sia gli strumenti che le librerie sotto una singola cartella. Infine, clona questo repository o scarica una release. Ecco l'output del programma dopo l'esecuzione su nginx con la modalità a argomenti multipli impostata. Questo è il comando che ho usato.
python3 harness.py -L /home/akshat/nginx-1.21.0/objs/ -C /home/akshat/codeql-h/ -M 1 -O /home/akshat/autoharness/ -D nginx -G 1 -Y 1 -F "-I /home/akshat/nginx-1.21.0/objs -I /home/akshat/nginx-1.21.0/src/core -I /home/akshat/nginx-1.21.0/src/event -I /home/akshat/nginx-1.21.0/src/http -I /home/akshat/nginx-1.21.0/src/mail -I /home/akshat/nginx-1.21.0/src/misc -I /home/akshat/nginx-1.21.0/src/os -I /home/akshat/nginx-1.21.0/src/stream -I /home/akshat/nginx-1.21.0/src/os/unix" -X ngx_config.h,ngx_core.h
Risultati:
È sicuramente possibile aumentare il successo eseguendo ulteriori debug della compilazione e aggiungendo più file header e altro. Nota che il progetto nginx non ha oggetti condivisi dopo la compilazione. Tuttavia, questo programma ha una funzionalità che può convertire eseguibili PIE in librerie condivise.
Il metodo attualmente implementato nel programma per fare fuzzing di funzioni con argomenti multipli utilizza il fornitore di dati di fuzzing. Ci sono alcuni miglioramenti da apportare in questa integrazione; tuttavia, credo di poter incorporare questa funzionalità con le strutture dati. Un problema che ho incontrato durante la programmazione è con Codeql e le struct annidate. Diventa particolarmente difficile senza scrivere più query che variano per ogni funzione. In breve, questa funzionalità necessita di più lavoro. Stavo anche pensando a una soluzione semplice usando protobuf.
Usando Codeql, è possibile generare un grafo di flusso di controllo che mappa come i parametri in una funzione vengono inizializzati. Usando queste informazioni, possiamo creare un harness migliore. Un altro modo è cercare implementazioni per la funzione che esistono nella libreria e usare quelle informazioni per fare una stima informata su un'implementazione della funzione come harness. I problemi che ho attualmente con questo sono generare i grafi di flusso di controllo con Codeql.
Posso creare un semplice programma che esegue tutti gli harness e rileva eventuali falsi positivi comuni usando ASAN. Inoltre, posso creare una nuova interfaccia che esegue tutti gli harness contemporaneamente e visualizza le loro statistiche.
Se trovi bug in questo programma, per favore crea un issue. Cercherò di trovare una soluzione. Inoltre, se hai idee per nuove funzionalità o su come implementare miglioramenti delle prestazioni o le attuali funzionalità pianificate, per favore crea una pull request o un issue con il tag (contribution).
Questo strumento genera alcuni falsi positivi. Per favore, analizza prima i crash e verifica se è un bug valido o solo un bug di implementazione. Inoltre, puoi attivare la modalità debug se alcune funzioni non compilano. Questo ti aiuterà a capire se mancano alcuni file header o ci sono problemi di linkage. Se il progetto su cui stai lavorando non ha librerie condivise ma un eseguibile, assicurati di compilare l'eseguibile in formato PIE in modo che questo programma possa convertirlo in una libreria condivisa.