STATICKÁ ANALÝZA ZDROJOVÉHO KÓDU

Až příliš často se stává, že nově vydaná softwarová řešení obsahují chyby. V softwaru určeném např. pro finanční správu či databázové systémy se mohou nalézat chyby nejen ve větším počtu, ale i takové závažnosti, že je ohroženo zabezpečení celého systému. Žádný antivir, firewall ani IPS sonda naše systémy neochrání, pokud je program špatně napsán a umožňuje útočníkům najít skulinu v aplikacích za cílem neoprávněného přístupu. Vývojáři by tedy měli dobře zvážit, zda by se neměli pokusit takové zranitelnosti podchytit během kódování alespoň automatickými testy.

 

Podívejme se na možný způsob, jak lépe zabezpečit naše nástroje a data v podstatě přímo u zdroje: U vývojářů programového vybavení. Ani ti se nemohou zbavit jisté odpovědnosti za to, že jeho program umožňuje útočníkům jednodušší přístup k datům uživatelů.
Proto by měli při tvorbě programu brát v úvahu i bezpečnost svého kódu, čehož mohou dosáhnout procházením kódu a testováním. Naštěstí stejně jako automatické nástroje pro test funkčnosti programu existují i nástroje, které prochází zdrojový kód a hledají bezpečnostní zranitelnosti a možné způsoby napadení.

 

Statická analýza kódu je sada metod pro analýzu počítačových programů, které jsou aplikovány bez jejich spuštění (softwarová analýza, která je aplikována na spuštěné programy, se nazývá dynamická softwarová analýza).
V nejběžnějších případech je analýza prováděna právě na zdrojovém kódu, nebo nějaké formě objektových kódů.

 

Analyzátory zdrojového kódu

Statická kontrola kódu pomáhá zlepšovat kvalitu softwaru a na tuto kvalitu je, obzvláště v některých odvětvích, kladen stále větší důraz. Nejprve se statická kontrola kódu začala prosazovat ve zdravotnictví, energetice a letectví. Díky těmto odvětvím máme nyní již celou řadu kvalitních analyzátorů zdrojového kódu, které můžeme využít prakticky v kterémkoliv jiném oboru.

 

Vedle komerčních analyzátorů zdrojového kódu, jako je HPE Security Fortify nebo Checkmarx Static Code Analysis zde exceluje také open-source projekt SonarQube. Právě na něj se dnes podrobněji zaměříme.

 

SonarQube

SonarQube, dříve známý pod názvem Sonar, je otevřená platforma pro řízení kvality zdrojového kódu. Slouží k inspekci zdrojového kódu a snaží se nalézt funkční chyby v softwaru, neefektivní kód nebo i bezpečnostní zranitelnosti. Jádro programu je šířeno pod licencí LGPL v3, pod svobodnou licencí jsou také k dispozici i některé pluginy pro analýzu kódu. Celkem je k dispozici minimálně 20 programovacích jazyků, které Sonar umí otestovat a mezi ty volně šířené patří především PHP, Java, Java Script, C#, Python, XML a CSS. To, že SonarQube patří mezi špičku ve svém oboru, dokládají i četná ocenění, jako je Productivity Winner of the Jolt Product Excellence Awards 2009 a 2010 a finalista 2012.

 

Ostatní pluginy je třeba zaplatit, stejně tak vyšší, komerční edice je poskytována za úplatu. Mezi výhody komerční edice patří podpora kontroly více projektů najednou, trvalá technická podpora nebo dokonce školení, či licence pro větší počet instalací. Ceny jsou uváděny jako roční poplatky a Švýcarští SonarSource je vyčíslují na tisíce eur. Taková řešení jsou ale spíše mířena na velké vývojářské firmy a menší týmy si mohou vystačit jen s jedním či dvěma placenými pluginy, nebo jim postačí i volně šířené části.

 

SonarQube je navržen jako platforma pro tzv. Continuous Inspection. Možná je některým čtenářům znalým ve vývoji softwaru povědomý termín Continous Integration (CI). Tyto dva termíny jsou podobné, ale nezaměnitelné.
Zatímco SonarQube hledá nedodělky a zranitelnosti v kódu programu, nástroje pro integraci, jako např. Travis CI, kód kompilují a následně kontrolují praktickou funkci programu, zejména zachování kompatibility s ostatními moduly v SW projektu. Protože lze SonarQube integrovat do prostředí jako Git a právě Travis CI, můžeme oba tyto kroky ve vývoji skloubit a nechat provádět automaticky při každé změně.

 

Veškerou potřebnou dokumentaci i popis produktu naleznete na oficiálních stránkách SonarQube.
Můžete si zde SonarQube rovnou stáhnout, zároveň zde najdete odkazy na oficiální dokumentaci, komunitní blogy i jiné zdroje informací, výpisy podporovaných pluginů a IDE. Pro integraci do IDE je určen SonarLint. Preferovaná vývojová prostředí, do kterých může být integrován jsou Eclipse, IntelliJ IDEA a Visual Studio, ale i ostatním prostředím SonarLint zjednoduší skenování kódu z příkazové řádky.

 

Instalace

Instalace Sonaru je relativně jednoduchá a můžete ji zvládnout za pár minut. Než se však pustíte do vlastní instalace, pečlivě si prostudujte požadavky na systém pro instalaci dané verze, zejména věnujte pozornost podporovaným verzím Javy, databáze a webového prohlížeče.
Pokud váš systém nesplňuje tyto požadavky, musíte očekávat problémy a těžko se na ně hledá řešení.

Před vlastní instalací je nutné mít nainstalovanou správnou verzi Javy. Instalaci zahájíme rozbalením staženého souboru SonarQube do produkčního adresáře (např. /srv/sonar/ nebo C:\localweb\sonar\).

Založíme prázdnou databázi „sonarqube“ s uživatelem „sonarqube“.

V souboru <install_directory>/conf/sonar.properties je zapotřebí parametry databáze zapsat do příslušné sekce, např. pro databázi PostgreSQL to bude

sonar.jdbc.username=sonarqube

sonar.jdbc.password=mypassword

sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube

 

Ovladače pro databázový engine jsou již v instalačním adresáři obsaženy. Pouze v případě databáze Oracle je nutno uložit příslušné JDBC ovladače do adresáře<install_directory>/extensions/jdbc-driver/oracle.

Nyní již můžeme spustit webový server SonarQube. Pokud vám stačí výchozí nastavení pro spuštění na adrese
http://localhost:9000,
nemusíte již nic dalšího konfigurovat. Pro změnu portu, případně dalších parametrů, můžete opravit další řádky v souboru
<install_directory>/conf/sonar.properties,
např.

sonar.web.host=192.0.0.1

sonar.web.port=80

sonar.web.context=/sonar

 

Server spustíte pomocí skriptu příslušného vašemu OS z adresáře Sonaru:

  • V systému Linux/MAC OS: bin/<YOUR OS>/sonar.sh start

  • V systému Windows: bin/windows-x86-XX/StartSonar.bat

Ve webovém prohlížeči nyní spustíte
SonarQube na adrese http://localhost:9000 (výchozí přihlašovací údaje administrátora jsou
admin/admin).

V dalším kroku přistoupíme k instalaci potřebných pluginů, především těch pro podporu
programovacích jazyků, se kterými budeme pracovat.

Dále doporučuji provést update neaktuálních pluginů v sekci Update Center.

 

Jakmile je toto vše hotovo, můžeme přistoupit k analýze kódu, kde máme na výběr z těchto metod:

  • SonarQube
    Scanner
    : Spouštění analýzy kódu z příkazové řádky

  • SonarQube
    Scanner for MSBuild
    : Tento
    skener je doporučenou metodou pro spouštění analýzy kódu v
    projektech .Net, protože se jedná o výsledný produkt spolupráce
    vývojových týmů SonarSource a Microsoftu. Umožňuje spouštění
    z příkazové řádky nebo ve vývojovém prostředí Jenkins.
    Doporučuji dobře prostudovat tabulku kompatibility.

  • SonarQube
    Scanner for Ant
    : Sonar scanner přizpůsobený pro integraci do
    vývojového prostředí Apache Ant.

  • SonarQube
    Scanner for Maven
    : Minimalistický skener pro analýzu kódu ve
    vývojovém prostředí Maven pro projekty psané v Javě.

  • SonarQube
    Scanner for Gradle
    : Skener pro integraci ve velmi
    flexibilním vývojovém prostředí Gradle. Poskytuje zřejmě tu
    nejsnazší cestu k analýze kódu v tomto prostředí. Opět
    doporučuji nejprve ověřit kompatibilitu.

  • SonarQube
    Scanner For Jenkins
    : Tento plugin centralizuje globální
    nastavení Sonar skeneru v prostředí Jenkins. Do prostředí pak
    můžete vložit standardní spouštěče pro SonarQube Scanner,
    SonarQube Scanner for MSBuild nebo SonarQube Scanner for Maven.

Popisovat všechny tyto metody pro jednotlivé skupinky uživatelů rozličných prostředí by mohlo naše lesy zabolet, pokud bych je nechal všechny publikovat zde. Podívejme se tedy na obecnější metodu, která při menší snaze poslouží všem stejně tak dobře. V případě konkrétnějšího zájmu vám jistě pomůže dokumentace uvedená na konci článku.

 

Skenování kódu z řádky

Nejprve stáhneme aktuální verzi sonar-scanner a rozbalíme ho do produkčního adresáře (např. /srv/sonar-scanner/
nebo C:\localweb\sonar-scanner\).
Nastavíme aktuální cestu k webovému serveru v souboru <install_directory>/conf/sonar-scanner.properties

 

#-----
Default SonarQube server

sonar.host.url=http://localhost:9000

 

Musíme založit konfigurační soubor projektu. Pokud budete mít pouze
jeden projekt, můžete ho vložit přímo do souboru <install_directory>/conf/sonar-scanner.properties, např.

 

sonar.projectKey=php:project

sonar.projectName=PhpProject

sonar.projectVersion=1.0

sonar.sources=/usr/local/src/phpproject

sonar.projectBaseDir=/usr/local/src

 

Další možnosti nastavení projektu naleznete v oficiální dokumentaci SonarQube Scanner

 

Praktická ukázka použití.

Skener spustíte pomocí skriptu příslušného vašemu OS z adresáře binSonar-scanneru:

  • V systému Linux: ./sonar-scanner

  • V systému Windows: sonar-scanner.bat

Ve webovém prohlížeči nyní spustíte SonarQube na adrese http://localhost:9000 a pokud skener již doběhl, uvidíte svůj projekt po přihlášení již na nástěnce a pokud ho otevřete, můžete pracovat s výsledky kontroly kódu.

 


Obrázek 1: Nástěnka webového prostředí SonarQube

 

Pod údaji Bugs & Vulnerabilities se skrývají počty nalezených chyb a zranitelností v kódu. Pokud kliknete na údaj Bugs, zobrazí se seznam nalezených chyb

 


Obrázek 2: Ukázka kontrolního hlášení

 

Kliknutím na symbol „>“ vpravo si můžete zobrazit detail nalezené chyby přímo ve zdrojovém kódu

 


Obrázek 3: Detail nalezené chyby

 

K dispozici máte dokonce nápovědu a příklad správné programové konstrukce.

 

Z hlediska kybernetické bezpečnosti, než údaj Bugs, je daleko důležitější údaj Vulnerabilities, tedy počet zranitelností naší aplikace. Tyto zranitelnosti jsou vyhledávány na základě databáze zranitelností CVE a tudíž s takřka stoprocentní jistotou. Statická analýza zdrojového kódu tedy významně přispívá k tvorbě bezpečných aplikací. Je pochopitelné, že tato analýza nemůže odhalit všechny potenciální chyby, které programátor může udělat, ale na ty známé chyby nás spolehlivě upozorní. Navíc údajem Bugs nás upozorní na zbytečné a nevhodné programové konstrukce.
Všechna tato upozornění nemusíme brát striktně jako chyby a pokud chceme některá upozornění na chyby vypnout, můžeme si přenastavit Quality Profiles a Quality Gates, případně si můžeme pomoci i úpravou pravidel v sekci Rules. Při další analýze příslušného projektu nás bude Sonar upozorňovat již pouze na chyby, které dle nastavené Quality Gate bude považovat za důležité.