Analiza statyczna kodu - analiza struktury kodu źródłowego lub kodu skompilowanego bez jego uruchomienia

może być wdrożona w potok ciągłej integracji, automatyczna weryfikacja jakości kodu

nie jest w stanie wyeliminować „ręcznej” inspekcji kodu („code review”)

kompilatory głownie analizują skłądnię ale również posiadają bogate funkcji analizy kodu

analiza w czasie pisania kodu, quick fix - schematy naprawy typowych wad kodu

analiza poprawności składni

bezpieczeństwo: np. brak obsługi specyficznych danych wejściowych, detekcja backdoors, niebezpieczne i nieaktualne funkcje, wycieki pamięci, przepełnienie bufora, używanie niezainicjowanych zmiennych, SQL Injections, ...

jakość i styl kodu: zgodność z dobrymi praktykami, zachowanie jednolitej konwencji nazewniczej w projekcie/organizacji, detekcja powtórzeń i nieużywanych fragmentów kodu

wydajność: sugestie zmian kodu w celu podniesienia szybkości działania

Microsoft Security Development Lifecycle

Practice #10: Perform Static Analysis
Analiza statyczna w każdym sprincie

Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx

analiza leksykograficzna - wyszukiwanie niebezpiecznych konstrukcji w kodzie źródłowym, zazwyczaj na podstawie zestawu reguł, różnych heurystyk i dopasowania do wzorców błędów

metryki kodu źródłowego - ocena jakości kodu źródłowego na podstawie danych statystycznych

metody formalne - oparte na matematycznej definicji zachowania programu

modele matematyczne

reguły logiczne Hoare_logic

analiza przepływu Data-flow_analysis

Szybkość działania - szybkie wykrywanie błędów, których naprawa jest prosta i mało kosztowna

nie wymagają uruchamiania programu

łatwe do zrównoleglenia

Łatwość użycia - proste we wdrożeniu w cykl wytwarzania oprogramowania

Automatyzacja - integracja z narzędziami continius integrations, serwery automatyzacji, IDE, kontrola wersji

Możliwości rozszerzania: własne reguły, wtyczki, ...

Dużo darmowych narzędzi

Wymagany dostęp do źródeł

Reguły wykrywają zazwyczaj proste błędy i nie są w stanie wyeliminować ręcznego sprawdzenia kodu

Dużo szumu, zbyt czułe - duże prawdopodobieństwo zaklasyfikowanie poprawnego fragmentu jako błędu (false positive)

Każde narzędzie zazwyczaj pokrywa pewien zakres testów. Dlatego warto korzystać z kilku różnych skanerów kodu.

Koszt naprawy błędu rosną im potniej błąd zostanie wykryty

Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx

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

analizując sygnalizowane błędy można się sporo nauczyć na temat dobrych praktyk bezpiecznego programowania

Lint - UNIX V7 1979, historyczny program od którego nazwy często określa się narzędzia do analizy i szukania błedów

C/C++: cppcheck, clint, splint, clang, frama-c

PHP: pixy, php-sat

Java: FindBugs, jlint, PMD, Checkstyle

Python: pylint

dotNet: FxCop, StyleCop, CAT.NET, Resharper

JavaScript: jslint

HTML: tidy (wersja online) , W3C Validator

CSS: W3C CSS Validator , http://csslint.net/csslint

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: Liata narzędzi na Wikipedii, Source Code Security Analyzers

Jest wiele typów błędów, które ciężko jest wykryć, np. błędy związane są z konfiguracją lub logiką modelowanego problemu

Problemem są zależności, dodatkowe moduły, biblioteki, konteksty dodawane przez frameworki

Skomplikowane algorytmy i architektury bardzo ciężko jest analizować

// calculate the number of days int days = hours / 23;

Statyczna analiza bezpieczeństwa kodu aplikacji

Statyczna analiza kodu źródłowego by Tomasz Nowak

VS 2013 - program FxCop
dedykowane okno z wynikami analizy

VS 2015, 2017 - FxCop
wyniki analizy w oknie Error List

VS 2019 - kompilator .NET + pakiety analizatorów

Build -> Run Code Analysis
Analyze -> Run Code Analysis

VS 2013	VS 2015, 2017, 2019

kompilator .NET Compiler Platform („Roslyn”)

dodatkowe analizatory w pakietach NuGet:

FxCopAnalyzers
rekomendowany przez MS zestaw analizatorów
.NET Framework Design Guidelines

StyleCopAnalyzer
analizator stylu, uzupełnia reguły FxCop

inne rozszerzenia, np.: Resharper

analiza kodu w czasie pisania kodu w edytorze

Quick Action - sugestie naprawy kodu

czyszczenie kodu

sugestie naprawy błędu, czasem kilka do wyboru

np. naprawa błędów składni (literówki), usuwanie nieużywanych zmiennych, transformacje kodu do innej postaci

typowe szybkie akcje naprawy

Error (czerwony) Warning (zielony) Info (szary) Hidden None Default

ustawienia edytora tekstu Tools -> Options -> Text Editor

.editorconfig ustawienia analizy stylu w postaci pliku tekstowego

obecny w strukturze projektu nadpisuje domyślne ustawienia w zakresie folderu

automatyczne czyszczenie kodu w całym projekcie

tylko defekty, które nie niosą ryzyka uszkodzenia kodu

można konfigurować własne profile wybierając reguły, które mają być zaaplikowane

Microsoft.CodeAnalysis.FxCopAnalyzers

StyleCop.Analyzers

reguły spełniają wytyczne: .NET Framework Design Guidelines

analizator C# działa na skompilowanym kodzie

ponad 200 defektów: aktualna lista reguł

konwencja nazewnicza (Naming)

konstrukcje kodu (Designe)

użycie, przepływ danych (Usage)

lokalizacja (Globalization)

wydajność (Performance)

czytelność kodu (Reliability)

bezpieczeństwo (Security)

utrzymanie kodu (Maintainability)

przykład: CA1051: Do not declare visible instance fields

analizator kodu C#, działa na kodzie źródłowym

aktualna lista reguł

zasady robienia wcięć (SpecialRules),

poprawianie czytelności kodu (ReadabilityRules),

ujednolicanie kolejności elementów kodu (OrderingRules),

konwencje nazewnicze (NamingRules),

zasady dotyczące dokumentowania kodu (DocumentationRules), ...

przykład: SA1119 Nadmiarowe nawiasy

int x = (5 + b);

analizatory są dostępne w zasobach projektu

zmiana poziomu ważności dla reguł możliwa jest z menu szybkiej akcji oraz z poziomu listy błędów

można tworzyć własne zestawy reguł (rule set)
Solution Explorer -> Analyzers -> Open Active Rule Set

po zapisaniu zmian w projekcie pojawi się plik ruleset z naszymi ustawieniami

ustawienie ważności serverity = None wyłącza ostrzeżenia danego typu

Suppress -> In Source: w kodzie, w miejscu w którym występuje podatność
#pragma warning disable CA1234

Suppress -> In Supression File: w dodatkowym pliku określającym wyłączone reguły dla projektu porpzez atrybut SuppressMessage()

Statystyki oceniające złożoność kodu oraz skalę trudności jego utrzymania i rozwoju

Analyse -> Calculate Code Metrics

Maintainability Index - utrzymywalność kodu, wartość w zakresie 0-100, uwzględnia złożoność struktury kodu i ilość operacji w stosunku do liczby linii
20-100 good , 10-19 moderately, 0-9 low

Cyclomatic Complexity - złożoność struktury kodu określona ilością różnych ścieżek wykonania. Program z dużą liczbą ścieżek wymaga wielu testów do pokrycia kodu i jest trudniejszy w utrzymaniu

Depth of Inheritance - głębokość dziedziczenia. Im wyższa wartość tym większe ryzyko, że zmiana w klasie bazowej uszkodzą działanie klas potomnych.

Class Coupling - uwikłanie klas, ilość unikatowych obiektów od których zależy badany fragment kodu (np. wartości zwracane, wywołania funkcji). Duża wartość wskazuje trudności z ponownym wykorzystaniem kodu, jego rozwijaniem oraz utrzymaniem

Lines of Source Code ilość linii kodu

Lines of Executable code - przybliżona ilość instrukcji wykonywalnych (VS2019)

Ostrzeżenia analizatora FxCop związane z metrykami (domyślnie wyłączone)

CA1501: Avoid excessive inheritance

CA1502: Avoid excessive complexity

CA1505: Avoid unmaintainable code

CA1506: Avoid excessive class coupling

Analiza kodu w programie Visual Studio dokumentacja Visual Studio

StyleCop i FxCop – statyczna analiza kodu by Weronika Mularczyk

StyleCop: A Detailed Guide to Starting and Using It by Peter Morlion

Statyczna analiza bezpieczeństwa kodu aplikacji — FxCop by Adrian “Vizzdoom” Michalczyk

Wikipedia: FxCop, StyleCop