Prozkoumání CodeQL na GitHubu
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 createběhem sestavení. -
Analýza databáze: Spusťte
codeql database analyzes 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 createextrahuje kód do dotazovatelného formátu. -
Provádění dotazů:
codeql database analyzespustí dotazy a vygeneruje výsledky. -
Testovací dotazy:
codeql test runověř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.