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é.