American Fuzzy Lop

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

Przeczytaj u przyjaciół: