Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ~~REVEAL~~ ====== 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 automatycznej analizy statycznej Analiza statyczna a inspekcja kodu ("code review") ===== SDL for Agile ===== Microsoft Security Development Lifecycle {{:zajecia:npr_2015_1:microsoft-static.png?800|}} Practice #10: Perform Static Analysis \\ Analiza statyczna w każdym sprincie <wrap lo>Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx</wrap> ===== 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łędów * **metody formalne** - oparte na matematycznej definicji zachowania programu * modele matematyczne * reguły logiczne [[wp>Hoare_logic]] * analiza przepływu [[wp>Data-flow_analysis]] * **metryki kodu źródłowego** - ocena jakości kodu źródłowego na podstawie danych statystycznych ===== Cechy ===== * 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 ===== Wady ===== * 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 (do 14% błędów?!). Dlatego warto korzystać z kilku różnych skanerów kodu. Istnieją narzędzia integrujące wiele narzędzi SAST, np: [[http://codedx.com/|CodeEx]], Yast (open source), dlatego warto korzystać z kilku ===== 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 * analizując sygnalizowane błędy można się sporo nauczyć na temat dobrych praktyk bezpiecznego programowania ===== Dlaczego analizować kod? ===== Koszt naprawy błędu w zależności od momentu wykrycia {{zajecia:npr:benefits.jpg}} <wrap lo>Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx</wrap> ===== Narzędzia ===== [[http://www.unix.com/man-page/FreeBSD/1/lint|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%%++%%: [[http://cppcheck.sourceforge.net/|cppcheck]], clint, [[http://www.splint.org/|splint]], [[http://clang-analyzer.llvm.org/|clang]], [[http://frama-c.com/|frama-c]] * PHP: [[https://github.com/oliverklee/pixy|pixy]], [[http://www.program-transformation.org/PHP/PhpSat|php-sat]] * Java: [[http://findbugs.sourceforge.net/|FindBugs]], [[http://sourceforge.net/projects/jlint/|jlint]], PMD, Checkstyle * Python: [[http://pylint.org/|pylint]] * dotNet: FxCop, CAT.NET * JavaScript: [[http://www.jslint.com/|jslint]] * HTML: [[http://tidy.sourceforge.net/|tidy]] ([[http://infohound.net/tidy/|wersja online]]) , [[http://validator.w3.org/|W3C Validator]] * CSS: [[http://jigsaw.w3.org/css-validator/|W3C CSS Validator]] , [[http://csslint.net/csslint]] ===== Wielojęzykowe ===== * [[http://code.google.com/p/rough-auditing-tool-for-security/|rats]] (rough auditing tool for security) C, C%%++%%, Perl, PHP, Python * [[http://pmd.sourceforge.net/|PMD]] Java, JavaScript, XML, XSL (zawiera CPD analiza powtórzeń: C, C%%++%%, C#, PHP, Ruby, Fortran) * [[http://www.scovetta.com/yasca.html|Yasca]] Java, C/C%%++%%, HTML, JavaScript, ASP, ColdFusion, PHP, COBOL, .NET, and other languages + integracja z innymi SAT * [[http://sourceforge.net/projects/visualcodegrepp/|VisualCodeGrepper]] C/C%%++%%, C#, VB, PHP, Java and PL/SQL * Wiele innych: * [[wp>List_of_tools_for_static_code_analysis]] * [[http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html|Source Code Security Analyzers]] ===== Ograniczenia ===== * Jest wiele typów błędów, które ciężko jest wykryć, np. błędy związane są z konfiguracją lub logiką biznesową * Problemem są zależności, dodatkowe moduły, biblioteki, konteksty dodawane przez frameworki * Skomplikowane algorytmy i architektury bardzo ciężko jest analizować <code C> // calculate the number of days int days = hours / 23; </code> ===== Źródła ===== * [[http://sekurak.pl/statyczna-analiza-bezpieczenstwa-kodu-aplikacji-czesc-1-wprowadzenie/|sekurak.pl]] * [[http://security.psnc.pl/files/szkolenia/KDM_101116.pdf|Tomasz Nowak, Statyczna analiza kodu źródłowego]] * [[http://cppcheck.sourceforge.net/|Cppcheck]] * [[http://splint.org/pubs.html|Splint publications]]