Udostępnij za pośrednictwem


Skanowanie kodu

Skanowanie kodu w usłudze GitHub Advanced Security dla usługi Azure DevOps umożliwia analizowanie kodu w repozytorium usługi Azure DevOps w celu znalezienia luk w zabezpieczeniach i błędów kodowania. Wszelkie problemy zidentyfikowane przez analizę są zgłaszane jako alert. Skanowanie kodu używa języka CodeQL do identyfikowania luk w zabezpieczeniach.

CodeQL to aparat analizy kodu opracowany przez usługę GitHub w celu zautomatyzowania kontroli zabezpieczeń. Kod można analizować przy użyciu języka CodeQL i wyświetlać wyniki jako alerty skanowania kodu.

Usługa GitHub Advanced Security dla usługi Azure DevOps współpracuje z usługą Azure Repos. Jeśli chcesz używać usługi GitHub Advanced Security z repozytoriami GitHub, zobacz Usługa GitHub Advanced Security.

Alerty codeQL

Eksperci z serwisu GitHub, badacze zabezpieczeń i współautorzy społeczności piszą i utrzymują domyślne zapytania CodeQL używane do skanowania kodu. Zapytania są regularnie aktualizowane, aby poprawić analizę i zmniejszyć wszelkie wyniki fałszywie dodatnie. Zapytania są typu open source, dzięki czemu można wyświetlać i współtworzyć zapytania w repozytorium github/codeql .

Aby uzyskać bardziej szczegółową dokumentację dotyczącą języka CodeQL, odwiedź dokumentację codeQL w witrynie GitHub.

Język CodeQL obsługuje zarówno skompilowane, jak i interpretowane języki oraz może znajdować luki w zabezpieczeniach i błędy w kodzie napisanym w obsługiwanych językach.

  • C/C++
  • C#
  • Przejdź
  • Java
  • JavaScript/TypeScript
  • Kotlin (beta)
  • Python
  • Ruby
  • Swift

Aby uzyskać więcej informacji, zobacz dokumentację w witrynie internetowej CodeQL w temacie Obsługiwane języki i struktury.

Szczegółowe informacje o konkretnych zapytaniach i zadaniach używanych przez funkcję CodeQL można wyświetlić, przeglądając dziennik kompilacji, podobnie jak w przypadku skanowania zależności.

Zrzut ekranu przedstawiający zadanie skanowania kodu publikujące wyniki

Alerty skanowania kodu

Alerty skanowania kodu w usłudze GitHub Advanced Security dla usługi Azure DevOps obejmują flagi skanowania kodu według repozytorium, które ostrzegają o lukach w zabezpieczeniach aplikacji na poziomie kodu.

Aby użyć skanowania kodu, należy najpierw skonfigurować usługę GitHub Advanced Security dla usługi Azure DevOps.

Karta Advanced Security w obszarze Repozytoria w usłudze Azure DevOps to centrum do wyświetlania alertów skanowania kodu. Wybierz kartę Skanowanie kodu, aby wyświetlić alerty skanowania. Można filtrować według gałęzi, stanu, potoku, typu reguły i ważności. Obecnie centrum alertów nie wyświetla alertów dotyczących skanowania ukończonego w gałęziach żądania ściągnięcia.

Nie ma wpływu na wyniki, jeśli nazwy potoków lub gałęzi zostaną zmienione — wyświetlenie nowej nazwy może potrwać do 24 godzin.

Jeśli zdecydujesz się uruchamiać niestandardowe zapytania CodeQL, nie ma domyślnie oddzielnego filtru dla alertów generowanych z różnych pakietów zapytań. Można filtrować według reguły, która jest odrębna dla każdego zapytania.

Zrzut ekranu przedstawiający alerty skanowania kodu dla repozytorium

Jeśli wyłączysz usługę Advanced Security dla repozytorium, utracisz dostęp do wyników na karcie Zabezpieczenia zaawansowane i zadaniu kompilacji. Zadanie kompilacji nie kończy się niepowodzeniem, ale żadne wyniki z kompilacji są uruchamiane z zadaniem, gdy zabezpieczenia zaawansowane są wyłączone, są ukryte i nie są zachowywane.

Szczegóły alertu

Wybierz alert, aby uzyskać więcej szczegółów, w tym wskazówki dotyczące korygowania. Każdy alert zawiera lokalizację, opis, przykład i ważność.

Zrzut ekranu przedstawiający szczegóły alertu skanowania kodu

Sekcja Wyjaśnienie
Lokalizacja Sekcja Lokalizacje zawiera szczegółowe informacje o konkretnym wystąpieniu, w którym kodQL wykrył lukę w zabezpieczeniach. Jeśli istnieje wiele wystąpień kodu naruszających tę samą regułę, dla każdej odrębnej lokalizacji zostanie wygenerowany nowy alert. Karta Lokalizacje zawiera bezpośredni link do fragmentu kodu, którego dotyczy problem, dzięki czemu możesz wybrać fragment kodu, który ma zostać skierowany do internetowego interfejsu użytkownika usługi Azure DevOps do edycji.
opis Opis jest dostarczany przez narzędzie CodeQL na podstawie problemu.
Zalecenie Zaleceniem jest sugerowana poprawka dla danego alertu skanowania kodu.
Przykład W przykładowej sekcji przedstawiono uproszczony przykład zidentyfikowanej słabości kodu.
Ważność Poziomy ważności mogą być niskie, średnie, wysokie lub krytyczne. Wynik ważności jest oparty na danym wskaźniku common vulnerability scoring System (CVSS) dla zidentyfikowanego wyliczenia wspólnej słabości (CWE). Dowiedz się więcej o tym, jak ważność jest oceniana w tym wpisie w blogu usługi GitHub.

Zarządzanie alertami skanowania kodu

Wyświetlanie alertów dla repozytorium

Każda osoba z uprawnieniami współautora dla repozytorium może wyświetlić podsumowanie wszystkich alertów dla repozytorium na karcie Zabezpieczenia zaawansowane w obszarze Repozytoria. Wybierz kartę Skanowanie kodu, aby wyświetlić wszystkie alerty skanowania wpisów tajnych.

Aby wyświetlić wyniki, należy najpierw uruchomić zadania skanowania kodu. Po zakończeniu pierwszego skanowania wszystkie wykryte luki w zabezpieczeniach zostaną wyświetlone na karcie Zabezpieczenia zaawansowane.

Domyślnie na stronie alertów są wyświetlane wyniki skanowania zależności dla domyślnej gałęzi repozytorium.

Stan danego alertu odzwierciedla stan domyślnej gałęzi i najnowszego potoku uruchamiania, nawet jeśli alert istnieje w innych gałęziach i potokach.

Odrzucanie alertów skanowania kodu

Aby odrzucić alerty, potrzebne są odpowiednie uprawnienia. Domyślnie tylko administratorzy projektu mogą odrzucać alerty usługi Advanced Security.

Aby odrzucić alert:

  1. Przejdź do alertu, który chcesz zamknąć, i wybierz alert.
  2. Wybierz listę rozwijaną Zamknij alert .
  3. Jeśli jeszcze nie wybrano, wybierz opcję Ryzyko zaakceptowane lub Fałszywie dodatnie jako przyczynę zamknięcia.
  4. Dodaj opcjonalny komentarz do pola tekstowego Komentarz .
  5. Wybierz pozycję Zamknij , aby przesłać i zamknąć alert.
  6. Stan alertu zmienia się z Otwórz na Zamknięty , a przyczyna odrzucenia jest wyświetlana.

Zrzut ekranu przedstawiający sposób odrzucania alertu skanowania kodu

Ta akcja odrzuca tylko alert dla wybranej gałęzi. Inne gałęzie, które zawierają tę samą lukę w zabezpieczeniach, pozostają aktywne do czasu odrzucenia. Każdy alert, który został wcześniej odrzucony, można ręcznie otworzyć ponownie.

Używanie zapytań niestandardowych z językiem CodeQL

Domyślnie, jeśli nie masz niestandardowego pliku konfiguracji określonego w konfiguracji potoku, codeQL uruchamia security-extended pakiet zapytań w celu przeanalizowania kodu. Możesz użyć niestandardowych zapytań CodeQL do pisania własnych zapytań w celu znalezienia określonych luk w zabezpieczeniach i błędów. Należy również utworzyć niestandardowy plik konfiguracji, aby zmodyfikować domyślną analizę codeQL.

Aby znaleźć istniejące zapytania niestandardowe lub współtworzyć własne zapytanie niestandardowe, zobacz Współtworzenie koduQL.

Analiza za pomocą zapytań niestandardowych

Najszybszym sposobem rozpoczęcia pracy z zapytaniem niestandardowym jest napisanie zapytania i zapisanie go w lokalnym repozytorium usługi Azure DevOps. Możesz dostosować szczegóły zapytania niestandardowego zgodnie z potrzebami, ale musi mieć co najmniej identyfikator reguły. Aby uzyskać więcej informacji na temat pisania własnego zapytania CodeQL, zobacz Pisanie zapytań CodeQL. Można również połączyć wiele zapytań w zestaw zapytań lub korzystać z pakietów opublikowanych przez inne osoby. Aby uzyskać więcej informacji, zobacz Publikowanie i używanie pakietów CodeQL.

Używanie niestandardowego pliku konfiguracji

Niestandardowy plik konfiguracji to sposób zarządzania zapytaniami uruchamianymi podczas analizy kodu w języku CodeQL. Można określić więcej zapytań lub pakietów zapytań do uruchomienia, a następnie zmienić lub wyłączyć domyślne zapytania CodeQL.

Aby dołączyć określone zapytanie, które chcesz uwzględnić, określ zapytanie o nazwie i ścieżce do lokalizacji pliku zapytania (ql) w repozytorium.

Aby uwzględnić określony pakiet, który chcesz uwzględnić, określ nazwę pakietu. Można określić dowolną liczbę pakietów zapytań CodeQL do uruchomienia w pliku konfiguracji.

Następnym krokiem qlpack.yml jest utworzenie pliku. Ten plik deklaruje pakiet CodeQL i informacje o nim. Wszystkie *.ql pliki w tym samym katalogu (lub podkatalogu) jako qlpack.yml część pakietu są traktowane jako część pakietu.

Napiwek

Filtr packs z pliku konfiguracji obsługuje pobieranie pakietów z repozytoriów hostowanych w usłudze GitHub, chociaż filtr queries go nie obsługuje. Jeśli pakiet jest prywatny w usłudze GitHub, musisz podać token dostępu usługi GitHub za pośrednictwem AdvancedSecurity-Codeql-Init@1 zadania jako zmienną środowiskową i nazwę zmiennej jako GITHUB_TOKEN, z zakresem tokenu jest read:packages.

Oto przykładowy plik konfiguracji:

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

Napiwek

Specyfikacje pliku konfiguracji ignorują konfiguracje na poziomie potoku i mają pierwszeństwo przed konfiguracjami na poziomie potoku AdvancedSecurity-Codeql-Init@1 dla zadania. includepaths / ignorepathszostanie zignorowany lub, jeśli paths/paths-ignore są obecne, zastąpione wartościami z .paths/paths-ignore querysuite zostanie zastąpiony wartościami określonymi w queries pliku konfiguracji lub packs w pliku konfiguracji.

Jeśli używasz dowolnego zapytania niestandardowego, oto przykład qlpack.yml umieszczony w katalogu zapytań niestandardowych:

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

Zmienna dependencies zawiera wszystkie zależności tego pakietu i ich zgodne zakresy wersji. Każda zależność jest przywoływana jako scope/name pakiet biblioteki CodeQL. Podczas definiowania dependencieselementu qlpack.yml zależy od dokładnie jednego z podstawowych pakietów językowych (na przykład JavaScript, C#, Ruby itp.), który określa język, który może analizować zapytanie.

Aby uzyskać bardziej szczegółowe porady i opcje konfiguracji w pliku konfiguracji, zobacz Dostosowywanie zaawansowanej konfiguracji na potrzeby skanowania kodu lub qlpack.yml instalacji, zobacz Struktura pakietu CodeQL.

Po utworzeniu pliku konfiguracji należy dostosować potok z uruchomioną analizą CodeQL, aby korzystać z nowego pliku. Oto przykładowy potok wskazujący plik konfiguracji:

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-Analyze@1
  displayName: Perform CodeQL Analysis

Rozwiązywanie problemów ze skanowaniem kodu

Ogólnie rzecz biorąc, jeśli występują błędy podczas wykonywania codeQL, interfejs wiersza polecenia CodeQL zgłasza stan każdego polecenia, które jest uruchamiane jako kod zakończenia. Kod zakończenia zawiera informacje dotyczące kolejnych poleceń lub innych narzędzi, które korzystają z interfejsu wiersza polecenia CodeQL. Aby uzyskać więcej informacji na temat szczegółów kodu zakończenia, zobacz Kody zakończenia.

Błąd: polecenie CodeQL "database finalize" (32)

Ten błąd wskazuje problem z finalizacją tworzenia bazy danych CodeQL, potencjalnie z powodu błędów wyodrębniania lub brakujących kroków kompilacji.

Kroki rozwiązywania problemów:

  1. Sprawdź, czy kod istnieje i został skompilowany
    • W przypadku skompilowanych języków sprawdź, czy proces kompilacji kompiluje kod i odbywa się między zadaniami AdvancedSecurity-Codeql-Init i AdvancedSecurity-Codeql-Analyze . Typowe polecenia kompilacji i wymagane flagi (takie jak czyste no-cache/no-demon) można znaleźć tutaj w artykule Określanie poleceń kompilacji.
    • W przypadku języków interpretowanych upewnij się, że w projekcie istnieje jakiś kod źródłowy dla określonego języka.
  2. Sprawdzanie błędów wyodrębniania
    • Sprawdź, czy błędy wyodrębniania wpływają na kondycję bazy danych CodeQL.
    • Przejrzyj plik dziennika pod kątem błędów wyodrębniania i ostrzeżeń, aby ocenić ogólną kondycję bazy danych.
  3. Badanie przytłaczających błędów
    • Jeśli większość plików napotka błędy wyodrębniania, zbadaj dokładniej główną przyczynę nieprawidłowego wyodrębniania.

Błąd: skrypt autobuild (1)

Ten błąd opisuje błąd automatycznej kompilacji, sugerując problem z konfiguracją lub konfiguracją skanowania kodu.

Kroki rozwiązywania problemów:

  1. Konfigurowanie kroków kompilacji

Błąd: Katalogi CodeQL nie znaleziono w pamięci podręcznej narzędzi agenta

Ten błąd wskazuje problem z instalowaniem języka CodeQL dla własnych agentów.

Kroki rozwiązywania problemów:

  1. Zapoznaj się z wytycznymi dotyczącymi konfiguracji lub skryptami konfiguracji podanymi w temacie Konfigurowanie usługi GitHub Advanced Security dla usługi Azure DevOps.

Błąd: zmienna potoku języka nie jest ustawiona

Ten błąd występuje podczas próby uruchomienia języka CodeQL bez ustawiania zmiennej potoku określającej języki do skanowania.

Kroki rozwiązywania problemów:

  1. Ustawianie zmiennej potoku języka

KodQL nie zwraca żadnych wyników

Ta sekcja zawiera wskazówki dotyczące sytuacji, w których analiza CodeQL nie daje żadnych wyników.

Kroki rozwiązywania problemów:

  1. Sprawdzanie wykrytych luk w zabezpieczeniach
    • Rozważ możliwość, że kod może naprawdę nie mieć luk w zabezpieczeniach. Jeśli luki w zabezpieczeniach są oczekiwane, ale nie zostały wykryte, przejdź do dalszej weryfikacji.
  2. Przeglądanie konfiguracji zestawu zapytań
    • W razie potrzeby potwierdź używany zestaw zapytań i rozważ przejście do bardziej kompleksowego pakietu.
    • Alternatywnie można tworzyć niestandardowe zestawy zapytań na potrzeby dostosowanej analizy.
  3. Dostosowywanie uprawnień do wyświetlania wyników
    • Upewnij się, że odpowiednie uprawnienia, co najmniej na poziomie współautora, są przyznawane w celu uzyskania dostępu do wyników analizy. Aby uzyskać więcej informacji, zobacz Uprawnienia zabezpieczeń zaawansowanych.

Limit czasu codeQL

AdvancedSecurity-Codeql-Analyze@1 Jeśli zadanie jest wyświetlane This job was abandoned ... we lost contact with the agent i używasz hostowanego agenta firmy Microsoft, zadanie osiąga wbudowany sześciogodzinny limit czasu dla płatnych hostowanych agentów. Możesz zamiast tego podjąć próbę uruchomienia analizy na własnym agencie.

Uprawnienia zadania skanowania kodu

Zadanie kompilacji skanowania kodu używa tożsamości potoku do wywoływania interfejsów API REST usługi Advanced Security. Domyślnie potoki w tym samym projekcie mają dostęp do przekazywania pliku SARIF wygenerowanego przez uruchomienie analizy CodeQL. Jeśli te uprawnienia zostaną usunięte z konta usługi kompilacji lub jeśli masz konfigurację niestandardową (na przykład potok hostowany w innym projekcie niż repozytorium), musisz przyznać te uprawnienia ręcznie.

Kroki rozwiązywania problemów:

  • Udziel Advanced Security: View alerts konta usługi kompilacji używanego w potoku i Advanced Security: Manage and dismiss alerts uprawnienie do tego, które dla potoków o zakresie projektu to [Project Name] Build Service ([Organization Name]), a w przypadku potoków o zakresie kolekcji jest .Project Collection Build Service ([Organization Name])

Ręczna instalacja pakietu CodeQL do własnego agenta

Zainstaluj pakiet CodeQL w pamięci podręcznej narzędzi agenta, korzystając ze skryptu konfiguracji dla architektury dostępnego w usłudze GitHub. Te skrypty wymagają $AGENT_TOOLSDIRECTORY ustawienia zmiennej środowiskowej na lokalizację katalogu narzędzi agenta na agencie, np. C:/agent/_work/_tool. Alternatywnie możesz ręcznie zaimplementować następujące kroki:

  1. Wybierz najnowszy pakiet wersji CodeQL z usługi GitHub.
  2. Pobierz i rozpakuj pakiet do następującego katalogu wewnątrz katalogu narzędzi agenta, zazwyczaj znajdujący się w folderze _work/_tool: ./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/. Przy użyciu bieżącej wersji parametru v2.16.0nazwa folderu będzie miała ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/tytuł . Dowiedz się więcej o katalogu narzędzi agenta.
  3. Utwórz pusty plik o x64.complete nazwie w folderze ./CodeQL/0.0.0-[codeql-release-bundle-tag] . Korzystając z poprzedniego przykładu, ścieżka pliku końcowego do x64.complete pliku powinna mieć wartość ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete.