American Fuzzy Lop
American Fuzzy Lop to fuzzer, który wykorzystuje algorytmy genetyczne do maksymalizacji pokrycia kodu za pomocą przypadków testowych. Przyczynił się do ujawnienia błędów w wielu projektach wolnego oprogramowania, takich jak Serwer X.Org, PHP, OpenSSL, pngcrush, bash, Firefox, BIND oraz Qt.
Kod źródłowy American Fuzzy Lopa jest ogólnodostępny na stronie Michała Zalewskiego. Program zyskał aktywną społeczność – 27 sierpnia 2015 roku jego główna lista mailingowa liczyła 392 użytkowników oraz programistów, a na liście pojawiało się średnio 100 postów miesięcznie.
Typowe zastosowanie
Fuzzer AFL wymaga, aby użytkownik dostarczył przykładową komendę do uruchomienia oraz przynajmniej jeden plik wejściowy. W przypadku odtwarzacza muzycznego, American Fuzzy Lop może pracować z krótkim plikiem dźwiękowym. Następnie fuzzer stara się uruchomić podaną komendę, a w przypadku sukcesu, dąży do stworzenia jak najmniejszego pliku wejściowego, który wywołuje to samo zachowanie.
Po tym wstępnym etapie, AFL rozpoczyna proces fuzzingu poprzez modyfikację pliku wejściowego. Jeśli program ulegnie awarii lub zawiesi się, może to sugerować odkrycie nowego błędu, który potencjalnie może być błędem bezpieczeństwa. W takim przypadku, zmieniony plik wejściowy zostaje zapisany do późniejszej analizy.
Aby uzyskać maksymalną wydajność, American Fuzzy Lop oczekuje, że testowany program został skompilowany za pomocą narzędzi, które dodają do kodu źródłowego funkcje monitorujące przepływ sterowania. Umożliwia to fuzzerowi wykrywanie zmian w zachowaniu aplikacji w odpowiedzi na modyfikacje danych wejściowych. Jeżeli to nie jest możliwe, AFL wspiera również testy czarnej skrzynki.
Funkcjonalność
Silnik fuzzera
Silnik American Fuzzy Lopa stosuje różne algorytmy, mające na celu wywołanie nieoczekiwanego zachowania. Wśród nich znajdują się operacje zamiany bitów oraz całych bajtów w pliku wejściowym na różne liczby, które mogą prowadzić do przypadków granicznych. Dodatkowo, AFL może generować przypadki testowe na podstawie zbioru znanych słów kluczowych, co jest przydatne w testowaniu programów implementujących własne gramatyki, takich jak SQLite. Generowane przypadki testowe, które aktywują konkretne fragmenty kodu programu, mogą być później używane przez bardziej wyspecjalizowane narzędzia testujące. W trakcie fuzzowania możliwe jest również wykrycie zawieszenia programu, jeśli nie zostanie on wyłączony przed upływem określonego czasu. AFL monitoruje także awarie, które manifestują się przez sygnały takie jak SIGABRT lub SIGSEGV.
Dane wejściowe do testów mogą być przekazywane do programu przez standardowe wejście lub wiersz poleceń. Aktualnie fuzzowanie programów sieciowych nie jest bezpośrednio wspierane, chociaż w niektórych przypadkach istnieją praktyczne metody rozwiązania tego problemu.
Usprawnienia wydajności
Jednym z wyzwań, które trzeba było pokonać w implementacji AFLa, było efektywne uruchamianie setek procesów na sekundę. Pierwotnie American Fuzzy Lop uruchamiał każdy proces od nowa, jednak obecnie domyślnie silnik fuzzujący korzysta z metody opartej na wywołaniu systemowym „fork”. Dodatkowo, możliwe jest przyspieszenie procesu fuzzowania poprzez użycie interfejsu LLVM, który umożliwia testowanej aplikacji zgłoszenie momentu, w którym ma zostać forkowana. AFL wspiera również współbieżne fuzzowanie tego samego programu.
Interfejs użytkownika
American Fuzzy Lop komunikuje się z użytkownikami za pomocą kolorowego tekstowego interfejsu, który wyświetla statystyki procesu fuzzowania w czasie rzeczywistym. Konfiguracja programu odbywa się za pośrednictwem ustawień wiersza poleceń oraz zmiennych środowiskowych. Dodatkowo, programy mogą odczytywać informacje o postępach z pliku „fuzzer_stats”.
Programy narzędziowe
Oprócz afl-fuzz oraz narzędzi do modyfikacji kodu, American Fuzzy Lop zawiera programy służące do nadzoru procesu fuzzowania. Istnieją również narzędzia afl-cmin oraz afl-tmin, które mogą być używane do minimalizacji korpusu testowego oraz pojedynczych przypadków testowych. Te narzędzia mogą być przydatne w przygotowywaniu danych wygenerowanych przez afl-fuzz do dalszego użycia przez inne fuzzery.
Przypisy
Linki zewnętrzne
- S. K. Cha, M. Woo, D. Brumley, Program-Adaptive Mutational Fuzzing, in Proceedings of the 36th IEEE Symposium on Security and Privacy, 2015. (to appear)
- Multi-System and Internet Security Cookbook, Hors-Serie No. 11 Outils de sécurité, p. 36, American Fuzzy Lop, Kevin Denis, June 2015.
- Fuzz and strings (lwn.net)
- Fuzzing (on) FreeBSD – (Mostly) automated bug discovery with security/afl – a presentation at FOSDEM
- Testing with two failure seeking missiles: fuzzing and property based testing. ep2015.europython.eu. [archived from this address (2015-12-08)] – a presentation at EuroPython 2015.
- Stagefright: Scary Code in the Heart of Android a presentation at Black Hat Briefings
- The Fuzzing Project
- Grammatical Inference and Language Frameworks for LANGSEC