Sekcje

Przejdź na skróty do treści. | Przejdź do nawigacji


Baza wiedzy Publikacje Fuzzing aplikacji webowych – wprowadzenie

Fuzzing aplikacji webowych – wprowadzenie

Bezpieczeństwo aplikacji Po przeczytaniu dowiesz się:

  • Czym jest fuzzing
  • Jakie rodzaje błędów jest w stanie wykrywać fuzzer
  • Jakie zalety i wady niesie za sobą wykorzystanie fuzzingu jako metody testowania oprogramowania
  • Jak będzie kształtować się rozwój fuzzerów na przestrzeni najbliższych lat

Sposoby wykrywania zagrożeń

Zakładając, że testujemy aplikację metodą blackbox (tj. bez dostępu do kodu źródłowego) i skupiamy się na walidacji danych wejściowych, to na dzień dzisiejszy, najbardziej rozpowszechnionymi metodami testowania aplikacji pod kątem występowania luk w bezpieczeństwie są metody opierające się na wykrywaniu zależności pomiędzy danymi wejściowymi, a odpowiedzią aplikacji.

W większości wypadków audytor przekazuje do badanego programu wartości mogące spowodować błąd i oczekuję na reakcję testowanego programu. W tym celu korzysta się z tzw. bazy payload-ów, czyli danych mogących spowodować niepożądaną reakcję aplikacji. Wyniki działania programów analizowane są pod kątem występowania wzorców świadczących o istniejącej podatności – błędy bazy danych, wywołania skryptów czy też zwracanie struktury plików.

Fuzzing jako nowoczesna metoda testowania aplikacji

Jako, że testowanie i wykrywanie potencjalnych luk jest czynnością w większości wypadków powtarzalną, którą łatwo symulować, można pokusić się o zautomatyzowanie całego procesu przy udziale dodatkowego pierwiastka pseudolosowości. W znacznym stopniu skróci to czas wykonywania testów i co najważniejsze, pozwoli na wykrycie błędów trudnych do zidentyfikowania przez audytora (katalogi o nielogicznych nazwach, ukryte parametry wywołań, niestandardowe ciągi formatujące itd.). Ten zautomatyzowany cykl zdarzeń mających na celu wykrycie błędów jest składnikiem szerokiej dziedziny „IT Security”, zwanej fuzzingiem.

Definicja fuzzingu

Fuzzing opiera się na przekazywaniu do testowanego programu częściowo losowych danych, które są akceptowane przez program, ale mogą doprowadzić do jego nieprawidłowego zachowania.
Cała procedura fuzzingu może zostać przedstawiona za pomocą diagramu:

Fuzzing - diagram


Każdy z powyższych bloków jest integralną częścią całego procesu fuzzingu i nie może zostać pominięty. W przypadku testowania aplikacji webowych, spełnienie wymagań stawianych przez każdy z wymienionych bloków funkcjonalnych jest niezbędne do uzyskania satysfakcjonujących wyników.

Aplikacje webowe a bezpieczeństwo

Aplikacje webowe z uwagi na swoją szeroką dostępność i niemalejącą popularność narażone są na szczególne niebezpieczeństwo. Aktualnie można wyróżnić kilka głównych typów błędów, które są wyjątkowo niebezpieczne a prawdopodobieństwo ich wystąpienia w testowanej aplikacji jest wysokie:

  • Cross-site Scripting (XSS)
  • Cross-site Request Forgery (CSRF)
  • Injection bugs (Code Injection, SQL Injection, LDAP Injection, XPath Injection, SMTP Injection i inne…)
  • Wyciek danych oraz nieodpowiednie obsługiwanie błędów
  • Niepoprawne zarządzanie sesją (Session Fixation, Session Poisoning itd.)
  • Path Traversal
  • Błędy autoryzacji i uwierzytelnienia


Praktycznie każdy z powyższych typów podatności implikuje co najmniej kilka niepożądanych efektów, takich jak:

  • Utrata Danych
  • Podmiana Danych
  • Zniszczony wizerunek zaatakowanej organizacji
  • Straty finansowe

Za pomocą fuzzingu jesteśmy w stanie wykryć większość z wymienionych wyżej błędów. Oczywiście najłatwiej znaleźć błędy, które mają duże prawdopodobieństwo zwrócenia konkretnych danych świadczących o wystąpieniu luki (Injection Bugs, XSS, Path Traversal), ale przy odrobinie wysiłku można skonstruować fuzzer, który będzie przystosowany do innych typów podatności.

Obecnie, pewne luki bezpieczeństwa są niezmiernie trudne do wykrycia. Przykładem tego typu podatności są błędy logiczne. Obecnie prowadzone są badania nad wykorzystaniem sieci neuronowych oraz algorytmów genetycznych, które mogą być pomocne w inteligentnej analizie aplikacji. Badania te mogą doprowadzić do stworzenia narzędzi umożliwiających w pełni zautomatyzowane wykrywanie błędów logicznych. Na razie jednak nie widać obiecujących wyników tego typu prac...

Obecnie stosowane rozwiązania - fuzzing

W chwili obecnej na rynku istnieje kilka aplikacji oraz frameworków godnych polecenia. Oczywiście, możemy pokusić się o napisanie autorskiego, w pełni spersonalizowanego fuzzera, ale jeżeli nie mamy doświadczenie w pisaniu tego typu programów, to lepszym wyjściem będzie posłużenie się gotowym rozwiązaniem. Istnieje co najmniej kilka ciekawych aplikacji bazujących na założeniach fuzzingu, m.in.:


Do ich stworzenia wykorzystano głównie języki skryptowe (Ruby, Python), które zdobywają coraz większą popularność w środowisku związanym z IT Security głównie dzięki prostej składni, rozbudowanym bibliotekom sieciowym oraz krótkiemu czasowi tworzenia oprogramowania. W przypadku gdy zdecydujemy się na pisanie własnego fuzzera, proponowałbym wykorzystanie właśnie tych języków, ale oczywiście nic nie stoi na przeszkodzie aby użyć innych rozwiązań.
Za pomocą wymienionych wyżej aplikacji jesteśmy w stanie przetestować program pod kątem występowania kilkunastu różnych zagrożeń. Ponadto, użycie tych aplikacji w połączeniu z manualnym audytem znacznie zwiększy prawdopodobieństwo znalezienia krytycznych błędów, które mogą w realnym stopniu zagrozić testowanej aplikacji.

Zalety fuzzera

Fuzzer posiada wiele niewątpliwych zalet, które związane są głównie z możliwościami płynącymi z automatycznego testowania aplikacji pod kątem występowania zróżnicowanych podatności. Poniżej wymienione są najważniejsze zalety świadczące o wysokiej przydatności fuzzera:

  • pełna automatyzacja testu
  • możliwość wykrycia błędów trudnych do identyfikacji za pomocą manualnych testów
  • możliwość szybkiego znalezienia błędu (choć nie jest to regułą)

Wady fuzzera

Pomimo wymienionych wcześniej zalet, fuzzing ma wiele wad. Najpoważniejsze z nich to:

  • obecnie dostępne fuzzery nie są w stanie wykryć błędów logicznych oraz pewnych innych podatności
  • niejednolitość testów wynikających z wykorzystania losowości (pojedynczy test jest trudny do powtórzenia). Za każdym razem wartości przekazywane do testowanego programu ulegają modyfikacji w sposób trudny do przewidzenia.
  • brak możliwości określenia dokładnego czasu potrzebnego na wykonanie testu z uwagi na dynamicznie zmieniający się zbiór wartości testowych. Audytor nie jest w stanie określić ile czasu potrzebuje na przeprowadzenie testu ponieważ zbiór wartości testowych nie jest skończony (nie składa się ze stałej, ustalonej liczby payload-ów).

Rozwój fuzzingu

Proste, autorskie fuzzery, które stanowiły wyposażenie specjalistów ds. bezpieczeństwa komputerowego coraz częściej zastępowane są zaawansowanymi frameworkami, posiadającymi szereg wbudowanych opcji. Co więcej, sam fuzzing nadal się rozwija i dąży do osiągnięcia poziomu, w którym będzie możliwe wykrywanie większości błędów występujących na stronach webowych. Wiąże się to z zastosowaniem takich technologii jak sieci neuronowe czy też algorytmy genetyczne, które byłyby w stanie wykryć podatności trudne do rozpoznania przez klasyczne fuzzery.
Ponadto, rozwój fuzzingu dąży do obalenia mitu, który mówi, że za pomocą oprogramowania nie jesteśmy w stanie wykryć błędów logicznych. Wykorzystanie sztucznej inteligencji w połączeniu z solidną dawką entropii jest dobrym punktem startowym do zbudowania idealnego narzędzia dla audytora. Niestety, na dzień dzisiejszy musimy polegać jedynie na tradycyjnych rozwiązaniach, ale przyszłość fuzzingu kreuje się nad wyraz interesująco.

Fuzzing a tworzenie oprogramowania

Fuzzing coraz częściej staje się integralną częścią procesu tworzenia oprogramowania. Szereg testów przeprowadzanych podczas produkcji aplikacji (uwzględniając testy jednostkowe, wydajnościowe, integracyjne i inne) nie są w stanie stwierdzić czy testowany program będzie zachowywał się poprawnie gdy przekażemy do niego dane odbiegające od normy. Mogą to być zmodyfikowane pliki różnych formatów, wadliwe dane wejściowe lub inne spreparowane wartości.
Wiele firm zaczyna dostrzegać zalety płynące z uwzględnienia fuzzingu jako jednego z kroków potrzebnych do stworzenia bezpiecznej aplikacji. Jeżeli jesteśmy na etapie projektowania nowego programu, to warto pomyśleć o wygospodarowaniu czasu na przeprowadzenie testów z wykorzystaniem fuzzera.

Podsumowanie

W artykule przedstawiłem fuzzing jako technikę idealnie nadającą się jako uzupełnienie tradycyjnego procesu testowania stanu bezpieczeństwa aplikacji webowej. Oczywiście, należy także zaznaczyć, że fuzzery mogą być wykorzystywane jako narzędzia testujące aplikacje desktopowe, sieci czy też zróżnicowane formaty plików.

Nie jest to jednak technika wystarczającą i podczas przeprowadzania audytu nie można polegać tylko i wyłącznie na wynikach uzyskiwanych przy użyciu fuzzera. Myślę jednak, że wykorzystanie fuzzingu w tak rozbudowanym procesie jakim jest testowanie aplikacji webowej jest konieczne. Często, fuzzing wykrywa błędy, których audytor nie byłby w stanie wykryć w tradycyjny sposób, a takie luki z reguły niosą ze sobą największy stopień ryzyka.

Więcej informacji

 O autorze

Piotr Łaskawiec

Konsultant d/s Bezpieczeństwa
Securitum

piotr.laskawiec@securitum.pl

Fuzzing, pomimo coraz szybszego rozwoju, nadal nie doczekał się większego rozgłosu i ciężko znaleźć informacje pozwalające zgłębić tą tematykę. W celu poszerzenia wiedzy z zakresu fuzzingu proponuję skorzystać z następujących źródeł:

Strony internetowe:

Książki:

  • Fuzzing for Software Security Testing and Quality Assurance
  • Fuzzing: Brute Force Vulnerability Discovery
  • Open Source Fuzzing Tools

 

Przydatne informacje? Polub nas na facebooku.

Nawigacja
 
Darmowy magazyn o ITsec

zine
Subskrybuj RSS:
RSS