Zkratka proStatic Application Security TestingSAST se čte „sest“ nebo hláskovaně „es-a-es-té“TakéSAST, Statická analýza, Linting, Static Application Security TestingPokročilý

Definice

Statická analýza kódu je zkoumání zdrojového kódu nástrojem bez jeho spuštění, které hledá chyby, bezpečnostní zranitelnosti, porušení konvencí a podezřelé konstrukce. Nástroj čte kód jako strukturu (syntaktický strom, graf toku řízení a dat) a hlásí místa, která mohou selhat. Běží typicky v editoru, při commitu a v CI pipeline.

Kategorie: Softwarový vývojAktualizováno

Co nástroj vidí, aniž by kód spustil

Statická analýza pracuje s kódem jako s textem, který nejprve rozparsuje do abstraktního syntaktického stromu (AST). Nad tímto stromem pak staví graf toku řízení (kudy může program projít) a graf toku dat (odkud kam putují hodnoty). Díky tomu umí odpovědět na otázky typu „může se tato proměnná dostat do SQL dotazu, aniž by prošla escapováním?“ nebo „existuje větev, kde funkce nic nevrací?“, aniž by kdokoli program spustil.

Rozsah je široký. Nejjednodušší vrstvou jsou lintery kontrolující styl a zjevné přehmaty (nepoužitá proměnná, chybějící await). Nad nimi stojí typové kontroly, které hlídají, že hodnoty odpovídají deklarovaným typům. Nejnáročnější vrstvou je bezpečnostní analýza (SAST) hledající cesty od nedůvěryhodného vstupu k nebezpečné operaci, tedy potenciální zranitelnost.

Proč analýza nikdy neuvidí všechno

Otázka, zda se program v obecném případě zachová určitým způsobem, je nerozhodnutelná. Každý nástroj proto volí kompromis. Konzervativní analyzátor raději nahlásí i to, co ve skutečnosti problém není, a produkuje falešně pozitivní nálezy. Agresivně filtrující nástroj hlásí méně šumu, ale některé reálné chyby přehlédne (falešně negativní nález). Dynamické jazyky, reflexe, metaprogramování a volání přes hranici knihovny přesnost dále snižují.

Praktický důsledek: statická analýza nenahrazuje testy ani code review. Neví, jestli je výpočet obchodně správný, nezachytí chybu v požadavcích a špatně odhaduje chování za běhu pod zátěží. Zachytí ale celou třídu chyb dřív a levněji, než by to udělal člověk.

Zapojení do vývojového procesu

Nejúčinnější je analýza tam, kde má nejrychlejší zpětnou vazbu. Editor podtrhne problém během psaní, pre-commit hook zablokuje zjevné přehmaty a CI/CD pipeline dělá plnou kontrolu včetně pomalejších bezpečnostních pravidel a rozhoduje, zda pull request může projít.

Zavedení do existujícího projektu s velkým technickým dluhem má jedno pravidlo: nezapínat všechno naráz. Obvyklý postup je zafixovat současný stav jako výchozí čáru (baseline), tvrdě vynucovat pravidla jen pro nově psaný a měněný kód a starší nálezy odbourávat postupně. Jinak tým dostane deset tisíc varování, přestane je číst a nastaví si výjimku napříč repozitářem.

Typické nástroje

  • JavaScript a TypeScript: ESLint, kompilátor TypeScriptu v režimu strict, Biome
  • Python: Ruff, Pylint, mypy, Bandit pro bezpečnost
  • Java a C#: SpotBugs, Error Prone, Roslyn analyzátory
  • C a C++: clang-tidy, Coverity, sanitizery na hraně statiky a dynamiky
  • Napříč jazyky: SonarQube, Semgrep, CodeQL

Jak měřit, že analýza pomáhá

Užitečné metriky nejsou počet nálezů, ale podíl nálezů, které tým skutečně opraví, čas od vzniku chyby k jejímu odhalení a počet incidentů v produkci ve třídách chyb, které nástroj pokrývá. Pravidlo, které vývojáři soustavně potlačují komentářem, je špatně nastavené pravidlo, ne známka nedisciplinovaného týmu.

Příklady z praxe

  1. Odhalení SQL injection v datovém toku

    Bezpečnostní analyzátor sleduje hodnotu z HTTP parametru (zdroj) až do místa, kde se skládá SQL dotaz (sink). Protože mezi nimi není žádná sanitizace ani parametrizace, nahlásí kritickou zranitelnost ještě před merge pull requestu. Oprava spočívá v přechodu na parametrizovaný dotaz, který nástroj rozpozná jako bezpečný.

    # Nález: nedůvěryhodný vstup končí v SQL dotazu
    query = "SELECT * FROM users WHERE email = '" + request.args["email"] + "'"
    db.execute(query)
    
    # Po opravě analyzátor mlčí
    db.execute("SELECT * FROM users WHERE email = %s", (request.args["email"],))
  2. Postupné zavedení linteru do staršího projektu

    Tým převzal pět let starý Node.js projekt bez linteru. Po zapnutí doporučené sady pravidel ESLint vypsal přes osm tisíc varování, což by zablokovalo veškerou práci. Řešením bylo vygenerovat baseline soubor se současnými nálezy, nastavit CI tak, aby padalo jen na nových porušeních, a odbourávat starý dluh po adresářích při běžném refactoringu.

    # CI kontroluje jen soubory změněné vůči hlavní větvi
    git diff --name-only origin/main...HEAD -- '*.ts' | xargs npx eslint --max-warnings=0

Časté omyly

MýtusKdyž projde statická analýza bez nálezu, kód je bezpečný.
Ve skutečnostiStatická analýza pokrývá jen vzory, na které má pravidla, a u dynamických konstrukcí je nutně nepřesná. Chyby v obchodní logice, špatné oprávnění nebo zneužití platné funkcionality nezachytí. Bezpečnost potřebuje i testy, dynamickou analýzu a review.
MýtusStatická analýza je jen kontrola formátování a odsazení.
Ve skutečnostiFormátování řeší formatter (Prettier, gofmt). Statická analýza nad tím staví typové kontroly, detekci nedosažitelného kódu, úniků prostředků, race conditions i celé datové toky od nedůvěryhodného vstupu k nebezpečné operaci.
MýtusFalešně pozitivní nálezy znamenají, že nástroj je k ničemu.
Ve skutečnostiUrčitý podíl falešných poplachů je daní za to, že analyzátor uvažuje o všech možných průbězích programu. Řešením je vyladit sadu pravidel na projekt, ne nástroj vypnout. Trvale hlučné pravidlo je lepší vypnout cíleně než ignorovat všechna.

Časté dotazy

Kdy statická analýza nestačí a je potřeba dynamické testování?
Statická analýza nestačí všude, kde na výsledku rozhoduje běhové prostředí. Chování pod souběžnou zátěží, skutečné odpovědi externích API, konfigurace nasazení, výkonnostní regrese a správnost obchodních výpočtů se ze zdrojového kódu spolehlivě odvodit nedají. Tyto oblasti pokrývají jednotkové a integrační testy, dynamická analýza za běhu, profilování a penetrační testování. Rozumná sestava kombinuje obojí: statická analýza chytá levné a časté chyby okamžitě, dynamické metody ověřují, že složený systém opravdu dělá to, co má.
Jak nastavit statickou analýzu, aby ji tým nezačal ignorovat?
Klíčem je malá a ostrá sada pravidel místo maximálního nastavení. Doporučený postup: začít s doporučeným presetem nástroje, vypnout pravidla, která v daném projektu generují převážně šum, zafixovat existující nálezy jako baseline a blokovat build jen na nově zavedených porušeních. Nálezy musí být rychlé a musí se zobrazovat přímo v editoru a v pull requestu, ne až v nočním reportu. Pravidlo, které se soustavně potlačuje komentářem, patří k revizi nebo k vypnutí.
Zpomaluje statická analýza CI pipeline?
Statická analýza přidává do pipeline čas, ale rozsah se velmi liší. Lintery a moderní nástroje psané v Rustu zvládnou střední repozitář v jednotkách sekund. Typová kontrola trvá desítky sekund až minuty a hluboká bezpečnostní analýza s datovými toky může u velké kódové báze běžet i desítky minut. Běžná strategie je pouštět rychlé kontroly na každý push a nákladnou bezpečnostní analýzu jen na hlavní větev nebo v noci, případně analyzovat inkrementálně pouze změněné soubory.
Nahradí statická analýza code review?
Statická analýza code review nenahradí, protože každý řeší jinou třídu problémů. Nástroj spolehlivě odhalí mechanické chyby: nepoužité proměnné, nekontrolované návratové hodnoty, nebezpečné datové toky, porušení konvencí. Recenzent naopak posuzuje, zda řešení odpovídá zadání, zda je návrh srozumitelný a udržitelný a zda nezavádí zbytečnou složitost. Praktický přínos je v tom, že automatická kontrola z review odstraní nudné výtky k formě, takže lidský čas zbyde na architekturu a smysl změny.

Zdroje

  1. Source Code Analysis Tools(otevře se v novém okně)OWASP Foundation
  2. Static program analysis(otevře se v novém okně)Wikipedia
  3. TypeScript Documentation(otevře se v novém okně)Microsoft
  4. Source Code Security Analyzers(otevře se v novém okně)NIST

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.