Jak znaleźć lukę w oprogramowaniu

Wykorzystując pewne osobliwości popularnego frameworka Ruby on Rails, naukowcy z MIT opracowali system, który potrafi szybko przeszukiwać dziesiątki tysięcy linii kodu aplikacji, aby znaleźć luki w zabezpieczeniach.

W testach na 50 popularnych aplikacjach internetowych napisanych z wykorzystaniem Ruby on Rails system znalazł 23 nierozpoznanych wcześniej luk w zabezpieczeniach, a analiza nie trwała dłużej niż 64 sekundy.

Naukowcy zaprezentowali swoje wyniki na Międzynarodowej Konferencji Inżynierii Oprogramowania, w maju b.r.

Według Daniela Jacksona, profesora na Wydziale Elektrotechniki i Informatyki, nowy system wykorzystuje technikę zwaną analizą statyczną, która stara się opisać w bardzo ogólny sposób, w jaki sposób w programie przepływają dane.

„Klasycznym przykładem może być program, który przeprowadza działania matematyczne na liczbach: liczby można podzielić na dodatnie, ujemne i zero”, wyjaśnia Jackson. Analiza statyczna będzie oceniać każdą operację programu w zależności od od znaku wejściowych liczb. Dodanie dwóch liczb dodatnich daje liczbę dodatnią; dodanie dwóch liczb ujemnych daje wynik ujemny; mnożąc dwie liczby ujemne dostajemy znowu liczbę dodatnią i tak dalej.

„Problem polega na tym, że analiza nie może być całkowicie dokładna ponieważ czasem tracimy informacje,” mówi Jackson. Wracając do poprzedniego przykładu: Jeśli dodajemy liczbę dodatnią i ujemną, to nie wiadomo czy wynik będzie dodatni, ujemny czy zerowy. Większość prac o analizie statycznej koncentruje się na uczynieniu tej analizy bardziej skalowalnej i dokładnej, aby przezwyciężyć tego rodzaje problemy.

W przypadku aplikacji internetowych, koszt osiągnięcia dużej dokładności jest niewspółmiernie wysoki. Analizowany program jest po prostu ogromny duży. Nawet jeśli napiszemy mały program, to w rzeczywistości znajduje się na szczycie ogromnego gmachu biblioteki i wtyczek. Jeśli spojrzeć na coś w rodzaju aplikacji internetowej napisanej w języku, takim jak Ruby on Rails, to może okazać się, że próba przeprowadzenia konwencjonalnej analizy statycznej jest zadaniem prawie niewykonalnym.

Jednak to właśnie ta ogromna biblioteka dostarczyła Jacksonowi i jego były studentowi Josephowi Near sposobu, aby dokonać analizy statycznej programów napisanych w Ruby on Rails.

Biblioteka stanowi zbiór podprogramów, których programiści używają często. Zamiast przepisywania tych samych funkcji dla każdego nowego programu, programista może po prostu importować je z biblioteki. W Ruby on Rails istnieje tendencja do definiowania nawet najbardziej podstawowych operacji w bibliotekach. Każdy dodatek, każde przypisanie konkretnej wartości zmiennej prowadzi do importu kodu z biblioteki.

Near przepisał te biblioteki tak, że operacje określone w nich opisują swoje własne zachowanie w języku logicznym. To przekształciło interpreter Ruby on Rails (który zamienia programy Rails wysokiego poziomu na kod do odczytu maszynowego) w narzędzie analizy statycznej. Interpreter programu generuje formalny opis, wiersz po wierszu, sposobu w jaki dane przepływają przez program.

W swojej pracy doktorskiej, Near użył tej ogólnej maszynerii aby zbudować trzy różne debugery dla Ruby on Rails, wymagających różnych stopni zaangażowania programisty.

Near zidentyfikował siedem różnych sposobów, w jakich aplikacje internetowe zazwyczaj sterują dostępem do danych. Niektóre dane są dostępne publicznie, niektóre są dostępne dla wszystkich użytkowników, którzy są aktualnie zalogowani, niektóre są prywatne dostępne tylko przez pojedynczych użytkowników, dla administratorów i tak dalej.

Dla każdego z tych wzorców danych dostępowych, Near opracowali prosty logiczny model opisujący, jakie operacje użytkownik może wykonać, na jakich danych i w jakich warunkach. Z opisów generowanych przez zmienione biblioteki jego narzędzie (zwane Space) może automatycznie określić, czy dany program jest zgodny z tymi modelami. Jeśli tak nie jest, to jest prawdopodobne, że program ma lukę bezpieczeństwa.

Korzystanie ze Space wymaga dostępu do kodu aplikacji i określenia jakie zmienne i funkcje programu odpowiadają jakim aspektom modeli. Nie jest bardzo uciążliwe: Near był w stanie odwzorowywać wszystkie 50 aplikacji które oceniał. To mapowanie powinno być jeszcze łatwiejsze dla programisty zaangażowany w tworzenie danej aplikacji od samego początku, niż dla kogoś z zewnątrz tak jak Near.

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Dodaj komentarz