Statyczna analiza kodu
Analiza statyczna kodu - analiza struktury kodu źródłowego lub kodu skompilowanego bez jego uruchomienia.
Static Analysis Software Testing (SAST) - narzędzia do analizy statycznej
Analiza statyczna a inspekcja kodu („code review”)
SDL for Agile
Agile Development Using Microsoft Security Development Lifecycle - analiza statyczna w każdym sprincie
Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx
Metody analizy
- analiza leksykograficzna - wyszukiwanie niebezpiecznych konstrukcji w kodzie źródłowym, zazwyczaj na podstawie zestawu reguł, różnych heurystyk i dopasowania do wzorców błedów
- metody formalne - oparte na matematycznej definicji zachowania programu
- modele matematyczne
- reguły logiczne Hoare_logic
- analiza przepływu Data-flow_analysis
- obliczanie metryk kodu źródłowego. Ocena jakości kodu źródłowego na podstawie danych statystycznych.
Cechy
- Łatwość użycia, prostota wdrożenia w cykl wytwarzania oprogramowania
- Automatyzacja, integracja z narzędziami continius integrations
- Szybkie wykrywanie błędów, których naprawa jest prosta i mało kosztowna
- nie wymaga uruchomienia aplikacji
- łatwe do zrównoleglenia
- Możliwości rozszerzania: własne reguły, wtyczki,
- Integracja z innymi narzędziami: serwery automatyzacji, IDE, kontrola wersji
- Dużo darmowych narzędzi
Cechy c.d.
- Wymagany dostęp do źródeł
- Reguły wykrywają zazwyczaj proste błędy (nie zastąpią ręcznego sprawdzenia)
- Dużo szumu, zbyt czułe (duże prawdopodobieństwo false positive)
- Każde narzędzie zazwyczaj pokrywa pewien zakres testów (do 14% błędów?!) dlatego warto korzystać z kilku.
- Istnieją narzędzia integrujące wiele narzędzi SAST, np: CodeEx, Yast (open source)
- Nie zastąpi „ręcznego” sprawdzania (code review)
Czego dotyczy analiza statyczna
- analiza poprawności składni
- luki w bezpieczeństwie, także błędy które mogą pojawić się przy specyficznych danych wejściowych
- detekcja backdoors, niebezpieczne i nieaktualne funkcje, wycieki pamięci, przepełnienie bufora, używanie niezainicjowanych zmiennych, SQL Injections,
- jakość kodu, ocena stylu, powtórzenia kodu, nieużywane fragmenty kodu, …
- wydajność, wykrywanie wąskich gardeł, niewydajne konstrukcje, sugestie dotyczące poprawienia wydajności
- zgodność z dobrymi praktykami, zachowanie standardów, norm nazewniczych, problemy z przenośnością kodu
Dlaczego analizować kod?
Statyczna analiza programu pozwala na:
- zwiększenie wydajności i stabilności poprzez zasady oparte na dobrych praktykach,
- unikniecie typowych błędów podczas programowania,
- dostarczenie struktury do zarządzania standardami kodu.
- wymuszenie zasad i standardów pisania kodu
- zwiększanie bezpieczeństwa poprzez kolejny etap testowania
Dlaczego analizować kod?
Koszt naprawy błędu w zależności od momentu wykrycia
Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx
Narzędzia
Lint - UNIX V7 1979, historyczny program od którego nazwy często określa się narzędzia do analizy i szukania błedów
Wielojęzykowe
- rats (rough auditing tool for security) C, C++, Perl, PHP, Python
- PMD Java, JavaScript, XML, XSL (zawiera CPD analiza powtórzeń: C, C++, C#, PHP, Ruby, Fortran)
- Yasca Java, C/C++, HTML, JavaScript, ASP, ColdFusion, PHP, COBOL, .NET, and other languages + integracja z innymi SAT
- VisualCodeGrepper C/C++, C#, VB, PHP, Java and PL/SQL
Wiele innych:
Ograniczenia
- Jest wiele typów błędów które ciężko jest wykryć
- Trudno wykrywalne błędy związane są z konfiguracją lub logiką biznesową.
- Dodatkowe moduły, biblioteki, konteksty dodawane przez frameworki
- Skomplikowane algorytmy i architektury
// calculate the number of days int days = hours / 23;