Vysvětlení výsledků CodeQL

Dokončeno

V předchozích lekcích jste vytvořili databázi a naskenovali extrahovaný soubor z kódu. Teď můžete zobrazit výsledky a určit, jestli existují ohrožení zabezpečení, která se mají vyřešit.

Interpretované výsledky dotazu se automaticky zobrazí ve zdrojovém kódu v rozšíření CodeQL pro Visual Studio Code. Výsledky výstupu, které rozhraní příkazového řádku CodeQL generuje, můžou být v mnoha formátech pro použití s různými nástroji.

Způsob zobrazení výsledků analýzy ve zdrojovém kódu můžete řídit úpravou příkazu select dotazu. Výsledky můžete ostatním uživatelům usnadnit a lépe pochopit při vývoji dotazu. Když píšete vlastní dotazy v konzole dotazu nebo v rozšíření CodeQL pro Visual Studio Code, neexistují žádná omezení toho, co je možné vybrat.

Pokud chcete pomocí dotazu vytvořit výstrahy v prohledávání kódu GitHubu nebo vygenerovat platné výsledky analýzy pomocí rozhraní příkazového řádku CodeQL, je potřeba, aby výsledky sestavy příkazů select byly v požadovaném formátu.

Pracovní postupy oprav s Copilot Autofix

Jakmile CodeQL identifikuje problém, je nejdůležitějším krokem jeho řešení. GitHub propojuje detekci s nápravou tím, že vám umožňuje přejít přímo od upozornění k navržené opravě.

Oprava výstrah pomocí Copilot Autofix

Když otevřete výstrahu CodeQL na kartě Zabezpečení, GitHub zobrazí podrobnosti o problému, včetně ovlivněného kódu, závažnosti a způsobu zavedení problému.

U podporovaných výstrah se také zobrazí Copilot Autofix.

Copilot Autofix analyzuje upozornění a vygeneruje navrženou opravu. Sem patří:

  • Změna kódu, která problém vyřeší
  • Vysvětlení, proč k problému dochází
  • Pokyny k řešení problému

Místo ručního psaní opravy úplně od začátku začnete od navrhované změny.

Typický pracovní postup vypadá takto:

  1. CodeQL se spustí ve vašem pracovním postupu a vytvoří výstrahu.
  2. Otevřete výstrahu a zkontrolujte ovlivněný kód.
  3. Copilot Autofix vygeneruje navrženou opravu.
  4. Projděte si vysvětlení a navrhované změny.
  5. Použijete tuto opravu, čímž se vytvoří pull request.
  6. Požadavek na sloučení projde kontrolami a je zkontrolován před sloučením.

Tento pracovní postup připojí detekci přímo k nápravě, aniž by opustil rozhraní GitHub.

Copilot Autofix neaplikuje změny automaticky. Zodpovídáte za kontrolu a schválení opravy. To zajišťuje, že:

  • Oprava odpovídá základu kódu.
  • V případě potřeby můžete implementaci upravit.
  • Změny procházejí stávajícím procesem kontroly.

Automatická oprava je nejúčinnější pro:

  • Běžné vzory ohrožení zabezpečení, jako jsou rizika injektáže nebo nebezpečné použití rozhraní API.
  • Problémy, které je možné vyřešit jasnou lokalizovanou změnou kódu

V případě složitějších problémů může automatická oprava poskytnout pokyny, ale možná budete muset opravu upravit nebo implementovat vlastní řešení.

Navrhované opravy v upozorněních

I když automatická oprava není dostupná, některé výstrahy zahrnují navrhované opravy.

Tyto návrhy:

  • Zvýrazněte část kódu, která by se měla změnit.
  • Uveďte pokyny, jak problém vyřešit.

Tyto návrhy můžete použít jako výchozí bod při psaní opravy.

Náprava závislostí pomocí Dependabotu

Ne všechny chyby zabezpečení pocházejí z vašeho kódu. Některé jsou zavedeny prostřednictvím závislostí.

Dependabot pomáhá automaticky řešit tyto problémy:

  • Zjišťování ohrožených závislostí
  • Vytváření pull requestů s aktualizovanými verzemi
  • Umožňuje kontrolovat a slučovat opravy.

Tyto pull requesty probíhají podle stejného postupu jako Autofix:

  1. Navrhuje se změna.
  2. Kontroly jsou spuštěny.
  3. Aktualizace je zkontrolována a sloučena.

Díky tomu je náprava závislostí konzistentní s tím, jak opravíte problémy s kódem aplikace.

Automatizace pracovních postupů nápravy

Pomocí GitHub Actions můžete automatizovat způsob zpracování oprav.

Pracovní postupy můžou například:

  • Spusťte testy u pull requestů Autofix nebo Dependabotu.
  • Použijte štítky podle závažnosti.
  • Vyžaduje schválení pro vysoce rizikové změny.
  • Automatické sloučení aktualizací s nízkým rizikem

Tyto pracovní postupy zajišťují, že náprava je:

  • Konzistentní napříč týmem.
  • Ověřeno před sloučením.
  • Integrováno do procesu vývoje.

Od detekce po řešení

V úplném pracovním postupu:

  1. CodeQL detekuje ohrožení zabezpečení.
  2. Copilot Autofix navrhuje opravu.
  3. Vytvoří se žádost o přijetí změn.
  4. GitHub Actions ověřují změnu.
  5. Oprava je zkontrolována a sloučena.

Kombinací analýzy CodeQL s funkcí Copilot Autofix, nástrojem Dependabot a automatizací pracovních postupů vytvoříte systém, který problémy nejen odhaluje, ale také pomáhá je efektivně řešit.

Reagujte na upozornění z analýzy kódu

Nastavení skenování kódu můžete provést, abyste zkontrolovali kód v úložišti. Můžete použít výchozí analýzu CodeQL, jinou analýzu než Microsoft nebo jiné typy analýzy. Výsledné výstrahy se zobrazují vedle sebe v úložišti.

Výchozí analýza CodeQL gitHubu může obsahovat více vlastností pro výstrahy, než jsou výsledky z nástrojů jiných společností než Microsoft nebo z vlastních dotazů. Ve výchozím pracovním postupu skenování kódu pravidelně analyzuje váš kód ve výchozí větvi a během pull requestů.

Každá výstraha obsahuje následující informace:

  • Problém s kódem a názvem nástroje, který ho identifikoval
  • Řádek kódu, který výstrahu aktivoval.
  • Vlastnosti výstrahy, například závažnost.
  • Závažnost zabezpečení.
  • Bod, kdy problém vznikl.
  • Povaha problému.

Informace také zahrnují, jak problém vyřešit, když analýza CodeQL identifikuje výstrahu. Kromě toho může kontrola kódu prostřednictvím CodeQL detekovat problémy s tokem dat ve vašem kódu.

Snímek obrazovky s upozorněními analýzy CodeQL v GHAS

Kromě ruční opravy ohrožení zabezpečení můžete automatizovat nápravu závislostí pomocí aktualizací zabezpečení Dependabot.

Když Dependabot zjistí zranitelnou závislost, vytvoří pull request k aktualizaci závislosti. Tyto žádosti o přijetí změn je možné integrovat do automatizovaných pracovních postupů, aby se zjednodušila náprava.

Automatizace nápravy závislostí pomocí Dependabotu

Typický pracovní postup automatizace se řídí tímto vzorem:

  1. Dependabot vytvoří pull request s cílem aktualizovat zranitelnou závislost.
  2. Pracovní postup GitHub Actions se spustí při události pull_request.
  3. Workflow kontroluje, zda byl pull request vytvořen uživatelem dependabot[bot].
  4. Metadata o aktualizaci (například typ závislosti nebo změna verze) lze použít k určení další akce.
  5. Pracovní postup spouští kontroly ověřování, používá popisky nebo povoluje automatické sloučení pro aktualizace s nízkým rizikem.

Následující příklad ukazuje jednoduchý workflow GitHub Actions, který se spouští pouze pro pull requesty od Dependabotu. Ověří aktualizaci a po úspěšném ověření může povolit automatické sloučení.

name: Dependabot remediation

on:
  pull_request:
    branches:
      - main

permissions:
  pull-requests: write

jobs:
  dependabot:
    if: github.event.pull_request.user.login == 'dependabot[bot]'
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: npm test

      - name: Enable auto-merge for approved updates
        if: ${{ success() }}
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_URL: ${{ github.event.pull_request.html_url }}
        run: gh pr merge --auto --merge "$PR_URL"

Tento přístup pomáhá týmům snížit ruční úsilí a zajistit, aby se aktualizace závislostí před sloučením ověřily.

V produkčních scénářích je automatické slučování obvykle omezeno na aktualizace s nízkým rizikem, jako jsou opravná vydání, a používá se spolu s pravidly ochrany větví, povinnými kontrolami stavu a pravidly pro revize.

Informování týmů o nápravných aktivitách

Kvůli lepšímu přehledu o aktualizacích závislostí týmy často integrují Dependabot s externími systémy oznámení.

Kromě GitHub oznámení můžete použít:

  • Integrace slacku nebo Microsoft Teams pro týmové povědomí.
  • GitHub webhooky pro vlastní integrace a automatizační procesy.

Například pracovní postup nebo webhook můžou týmu oznámit, že:

  • Je otevřen pull request Dependabotu.
  • Validační kontroly selžou.
  • Bezpečnostní aktualizace je sloučena.

Tato oznámení pomáhají týmům rychle reagovat, když náprava vyžaduje pozornost.

Upozornění toku dat

Analýza toku dat najde potenciální problémy se zabezpečením v kódu, mezi které patří:

  • Používání dat způsobem, který ohrožuje zabezpečení.
  • Předávání nebezpečných argumentů funkcím
  • Únik citlivých informací

GitHub vám ukáže, jak data procházejí kódem, když kontrola kódu hlásí výstrahy toku dat. Tato upozornění na tok dat můžete použít k identifikaci oblastí kódu, které unikají citlivé informace. Tyto znalosti vám můžou pomoct identifikovat vstupní bod pro útoky uživatelů se zlými úmysly.

Úrovně závažnosti

Všechny výsledky kontroly kódu, které mají ve výchozím nastavení závažnost chyby , způsobují selhání kontroly.

Úrovně závažnosti výstrah jsou:

  • Error
  • Warning
  • Note

Můžete určit úroveň závažnosti, při které pull requesty, jež spouštějí upozornění kontroly kódu, selžou.

Úrovně závažnosti zabezpečení

Dotazy zabezpečení, které kontrola kódu generuje, zobrazují úrovně závažnosti zabezpečení pro výstrahy.

Úrovně závažnosti zabezpečení jsou:

  • Kritická
  • Vysoko
  • Středně
  • Nízká úroveň

GitHub používá data systému CVSS (Common Vulnerability Scoring System) k výpočtu závažnosti zabezpečení výstrahy.

Všechny výsledky kontroly kódu, které mají závažnost zabezpečení Kritické nebo Vysoké , ve výchozím nastavení způsobí selhání kontroly. Můžete určit, která úroveň závažnosti zabezpečení by měla způsobit selhání kontroly výsledků kontroly kódu.

Zavřít upozornění na skenování kódu

Upozornění můžete zavřít dvěma způsoby:

  • Opravte problém v kódu.
  • Zavřete nebo odstraňte výstrahu.

Zavřít upozornění ze skenování kódu

Zrušení upozornění je způsob, jak odstranit upozornění, o kterém si myslíte, že není potřeba ho opravit. Upozornění na chybu v kódu použitém pouze pro testování můžete například zavřít. Výstrahu můžete zavřít také v případě, že úsilí potřebné k opravě chyby je větší než potenciální výhoda vylepšení kódu.

Výstrahy můžete zavřít z poznámek ke skenování kódu v kódu nebo ze souhrnného seznamu na kartě Zabezpečení . Chcete-li zavřít výstrahu ze seznamu, vyberte nabídku Zavřít výstrahu , vyberte důvod pro zavření a pak vyberte tlačítko Zavřít výstrahu .

Animace, která zobrazuje rozevírací nabídku a tlačítko pro zavření upozornění kontroly kódu

Při zavření výstrahy:

  • Výstraha je zrušena ve všech větvích.
  • Výstraha se odebere z počtu aktuálních upozornění pro váš projekt.
  • Výstraha se přesune do seznamu Uzavřeno v souhrnu výstrah. V případě potřeby ho můžete znova otevřít.
  • Důvod, proč jste upozornění zavřeli, se zaznamená.
  • Při příštím spuštění kontroly kódu stejný kód nevygeneruje upozornění.