Prozkoumání CodeQL na GitHubu

Dokončeno

Co je CodeQL

CodeQL je sémantický modul pro analýzu kódu vyvinutý GitHubem, který zpracovává kód jako data. Místo pouhého hledání textových vzorů rozumí CodeQL struktuře a významu kódu a umožňuje sofistikovanou analýzu zabezpečení a kvality.

Tradiční nástroje statické analýzy často vytvářejí falešně pozitivní výsledky, protože používají jednoduché porovnávání vzorů. Sémantický přístup CodeQL rozumí kontextu kódu, vztahům mezi prvky kódu a tokem dat prostřednictvím aplikací, což vede k přesnější detekci ohrožení zabezpečení.

Klíčové charakteristiky CodeQL

CodeQL považuje kód za databázi:

  • Strukturální reprezentace: Převede zdrojový kód na databázi, která zachycuje stromy syntaxe, grafy toku řízení a cesty toku dat.
  • Dotazovatelný formát: Umožňuje dotazování kódu pomocí specializovaného dotazovacího jazyka, podobně jako dotazování tradiční databáze.
  • Přístup nezávislý na jazyce: Podporuje více programovacích jazyků včetně jazyků C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go a Swift.
  • Komplexní pokrytí: Analyzuje nejen jednotlivé soubory, ale celé základy kódu se všemi jejich propojeními.

CodeQL umožňuje přesnou analýzu zabezpečení:

  • Analýza variant: Jakmile identifikujete jednu chybu zabezpečení, můžete napsat dotazy, abyste našli podobné problémy v celém základu kódu.
  • Analýza toku dat: Sleduje, jak se data procházejí vaší aplikací ze zdrojů (uživatelský vstup) do jímek (citlivé operace).
  • Sledování taintu: Identifikuje, kdy nedůvěryhodná data dosáhnou citlivých operací bez správného ověření nebo sanitizace.
  • Analýza toku řízení: Vysvětluje cesty spuštění a podmíněnou logiku k nalezení ohrožení zabezpečení, ke kterým dochází pouze za určitých podmínek.

Jak CodeQL funguje

Analýza CodeQL zahrnuje tři různé fáze, které transformují zdrojový kód na zjištění zabezpečení s možností akce:

Fáze 1: Vytvoření databáze CodeQL

První krok extrahuje strukturovanou reprezentaci kódu:

  • Extrakce kódu: Analyzuje zdrojové soubory během kompilace nebo prostřednictvím statické analýzy.
  • Vytvoření databáze: Vytvoří komplexní databázi představující strukturu kódu, včetně abstraktních stromů syntaxe, grafů toku řízení a závislostí dat.
  • Zachycení metadat: Zaznamenává umístění souborů, čísla řádků, obory proměnných, volání funkcí a hierarchie tříd.
  • Optimalizace: Indexuje databázi pro efektivní dotazování, a to i u rozsáhlých základů kódu.

Tato databáze se stane základem pro všechny následné analýzy. Vytvoří se jednou a dá se dotazovat vícekrát, což umožňuje efektivní iterativní analýzu zabezpečení.

Fáze 2: Spuštění dotazů CodeQL

Jakmile databáze existuje, spustíte dotazy a vyhledáte problémy se zabezpečením:

  • Standardní balíčky dotazů: GitHub poskytuje kurátorované sady dotazů pro běžné chyby zabezpečení (OWASP Top 10, CWE standards).
  • Vlastní dotazy: Napište vlastní dotazy, které vám umožní najít vzory zabezpečení specifické pro organizaci nebo porušení standardů kódování.
  • Provádění dotazů: Modul CodeQL spouští dotazy na databázi a hledá vzory kódu, které odpovídají signaturám ohrožení zabezpečení.
  • Představení: Dotazy se provádějí rychle, protože pracují s indexovanou databází místo nezpracovaných zdrojových souborů.

Mezi příklady kategorií dotazů patří:

  • Ohrožení zabezpečení injektáže: Injektáž SQL, injektáž příkazů, skriptování mezi weby
  • Problémy s ověřováním: Slabé zásady hesel, chybějící kontroly ověřování, nezabezpečená správa relací
  • Problémy s kryptografií: Slabé algoritmy, pevně zakódované přihlašovací údaje, nedostatečná náhodnost.
  • Správa prostředků: Nevracení paměti, vyčerpání prostředků, nekontrolovatelná spotřeba prostředků.

Fáze 3: Interpretace výsledků

V závěrečné fázi jsou zjištěna zjištění ve formátech, které lze použít:

  • Pořadí výsledků: CodeQL upřednostňuje zjištění podle závažnosti, úrovně spolehlivosti a zneužití.
  • Kontextové informace: Každé hledání zahrnuje umístění souborů, čísla řádků, ovlivněné fragmenty kódu a cesty toku dat.
  • Pokyny k nápravě: Výsledky zahrnují vysvětlení ohrožení zabezpečení a doporučení k jeho opravě.
  • Integrace: Výsledky se integrují s kartou GitHub Security, poznámkami žádostí o přijetí změn a soubory SARIF pro externí nástroje.

Dotazovací jazyk CodeQL

Dotazy CodeQL jsou napsané v deklarativním jazyce speciálně navrženém pro analýzu kódu:

Struktura a syntaxe dotazů

CodeQL používá objektově orientované programování logiky:

  • Třídy a predikáty: Definujte, co hledáte pomocí tříd, které představují prvky kódu (funkce, proměnné, výrazy).
  • Deklarativní přístup: Popište, co chcete najít, a ne jak ho najít.
  • Porovnávání: Pomocí predikátů můžete odpovídat vzorům kódu a relacím.
  • Kompozičnost: Vytvářejte složité dotazy kombinováním jednodušších predikátů.

Příklad struktury dotazu:

import javascript

from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"

Tento dotaz najde ohrožení zabezpečení injektáže SQL podle:

  • Identifikace bodů spuštění SQL
  • Hledání zdrojů uživatelského vstupu
  • Sledování toku dat ze vstupu do spuštění SQL
  • Hlášení ohrožení zabezpečení s kontextem

Standardní knihovny dotazů

GitHub poskytuje rozsáhlé knihovny dotazů:

  • Dotazy zabezpečení: Detekce OWASP Top 10 zranitelností, kategorií CWE a jazykově specifických problémů se zabezpečením.
  • Dotazy na kvalitu kódu: Vyhledejte pachy kódu, problémy s udržovatelností, problémy s výkonem a porušení osvědčených postupů.
  • Příspěvky komunity: Tisíce dotazů přispěli výzkumní pracovníci zabezpečení a vývojáři.
  • Pravidelné aktualizace: GitHub Security Lab průběžně přidává nové dotazy pro nově vznikající ohrožení zabezpečení.

Tyto dotazy můžete použít as-is nebo je přizpůsobit podle svých konkrétních potřeb.

CodeQL v zabezpečení GitHubu

CodeQL se hluboce integruje s funkcemi zabezpečení GitHubu:

Kontrola kódu pomocí CodeQL

Automatizovaná analýza zabezpečení:

  • Výchozí nastavení: Povolte kontrolu CodeQL jedním kliknutím v nastavení úložiště.
  • Naplánované kontroly: Automaticky provádějte kontrolu při každém odeslání, pull requestu nebo podle plánu.
  • Podpora více jazyků: Automaticky rozpozná jazyky ve vašem úložišti a spustí příslušné dotazy.
  • Výsledná prezentace: Zjištění zabezpečení se zobrazují na kartě Zabezpečení s podrobnými vysvětleními.

Integrace pull requestů:

  • Vložené poznámky: Nálezy zabezpečení se zobrazují jako komentáře přímo na ohrožených řádcích kódu v pull requestech.
  • Kontroly blokování: Nakonfigurujte CodeQL jako požadovanou kontrolu, která musí před sloučením proběhnout.
  • Rozdílové skenování: Hlásí se pouze nová ohrožení zabezpečení zavedená požadavkem na přijetí změn, což snižuje šum.
  • Zpětná vazba pro vývojáře: Vývojáři vidí problémy se zabezpečením okamžitě, zatímco kód je v jejich myslích čerstvý.

GitHub Advanced Security

Pro organizace poskytuje GitHub Advanced Security další možnosti:

  • Kontrola privátního úložiště: Spusťte CodeQL v privátních úložištích.
  • Vlastní spouštění dotazů: Nahrajte a spusťte dotazy specifické pro organizaci.
  • Přehled zabezpečení: Řídicí panel znázorňující stav zabezpečení ve všech úložištích
  • Správa výstrah: Třídění, přiřazování a sledování zjištění zabezpečení napříč týmy

Použití CodeQL v kanálech CI/CD

CodeQL přesahuje GitHub a integruje se s různými systémy CI/CD:

Přístupy k integraci

Integrace GitHub Actions:

- name: Initialize CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: javascript, python

- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v2

Tento pracovní postup:

  • Inicializuje CodeQL pro zadané jazyky.
  • Sestaví vaši aplikaci (nebo nabízí analýzu bez jejího sestavení).
  • Spouští dotazy zabezpečení.
  • Nahraje výsledky na kartu Zabezpečení na GitHubu.

Integrace služby Azure Pipelines:

CodeQL se dá spustit v Azure Pipelines pomocí rozhraní příkazového řádku:

  • Instalace rozhraní příkazového řádku CodeQL: Stáhněte a nainstalujte balíček CodeQL do pipeline.
  • Vytvoření databáze: Spusťte codeql database create během sestavení.
  • Analýza databáze: Spusťte codeql database analyze s vybranými balíčky dotazů.
  • Export výsledků: Generování souborů SARIF pro vizualizaci v Azure DevOps

Další systémy CI/CD:

CodeQL CLI podporuje libovolnou platformu CI/CD:

  • Jenkins: Proveďte analýzu CodeQL v krocích sestavení.
  • GitLab CI/CD: Spusťte CodeQL v pipelinech GitLabu s výstupem SARIF.
  • CircleCI: Integrujte kontroly CodeQL do pracovních postupů CircleCI.
  • Vlastní systémy: Použijte rozhraní příkazového řádku CodeQL z libovolného prostředí, které může spouštět nástroje příkazového řádku.

Bezpečnostní brány

Výsledky CodeQL použijte jako brány kvality:

  • Neúspěšné sestavení: Nakonfigurujte kanály tak, aby selhaly, když CodeQL najde ohrožení zabezpečení s vysokou závažností.
  • Rozbor tendence: Sledujte metriky zabezpečení v průběhu času, abyste mohli měřit zlepšení.
  • Požadavky na dodržování předpisů: Vygenerujte důkazy o kontrole zabezpečení pro audity a certifikace dodržování předpisů.
  • Automatická náprava: Aktivace automatizovaných pracovních postupů při zjištění konkrétních ohrožení zabezpečení

Vývojové nástroje CodeQL

CodeQL poskytuje nástroje pro vytváření a testování dotazů:

Rozšíření pro Visual Studio Code

Oficiální rozšíření CodeQL pro VS Code nabízí:

  • Vývoj dotazů: Psaní a testování dotazů CodeQL se zvýrazněním syntaxe, automatickým dokončováním a vloženou dokumentací
  • Analýza místní databáze: Spusťte dotazy na databáze vytvořené z místních základů kódu.
  • Vizualizace výsledků: Podívejte se na výsledky dotazů s navigačními cestami zdrojového kódu a toku dat.
  • Podpora ladění: Projděte si provádění dotazů, abyste porozuměli výsledkům a optimalizovali výkon.

Rozhraní příkazového řádku

Rozhraní příkazového řádku CodeQL umožňuje skriptovatelnou analýzu:

  • Vytvoření databáze:codeql database create extrahuje kód do dotazovatelného formátu.
  • Provádění dotazů:codeql database analyze spustí dotazy a vygeneruje výsledky.
  • Testovací dotazy:codeql test run ověřuje dotazy na testovací případy.
  • Správa sad: Stáhněte a spravujte standardní sady dotazů.

Výhody CodeQL pro automatizaci zabezpečení

Integrace CodeQL do procesu DevSecOps přináší významné výhody:

Produktivita vývojářů

Včasné zjišťování:

  • Zabezpečení posunem vlevo: Nalezení zranitelností při vývoji místo v produkčním prostředí.
  • Rychlejší náprava: Opravte problémy, když je kód aktuální a změny jsou malé.
  • Příležitosti pro výuku: Vývojáři se učí zabezpečené postupy kódování od okamžité zpětné vazby.
  • Zmenšené přepínání kontextu: Zjištění zabezpečení se zobrazují ve známých vývojových nástrojích.

Přesné výsledky:

  • Nízké falešně pozitivní výsledky: Sémantická analýza vytváří přesnější zjištění než porovnávání vzorů.
  • Kontextové informace: Mezi výsledky patří cesty toku dat, které ukazují, jak přesně dochází k ohrožením zabezpečení.
  • Zjištěná priorita: Zaměřte se na zneužitelné problémy a ne na teoretické obavy.
  • Zjišťování variant: Najděte všechny výskyty vzoru ohrožení zabezpečení, ne jenom běžné příklady.

Zabezpečení organizace

Komplexní pokrytí:

  • Celý základ kódu: Analyzujte veškerý kód, včetně závislostí třetích stran a starších součástí.
  • Více jazyků: Jednotná analýza zabezpečení napříč polyglotovými aplikacemi
  • Konzistentní standardy: Použijte stejná pravidla zabezpečení ve všech úložištích.
  • Historická analýza: Naskenujte existující kód a nastavte standardní hodnoty zabezpečení.

Škálovatelné zabezpečení:

  • Automatizované skenování: Pro každý commit nejsou nutné ruční bezpečnostní kontroly.
  • Průběžné monitorování: Pravidelné kontroly detekují nově zveřejněné chyby zabezpečení.
  • Zabezpečení jako kód: Požadavky na zabezpečení zakódujte jako dotazy, které budou uloženy ve správě verzí.
  • Sdílení znalostí: Knihovny pro ukládání dotazů zachycují znalosti v oblasti institucionálního zabezpečení.

Dodržování předpisů a zásady správného řízení

Záznamy auditu:

  • Historie skenování: Záznam všech kontrol zabezpečení s časovými razítky a výsledky
  • Životní cyklus zjištění: Sledujte zranitelnosti od detekce až po nápravu.
  • Vynucování zásad: Ukažte, že kontroly zabezpečení probíhají pro každou verzi.
  • Generování důkazů: Vytvářet sestavy pro auditory a rámce dodržování předpisů.

Další informace o CodeQL naleznete v tématu CodeQL Overview.

Dostupné nástroje najdete v tématu Nástroje CodeQL.