Sdílet prostřednictvím


Kontrola kódu

Kontrola kódu v GitHubu Advanced Security pro Azure DevOps umožňuje analyzovat kód v úložišti Azure DevOps a najít chyby zabezpečení a chyby kódování. Veškeré problémy zjištěné analýzou se zobrazí jako upozornění. Kontrola kódu používá k identifikaci zranitelností jazyk CodeQL.

CodeQL je modul pro analýzu kódu vyvinutý GitHubem, který automatizuje kontroly zabezpečení. Kód můžete analyzovat pomocí CodeQL a zobrazit výsledky jako výstrahy kontroly kódu.

Pokročilé zabezpečení GitHubu pro Azure DevOps funguje s Azure Repos. Pokud chcete používat GitHub Advanced Security s úložišti GitHub, přečtěte si téma GitHub Advanced Security.

Upozornění CodeQL

Odborníci na GitHub, bezpečnostní pracovníci a přispěvatelé komunity zapisují a udržují výchozí dotazy CodeQL používané ke kontrole kódu. Dotazy se pravidelně aktualizují, aby se zlepšila analýza a snížila počet falešně pozitivních výsledků. Dotazy jsou opensourcové, takže můžete zobrazit a přispívat k dotazům v úložišti github/codeql .

Konkrétnější dokumentaci o CodeQL najdete v dokumentaci CodeQL na GitHubu.

CodeQL podporuje kompilované i interpretované jazyky a může najít chyby zabezpečení a chyby v kódu napsaného v podporovaných jazycích.

  • C/C++
  • C#
  • Přejít
  • Java
  • JavaScript/TypeScript
  • Kotlin (beta verze)
  • Python
  • Ruby
  • Swift

Další informace najdete v dokumentaci na webu CodeQL na podporovaných jazycích a architekturách.

Konkrétní dotazy a podrobnosti o úlohách, které CodeQL používá, si můžete prohlédnout v protokolu sestavení, podobně jako prohledávání závislostí.

Snímek obrazovky s úlohou publikování výsledků prohledávání kódu

Upozornění kontroly kódu

Upozornění kontroly kódu GitHub Advanced Security pro Azure DevOps zahrnují příznaky kontroly kódu podle úložiště, které upozorňují na ohrožení zabezpečení aplikací na úrovni kódu.

Pokud chcete použít kontrolu kódu, musíte nejprve nakonfigurovat GitHub Advanced Security pro Azure DevOps.

Karta Rozšířené zabezpečení v Azure DevOps je centrum pro zobrazení upozornění kontroly kódu. Výběrem karty Kontrola kódu zobrazíte výstrahy kontroly. Můžete filtrovat podle větve, stavu, kanálu, typu pravidla a závažnosti. V tuto chvíli centrum upozornění nezobrazuje výstrahy pro kontrolu dokončených ve větvích žádosti o přijetí změn.

Pokud se přejmenují kanály nebo větve, žádné výsledky se neprojeví – může to trvat až 24 hodin, než se zobrazí nový název.

Pokud se rozhodnete spouštět vlastní dotazy CodeQL, ve výchozím nastavení neexistuje samostatný filtr pro výstrahy vygenerované z různých balíčků dotazů. Můžete filtrovat podle pravidla, které je pro každý dotaz odlišné.

Snímek obrazovky s upozorněními kontroly kódu pro úložiště

Pokud pro úložiště vypnete rozšířené zabezpečení, ztratíte přístup k výsledkům na kartě Upřesnit zabezpečení a úloha sestavení. Úloha sestavení se nezdaří, ale žádné výsledky sestavení spuštěné s úlohou, zatímco rozšířené zabezpečení je zakázáno, jsou skryté a nezachované.

Podrobnosti výstrahy

Výběrem výstrahy zobrazíte další podrobnosti, včetně pokynů k nápravě. Každá výstraha obsahuje umístění, popis, příklad a závažnost.

Snímek obrazovky s podrobnostmi výstrahy prohledávání kódu

Sekce Vysvětlení
Umístění Část Umístění podrobně popisuje konkrétní instanci, ve které CodeQL zjistil chybu zabezpečení. Pokud existuje více instancí vašeho kódu, které porušují stejné pravidlo, vygeneruje se nová výstraha pro každé jedinečné umístění. Karta Umístění obsahuje přímý odkaz na ovlivněný fragment kódu, abyste mohli vybrat fragment kódu, který se má nasměrovat do webového uživatelského rozhraní Azure DevOps pro úpravy.
Popis Popis poskytuje nástroj CodeQL založený na problému.
Doporučení Doporučením je navrhovaná oprava pro danou výstrahu kontroly kódu.
Příklad Část příkladu ukazuje zjednodušený příklad zjištěné slabosti v kódu.
Závažnost Úrovně závažnosti můžou být nízké, střední, vysoké nebo kritické. Skóre závažnosti vychází z daného skóre CWE (Common Vulnerability Scoring System) pro identifikovaný společný výčet slabosti (CWE). Další informace o skóre závažnosti najdete v tomto blogovém příspěvku na GitHubu.

Správa upozornění kontroly kódu

Zobrazení upozornění pro úložiště

Každý, kdo má oprávnění přispěvatele pro úložiště, může zobrazit souhrn všech výstrah pro úložiště na kartě Upřesnit zabezpečení v části Úložiště. Výběrem karty Kontrola kódu zobrazíte všechna upozornění kontroly tajných kódů.

Aby se zobrazily výsledky, musí se nejprve spustit úlohy kontroly kódu. Po dokončení první kontroly se všechna zjištěná ohrožení zabezpečení zobrazí na kartě Rozšířené zabezpečení.

Ve výchozím nastavení se na stránce upozornění zobrazují výsledky kontroly závislostí pro výchozí větev úložiště.

Stav dané výstrahy odráží stav výchozí větve a nejnovějšího kanálu spuštění, i když výstraha existuje v jiných větvích a kanálech.

Zavření upozornění kontroly kódu

Pokud chcete výstrahy zavřít, potřebujete příslušná oprávnění. Ve výchozím nastavení můžou výstrahy Advanced Security zavřít jenom správci projektu.

Zavření výstrahy:

  1. Přejděte na výstrahu, kterou chcete zavřít, a vyberte ji.
  2. Vyberte rozevírací seznam Zavřít upozornění.
  3. Pokud ještě není vybraná, vyberte jako důvod uzavření buď Riziko, nebo Falešně pozitivní .
  4. Do textového pole Komentář přidejte volitelný komentář.
  5. Výběrem možnosti Zavřít odešlete a zavřete výstrahu.
  6. Stav upozornění se změní z otevřít na Uzavřeno a zobrazí se důvod zamítnutí.

Snímek obrazovky znázorňuje, jak zavřít upozornění kontroly kódu

Tato akce zavře pouze výstrahu pro vybranou větev. Ostatní větve, které obsahují stejnou chybu zabezpečení, zůstanou aktivní, dokud ji nespustíte. Jakékoli upozornění, které jste dříve zavřeli, je možné znovu otevřít ručně.

Použití vlastních dotazů s CodeQL

Pokud ve výchozím nastavení nemáte zadaný vlastní konfigurační soubor, CodeQL spustí security-extended balíček dotazů k analýze kódu. Vlastní dotazy CodeQL můžete využít k zápisu vlastních dotazů, abyste našli konkrétní chyby zabezpečení a chyby. Musíte také vytvořit vlastní konfigurační soubor pro úpravu výchozí analýzy CodeQL.

Pokud chcete najít existující vlastní dotazy nebo přispívat vlastním dotazem, přečtěte si téma Přispívání do CodeQL.

Analýza s využitím vlastních dotazů

Nejrychlejší způsob, jak začít s vlastním dotazem, je napsat dotaz a uložit ho do místního úložiště Azure DevOps. Podrobnosti vlastního dotazu můžete přizpůsobit podle potřeby, ale musí mít aspoň ID pravidla. Další informace o psaní vlastního dotazu CodeQL najdete v tématu Psaní dotazů CodeQL. Do sady dotazů můžete také seskupit několik dotazů nebo využít balíčky publikované jinými lidmi. Další informace najdete v tématu Publikování a používání balíčků CodeQL.

Použití vlastního konfiguračního souboru

Vlastní konfigurační soubor je způsob, jak spravovat dotazy, které se spouštějí během analýzy CodeQL s vaším kódem. Můžete zadat více dotazů nebo balíčků dotazů, které se mají spustit, a změnit nebo zakázat výchozí dotazy CodeQL.

Pokud chcete zahrnout konkrétní dotaz, který chcete zahrnout, zadejte dotaz s názvem a cestou k umístění souboru dotazu (.ql) v úložišti.

Pokud chcete zahrnout konkrétní balíček, který chcete zahrnout, zadejte název balíčku. Můžete zadat libovolný počet balíčků dotazů CodeQL, které se mají spustit v konfiguračním souboru.

Dalším krokem je vytvoření qlpack.yml souboru. Tento soubor deklaruje balíček CodeQL a informace o něm. Všechny *.ql soubory ve stejném adresáři (nebo podadresáři) jako součást qlpack.yml balíčku.

Tip

Filtr packs z konfiguračního souboru podporuje stahování balíčků z úložišť hostovaných na GitHubu, ačkoli filtr queries ho nepodporuje. Pokud je balíček privátní na GitHubu, musíte prostřednictvím úlohy zadat přístupový token AdvancedSecurity-Codeql-Init@1 GitHubu jako proměnnou prostředí a název proměnné jako GITHUB_TOKENs oborem tokenu read:packages.

Tady je příklad konfiguračního souboru:

name: "Run custom queries"

# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
 
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
  - name: Use security-extended query suite
    uses: security-extended
  - name: Use local custom query (single query)
    uses: ./customQueries/javascript/FindTestFunctions.ql
  - name: Use local custom query (directory of queries)
    uses: ./customQueries/javascript/MemoryLeakQueries  
 
packs:
 - mygithuborg/mypackname
 
paths:
 - src
 
paths-ignore:
  - src/node_modules
  - '**/*.test.js'
 
query-filters:
 - include:
    kind: problem
 - include:
     precision: medium
 - exclude:
    id:
      - js/angular/disabling-sce
      - js/angular/insecure-url-allowlist

Tip

Specifikace konfiguračního souboru ignorují a mají přednost před konfiguracemi na úrovni kanálu pro AdvancedSecurity-Codeql-Init@1 úlohu. includepaths / ignorepathsbude ignorována nebo , pokud paths/paths-ignore jsou přítomny, přepsány hodnotami z .paths/paths-ignore querysuite bude přepsána hodnotami zadanými v queries konfiguračním souboru nebo packs v konfiguračním souboru.

Pokud používáte nějaký vlastní dotaz, tady je příklad qlpack.yml umístěný v adresáři vlastních dotazů:

version: 1.0.1
dependencies:
  codeql/javascript-all: "*"
  codeql/javascript-queries: "*"

Proměnná dependencies obsahuje všechny závislosti tohoto balíčku a jejich kompatibilní rozsahy verzí. Každá závislost se odkazuje jako na scope/name balíček knihovny CodeQL. Při definování dependenciesqlpack.yml závisí na přesně jedné ze základních jazykových sad (například JavaScript, C#, Ruby atd.), která určuje jazyk, který může dotaz analyzovat.

Konkrétnější rady a možnosti konfigurace s konfiguračním souborem najdete v tématu Přizpůsobení pokročilého nastavení pro kontrolu kódu nebo nastavení qlpack.yml , viz struktura balíčku CodeQL.

Jakmile budete mít konfigurační soubor, budete muset přizpůsobit svůj kanál se spuštěnou analýzou CodeQL tak, aby využíval váš nový soubor. Tady je ukázkový kanál odkazující na konfigurační soubor:

trigger: none
 
pool:
  vmImage: windows-latest

# You can either specify your CodeQL variables in a variable block... 
variables:
# `configfilepath` must be an absolute file path relative to the repository root
  advancedsecurity.codeql.configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml' 

# Or you can specify variables as variables for the task. You do not need both definitions. 
steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
    languages: 'javascript'
    loglevel: '2'
    configfilepath: '$(build.sourcesDirectory)/.pipelines/steps/configfile.yml'
# If downloading a pack from GitHub,
# you must include a GitHub access token with the scope of `read:packages`.
  env:
    GITHUB_TOKEN: $(githubtoken)
 
- task: AdvancedSecurity-Codeql-Autobuild@1
  displayName: AutoBuild
 
- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Řešení potíží s prohledáváním kódu

Obecně platí, že pokud dochází k chybám při provádění CodeQL, rozhraní příkazového řádku CodeQL hlásí stav každého příkazu, který spustí jako ukončovací kód. Ukončovací kód poskytuje informace pro následné příkazy nebo pro jiné nástroje, které spoléhají na rozhraní příkazového řádku CodeQL. Další informace o podrobnostech ukončovacího kódu naleznete v tématu Ukončovací kódy.

Chyba: Příkaz CodeQL finalize database (32)

Tato chyba značí problém s dokončením vytváření databáze CodeQL, potenciálně kvůli chybám extrakce nebo chybějícím krokům sestavení.

Postup při řešení potíží:

  1. Ověření existence kódu a jeho kompilace
    • V kompilovaných jazycích ověřte, že proces sestavení kompiluje kód a že probíhá mezi úlohami AdvancedSecurity-Codeql-Init a úkoly AdvancedSecurity-Codeql-Analyze . Běžné příkazy sestavení a požadované příznaky (například clean no-cache/no-daemon) najdete tady v tématu Určení příkazů sestavení.
    • U interpretovaných jazyků ověřte, že v projektu existuje nějaký zdrojový kód pro zadaný jazyk.
  2. Kontrola chyb extrakce
    • Ověřte, jestli chyby extrakce ovlivňují stav databáze CodeQL.
    • Zkontrolujte v souboru protokolu chyby a upozornění pro extrahování a vyhodnoťte celkový stav databáze.
  3. Prozkoumání zahlcené chyby
    • Pokud většina souborů narazí na chyby extraktoru, prozkoumejte podrobněji příčinu nesprávné extrakce.

Chyba: skript automatickéhobuildu (1)

Tato chyba popisuje selhání automatického sestavení a navrhuje problém s nastavením nebo konfigurací kontroly kódu.

Postup při řešení potíží:

  1. Konfigurace kroků sestavení

Chyba: Adresáře CodeQL se nenašly v mezipaměti nástrojů agenta

Tato chyba značí problém s instalací CodeQL pro agenty v místním prostředí.

Postup při řešení potíží:

  1. Přečtěte si pokyny k nastavení nebo konfigurační skripty uvedené v tématu Konfigurace pokročilého zabezpečení GitHubu pro Azure DevOps.

Chyba: Proměnná kanálu jazyka není nastavená

K této chybě dochází při pokusu o spuštění CodeQL bez nastavení proměnné kanálu určující jazyky ke kontrole.

Postup při řešení potíží:

  1. Nastavení proměnné kanálu jazyka

CodeQL vrací žádné výsledky

Tato část obsahuje pokyny pro situace, kdy analýza CodeQL neposkytuje žádné výsledky.

Postup při řešení potíží:

  1. Kontrola zjištěných ohrožení zabezpečení
    • Zvažte možnost, že váš kód může skutečně obsahovat žádná ohrožení zabezpečení. Pokud se očekává ohrožení zabezpečení, ale nezjistí se, pokračujte dalším ověřením.
  2. Kontrola konfigurace sady dotazů
  3. Úprava oprávnění pro zobrazení výsledků
    • Zajištění správných oprávnění, alespoň na úrovni přispěvatele, jsou udělena pro přístup k výsledkům analýzy. Další informace najdete v tématu Rozšířená oprávnění zabezpečení.

Časový limit codeQL

Pokud se AdvancedSecurity-Codeql-Analyze@1 úloha zobrazuje This job was abandoned ... we lost contact with the agent a používáte hostovaného agenta Microsoftu, úloha dosáhne časového limitu integrovaného šestihodinového časového limitu pro placené hostované agenty. Místo toho se můžete pokusit spustit analýzu agenta v místním prostředí.

Oprávnění k úkolům kontroly kódu

Úloha sestavení pro kontrolu kódu používá identitu kanálu k volání rozhraní REST API advanced security. Ve výchozím nastavení mají kanály ve stejném projektu přístup k nahrání souboru SARIF vygenerovaného spuštěním analýzy CodeQL. Pokud jsou tato oprávnění odebrána z účtu služby sestavení nebo pokud máte vlastní nastavení (například kanál hostovaný v jiném projektu než v úložišti), musíte tato oprávnění udělit ručně.

Postup při řešení potíží:

  • Udělte Advanced Security: View alerts a Advanced Security: Manage and dismiss alerts oprávnění k účtu služby sestavení používanému ve vašem kanálu, který je [Project Name] Build Service ([Organization Name])pro kanály v oboru projektu , a pro kanály s vymezeným kolekcí je Project Collection Build Service ([Organization Name]).