Fuzzing aplikacji webowych

Automatyzacja testowania

webfuzzingNa początek warto postawić sobie pytanie czy fuzzing traktować jako atak na bezpieczeństwo aplikacji i oprogramowania czy jako niedocenianą jeszcze a dającą szerokie horyzonty na przyszłość technikę testowania bezpieczeństwa? Odpowiedź nie musi być prosta, aczkolwiek w zależności od intencji fuzzing może mieć zastosowanie pozytywne i negatywne.

Zacząć należy od pojęcia samego fuzzingu czyli metody testowania oprogramowania, która ma na celu wykrycie luk w bezpieczeństwie oraz wskazanie nieprzewidzianych reakcji programu. Do tego służyć mają częściowo losowe dane. W większości wypadków proces ten jest w pełni automatyczny, co pozwala na znaczne zredukowanie nakładów czasowych.

Fuzzing opiera się na przekazaniu do testowanego programu danych wadliwych (złe formatowanie, niepoprawna długość itp.), które zostaną zaakceptowana przez aplikację i spowodują nieprzewidzianą reakcję programu (zawieszenie się aplikacji, wyświetlenie błędu itd.). Korzysta się z tzw. bazy payload-ów, czyli danych mogących spowodować niepożądaną reakcję aplikacji. Wynikiem mogą być przykładowo błędy bazy danych, wywołania skryptów czy też zwracanie struktury plików.

Należy rozgraniczyć standardowe metody testowania oprogramowania od testowania za pomocą danych pseudolosowych. Należy również pamiętać, że fuzzing NIE ma nic wspólnego z testami: jednostkowymi, funkcjonalnymi, integracyjnymi, wydajnościowymi.

Fuzztesting jest zupełnie odrębną techniką testowania. Klasyfikowaną w ogólnej szufladzie testów automatycznych lub częściowo automatycznych.

Założenia skłaniające do użycia fuzzingu mogą być następujące: zakładamy że testujemy aplikację metodą blackbox (tj. bez dostępu do kodu źródłowego), zależy nam na automatyzacji testu oraz skupić chcemy się na walidacji danych wejściowych.

Fuzzing a aplikacje webowe

Zastosowanie fuzzingu jest szerokie i właściwie bez ograniczeń (może za wyjątkiem wyobraźni użytkownika, testera). Działaniu fuzzera możemy poddawać: aplikacje działające lokalnie, aplikacje sieciowe, aplikacje webowe, kontrolki ActiveX, biblioteki współdzielone, pliki …

Skupiając uwagę na aplikacjach webowych nie sposób nie zauważyć rosnącej popularności i dostępności co szczególnie naraża je na 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 JavaScript 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

Niepożadane skutki powyższych błędów to utrata danych lub ich podmiana, zniszczony wizerunek zaatakowanej firmy (często w ogóle jest to nie brane pod uwagę, stad jeszcze wiele pozostało do kompleksowego uświadomienia autorów aplikacji webowych w sprawie bezpieczeństwa).

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.

Luki w postaci błędów logicznych na chwilę obecną są praktycznie niemożliwe do wykrycia za pomocą fuzzingu czy innych metod tetsowania. Jest tu jednak szeroka wizja na przyszłość: wykorzystanie algorytmów genetycznych, sieci neuronowych. Obecnie prowadzone są badania nad wykorzystaniem sieci neuronowych oraz algorytmów genetycznych w analizie aplikacji w celu pełnej automatyzacji testowania aplikacji pod kątem występowania błędów logicznych.

Aplikacje webowe rozwijają się bardzo dynamicznie. Nie sposób nie zauważyć, że co raz częściej zastępują oprogramowanie „desktopowe” np. Google Docs czy Photoshop Express. Związane są również z wieloma dziedzinami życia – od ochrony zdrowia po rozrywkę.

Najpopularniejsze narzędzia do fuzzingu wymierzone w przegladaraki to:

  • hamachi – fuzzer dhtml, tworzy liste wszystkich znanych elementow dhtml, ich wlaściwości i metod a nastepnie „szuka błędu”. Do sukcesow tego fuzera mozna zaliczyć to że znalazl bledy w przegladarkach Firefox 1.0.7, Mozilla 1.7, Konqueror 3.5.1, Opera 8.5, Safari, oraz Internet Explorer.
  • dom-hanoi – dzięki tym narzędziom parę lat temu pewien hacker/audytor H D Moore rozpoczął projekt „the months of browser bugs”, w którym codziennie publikowal nową lukę dotyczącą bezpieczeństwa przeglądarek.
  • AXfuzz- fuzzer stworzony przez H D Moore, dostępny na stronie fuzzer pozwala zlokalizowac blędy w kontrolkach activex w IE.
  • JSNFUZZ Kolejny fuzzer tym razem wymierzony przeciwko językowi javascript. Dzięki niemu do 10 sierpnia 2007 roku znaleziono okolo 280 bledow w jadrze javascriptu przeglądarki firefox ( w SpiderMonkey).
  • Mangleme – kolejny fuzer Michała Zalewskiego, skrypt cgi
  • Visual Basic Fuzzing
  • Fundacja mozilla w 2 polowie 2007 roku wydała program jsfunfuzz który sluży do
  • testowania bezpieczenstwa przegladarki, audytu kodu.

Jeżeli w aplikacji brak jest przykładowo mechanizmu walidacji danych, bądź mechanizmów badających  tolerancje na nieprawidłowe dane, fuzzing działa dokładnie tak: Garbage in – garbage out, wadliwe dane (śmieci) w rezultacie zmuszają apliację do zwrócenia takich samych śmieci jakie zostały wprowadzone (bez poprawnych komunikatów, bez obsługi wyjątków itp…).

Fuzzery & frameworki

Aplikacje typu fuzzer służące do testowania:

  • Powerfuzzer
  • Wapiti
  • WFuzz
  • Rfuzz

Oraz frameworki:

  • Spike (typy danych i struktury bloków,  funkcje sieciowe)
  • Rfuzz (Ruby)
  • Peach – wieloplatformowy framework, którego głównymi cechami są duże możliwości oraz prostota użycia. . Jest jednym z najpopularniejszych frameworków służących do budowania fuzzerów.
  • Taof – fuzzer wyspecjalizowany w testowaniu protokołów sieciowych. Posiada rozbudowane GUI (Linux, Windows)
  • SMUDGE – fuzzer wyłącznie protokołów sieciowych.
  • FileP – program do generowania zmodyfikowanych plików na podstawie określonego wzorca i wysyłania ich do (testowanej) aplikacji.
  • Antiparser – prosty framework, Dzięki mało skomplikowanej budowie jego kod idealnie
  • nadaje się do analizy. Niestety, projekt nie jest rozwijany od 2005 roku

Język – dowolny. Polecane: Python, Ruby, Java

Dlaczego Python?

Wykorzystanie Pythona przy tworzeniu fuzzerów

Python jest językiem programowania, który niewątpliwie zrobił wrażenie na doświadczonych

programistach. Oczywiście, każdy powinien programować w języku odpowiadającym osobistym preferencjom – ale faktem jest, że coraz więcej osób wykorzystuje Pythona do tworzenia oprogramowania testującego inne aplikacje pod kątem błędów mogących zagrozić bezpieczeństwu. Jest to zasługa prostoty samego języka, przejrzystości kodu źródłowego, ale także ogromnych możliwości manipulowania ciągami tekstowymi. Co więcej, Python jest językiem o wiele mniej skomplikowanym niż C/C++, a napisanie w pełni funkcjonalnego programu zajmuje kilkakrotnie mniej czasu. Jedynym minusem jest mniejsza szybkość pracy programu wynikająca ze skryptowej natury Pythona.

Framework Peach

Składniki frameworku Peach:
Generators – służą do generowania różnego rodzaju danych. Posiadają szeroki wachlarz możliwości, poczynając od danych statycznych (niezmiennych łańcuchów tekstowych), poprzez części adresów URL, a na nagłówkach plików graficznych kończąc. Możemy używać także bardziej szczegółowych danych – złych adresów IP, nieprawidłowych łańcuchów tekstowych czy nieodpowiednich nazw plików.

Publishers – jest to zbiór miejsc docelowych, do których będą wysyłane generowane dane. Peach pozwala nam wysyłać dane do standardowego wyjścia, plików, połączeń ODBC, TCP i UDP oraz sesji FTP. Jest to standardowy zbiór, który oczywiście możemy rozszerzyć poprzez własne implementacje.

Transformers – pozwalają zmieniać dane według określonego wzorca. Peach udostępnia nam szereg takich narzędzi obsługujących m. in. kodowanie bzip2, gzip, algorytmy MD5 oraz SHA1, a także zmianę kodowania (UTF8, UTF16, URL).

Group – grupy powiązane są z generatorami. Używane są do modyfikacji kolejnych wartości produkowanych przez generatory. Za ich pomocą możemy tworzyć schematy pracy generatorów i uzyskać nad nimi pełną kontrolę.

Autorski fuzzer

W Internecie można znaleźć wiele fuzzerówna bardzo zróżnicowanym poziomie. Natomiast autorski fuzzer można stworzyć do automatyzacji testowania aplikacji webowej przykładowo gdy testowana aplikacja posiada nietypową strukturę (nietypowe katalogi, pliki, przechowywane dane), gdy znamy, przynajmniej w minimalnym stopniu, budowę aplikacji, co pozwala na lepsze dobranie danych testowych oraz gdy aplikacja bazuje na danych, które są trudne do wygenerowania przez tradycyjne fuzzery webowe (np. nietypowe formaty plików, protokoły). Wówczas warto pomyśleć nad własnym fuzzerem

Elementami składowymi fuzzera są następujące bloki funkcjonalne:

  • Blok odpowiadający za nawiązywanie połączeń, wysyłanie, odbieranie oraz kodowanie danych .
  • Blok odpowiedzialny za generowanie danych wysyłanych do testowanej aplikacji.
  • Blok odpowiedzialny za identyfikację punktów wejściowych, do których będą wysyłane dane.
  • Blok odpowiedzialny za wykrywanie błędów.
  • Blog odpowiedzialny za agregowanie wyników działania fuzzera.

Każdy z powyższych bloków ma identyczny priorytet i jest integralną częścią fuzzera.

Wady i zalety

Zalety: pełna automatyzacja testu, błędy trudne do identyfikacji za pomocą manualnych testów, możliwość szybkiego znalezienia błędu.

Wady: brak możliwości wykrycia błędów logicznych, niejednolitość testów – wykorzystanie losowości, pojedynczy test jest trudny do powtórzenia, brak możliwości określenia dokładnego czasu potrzebnego na wykonanie testu -> dynamicznie zmieniający się zbiór wartości testowych.

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s

%d blogerów lubi to: