Eksplorowanie języka CodeQL w usłudze GitHub

Ukończone

Co to jest CodeQL

CodeQL to semantyczny aparat analizy kodu opracowany przez usługę GitHub, który traktuje kod jako dane. Zamiast po prostu wyszukiwać wzorce tekstu, codeQL rozumie strukturę i znaczenie kodu, umożliwiając zaawansowane analizy zabezpieczeń i jakości.

Tradycyjne narzędzia do analizy statycznej często generują fałszywie dodatnie wyniki, ponieważ używają prostego dopasowywania wzorców. Semantyczne podejście codeQL rozumie kontekst kodu, relacje między elementami kodu i przepływ danych przez aplikacje, co zapewnia dokładniejsze wykrywanie luk w zabezpieczeniach.

Kluczowe cechy języka CodeQL

CodeQL traktuje kod jako bazę danych:

  • Reprezentacja strukturalna: Konwertuje kod źródłowy na bazę danych, która przechwytuje drzewa składni, wykresy przepływu sterowania i ścieżki przepływu danych.
  • Format z możliwością wykonywania zapytań: Umożliwia wykonywanie zapytań dotyczących kodu przy użyciu wyspecjalizowanego języka zapytań, podobnie jak w przypadku wykonywania zapytań względem tradycyjnej bazy danych.
  • Podejście niezależne od języka: Obsługuje wiele języków programowania, w tym C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go i Swift.
  • Kompleksowe pokrycie: Analizuje nie tylko pojedyncze pliki, ale całe bazy kodu ze wszystkimi ich połączeniami.

Funkcja CodeQL umożliwia dokładną analizę zabezpieczeń:

  • Analiza wariantów: Po zidentyfikowaniu jednej luki w zabezpieczeniach możesz napisać zapytania, aby znaleźć podobne problemy w całej bazie kodu.
  • Analiza przepływu danych: Śledzi sposób przechodzenia danych przez aplikację ze źródeł (danych wejściowych użytkownika) do ujściów (operacji poufnych).
  • Monitorowanie skażeń: Określa, kiedy niezaufane dane docierają do poufnych operacji bez odpowiedniej walidacji lub sanitizacji.
  • Analiza przepływu sterowania: Poznaje ścieżki wykonywania i logikę warunkową, aby znaleźć luki w zabezpieczeniach, które występują tylko w określonych warunkach.

Jak działa kodQL

Analiza CodeQL obejmuje trzy odrębne fazy, które przekształcają kod źródłowy w możliwe do działania wyniki zabezpieczeń:

Faza 1. Tworzenie bazy danych CodeQL

Pierwszy krok wyodrębnia ustrukturyzowaną reprezentację kodu:

  • Wyodrębnianie kodu: Analizuje pliki źródłowe podczas kompilacji lub za pośrednictwem analizy statycznej.
  • Tworzenie bazy danych: Tworzy kompleksową bazę danych reprezentującą strukturę kodu, w tym abstrakcyjne drzewa składni, wykresy przepływu sterowania i zależności danych.
  • Przechwytywanie metadanych: Rejestruje lokalizacje plików, numery wierszy, zakresy zmiennych, wywołania funkcji i hierarchie klas.
  • Optymalizacja: Indeksuje bazę danych pod kątem wydajnego wykonywania zapytań, nawet w przypadku dużych baz kodu.

Ta baza danych staje się podstawą wszystkich kolejnych analiz. Tworzone jest raz i może być zapytane wiele razy, dzięki czemu iteracyjna analiza bezpieczeństwa jest wydajna.

Faza 2. Uruchamianie zapytań CodeQL

Gdy baza danych istnieje, wykonujesz zapytania w celu znalezienia problemów z zabezpieczeniami:

  • Standardowe pakiety zapytań: Usługa GitHub udostępnia wyselekcjonowane zestawy zapytań dla typowych luk w zabezpieczeniach (OWASP Top 10, CWE standards).
  • Zapytania niestandardowe: Napisz własne zapytania, aby znaleźć wzorce zabezpieczeń specyficzne dla organizacji lub naruszenia standardów kodowania.
  • Wykonywanie zapytania: Aparat CodeQL uruchamia zapytania względem bazy danych, wyszukując wzorce kodu zgodne z sygnaturami luk w zabezpieczeniach.
  • Wydajność: Zapytania są wykonywane szybko, ponieważ działają na indeksowanej bazie danych, a nie na nieprzetworzonych plikach źródłowych.

Przykładowe kategorie zapytań obejmują:

  • Luki w zabezpieczeniach polegających na wstrzyknięciu: Wstrzyknięcie kodu SQL, wstrzyknięcie polecenia, wykonywanie skryptów między lokacjami.
  • Problemy z uwierzytelnianiem: Słabe zasady haseł, brak kontroli uwierzytelniania, niezabezpieczone zarządzanie sesjami.
  • Problemy z kryptografią: Słabe algorytmy, trwale zakodowane poświadczenia, niewystarczająca losowość.
  • Zarządzanie zasobami: Przecieki pamięci, wyczerpanie zasobów, niekontrolowane zużycie zasobów.

Faza 3. Interpretowanie wyników

Ostatnia faza przedstawia wyniki w formatach z możliwością działania:

  • Klasyfikacja wyników: Funkcja CodeQL określa priorytety wyników według ważności, poziomu ufności i możliwości wykorzystania.
  • Informacje kontekstowe: Każde wyszukiwanie obejmuje lokalizacje plików, numery wierszy, fragmenty kodu, których dotyczy problem, oraz ścieżki przepływu danych.
  • Wskazówki dotyczące korygowania: Wyniki obejmują wyjaśnienia luk w zabezpieczeniach i zalecenia dotyczące jego naprawiania.
  • Integracja: Wyniki integrują się z kartą zabezpieczeń usługi GitHub, adnotacjami żądań ściągnięcia i plikami SARIF dla narzędzi zewnętrznych.

Język zapytań CodeQL

Zapytania CodeQL są pisane w języku deklaratywnym zaprojektowanym specjalnie do analizowania kodu:

Struktura i składnia zapytań

CodeQL używa programowania logiki obiektowej:

  • Klasy i predykaty: Zdefiniuj, czego szukasz przy użyciu klas reprezentujących elementy kodu (funkcje, zmienne, wyrażenia).
  • Podejście deklaratywne: Opisz, co chcesz znaleźć, a nie jak go znaleźć.
  • Dopasowywanie wzorca: Użyj predykatów, aby dopasować wzorce kodu i relacje.
  • Możliwość komponowania: Twórz złożone zapytania, łącząc prostsze predykaty.

Przykładowa struktura zapytań:

import javascript

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

To zapytanie wyszukuje luki w zabezpieczeniach polegających na wstrzyknięciu kodu SQL przez:

  • Identyfikowanie punktów wykonywania SQL.
  • Znajdowanie źródeł danych wejściowych użytkownika.
  • Śledzenie przepływu danych z danych wejściowych do wykonywania SQL.
  • Raportowanie luk w zabezpieczeniach z kontekstem.

Standardowe biblioteki zapytań

Usługa GitHub udostępnia rozbudowane biblioteki zapytań:

  • Zapytania zabezpieczeń: Wykrywanie luk OWASP Top 10, kategorii CWE i problemów z zabezpieczeniami specyficznymi dla języków programowania.
  • Zapytania dotyczące jakości kodu: Znajdowanie smrodu kodu, problemów z konserwacją, problemów z wydajnością i naruszeń najlepszych praktyk.
  • Wkład społeczności: Tysiące zapytań zgłoszonych przez badaczy zabezpieczeń i deweloperów.
  • Regularne aktualizacje: Usługa GitHub Security Lab stale dodaje nowe zapytania dotyczące pojawiających się luk w zabezpieczeniach.

Możesz użyć tych zapytań as-is lub dostosować je do określonych potrzeb.

CodeQL w zabezpieczeniach usługi GitHub

CodeQL integruje się głęboko z funkcjami zabezpieczeń usługi GitHub:

Skanowanie kodu za pomocą języka CodeQL

Automatyczna analiza zabezpieczeń:

  • Konfiguracja domyślna: Włącz skanowanie CodeQL jednym kliknięciem w ustawieniach repozytorium.
  • Zaplanowane skanowania: Automatycznie skanuje przy każdym wypchnięciu, żądaniu ściągnięcia lub zgodnie z harmonogramem.
  • Obsługa wielu języków: Automatycznie wykrywa języki w repozytorium i uruchamia odpowiednie zapytania.
  • Prezentacja wyników: Wyniki zabezpieczeń są wyświetlane na karcie Zabezpieczenia ze szczegółowymi wyjaśnieniami.

Integracja żądania ściągnięcia:

  • Adnotacje wbudowane: Wyniki zabezpieczeń są wyświetlane jako komentarze bezpośrednio na wrażliwych wierszach kodu w żądaniach ściągnięcia.
  • Kontrole blokujące: Skonfiguruj CodeQL jako wymagane sprawdzenie, które musi zostać zaliczone przed scaleniem.
  • Skanowanie różnicowe: Zgłasza tylko nowe luki w zabezpieczeniach wprowadzone przez żądanie ściągnięcia, zmniejszając szum.
  • Opinie deweloperów: Deweloperzy widzą problemy z zabezpieczeniami natychmiast, gdy kod jest świeży w ich umysłach.

GitHub Advanced Security

W przypadku organizacji usługa GitHub Advanced Security oferuje dodatkowe możliwości:

  • Skanowanie repozytorium prywatnego: Uruchom plik CodeQL w repozytoriach prywatnych.
  • Wykonywanie zapytania niestandardowego: Przekazywanie i uruchamianie zapytań specyficznych dla organizacji.
  • Omówienie zabezpieczeń: Pulpit nawigacyjny przedstawiający stan zabezpieczeń we wszystkich repozytoriach.
  • Zarządzanie alertami: Klasyfikowanie, przypisywanie i śledzenie wyników zabezpieczeń w różnych zespołach.

Korzystanie z CodeQL w potokach CI/CD

CodeQL wykracza poza usługę GitHub, aby integrować się z różnymi systemami CI/CD:

Podejścia do integracji

Integracja funkcji 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

Ten przepływ pracy:

  • Inicjuje kodQL dla określonych języków.
  • Kompiluje aplikację (lub analizuje bez kompilowania).
  • Uruchamia zapytania zabezpieczeń.
  • Przekazuje wyniki do karty Zabezpieczenia usługi GitHub.

Integracja z usługą Azure Pipelines:

CodeQL można uruchomić w usłudze Azure Pipelines za pomocą interfejsu wiersza poleceń.

  • Zainstaluj CodeQL CLI: Pobierz i zainstaluj zestaw CodeQL w potoku.
  • Tworzenie bazy danych: Uruchom polecenie codeql database create podczas kompilacji.
  • Analizowanie bazy danych: Wykonaj codeql database analyze z wybranymi pakietami zapytań.
  • Eksportuj wyniki: Generowanie plików SARIF na potrzeby wizualizacji w usłudze Azure DevOps.

Inne systemy ciągłej integracji/ciągłego wdrażania:

CLI CodeQL obsługuje dowolną platformę CI/CD.

  • Jenkins: Wykonaj analizę CodeQL w ramach kroków budowy.
  • GitLab CI/CD: Uruchamianie CodeQL w potokach GitLab z wynikami w formacie SARIF.
  • CircleCI: Integrowanie skanowania CodeQL z przepływami pracy CircleCI.
  • Systemy niestandardowe: Użyj interfejsu wiersza polecenia CodeQL z dowolnego środowiska, które może uruchamiać narzędzia wiersza polecenia.

Bramy zabezpieczeń

Użyj wyników CodeQL jako bram jakości:

  • Niepowodzenia kompilacji: Skonfiguruj potoki, aby kończyły się niepowodzeniem, gdy CodeQL wykryje podatności o wysokim ryzyku.
  • Analiza trendów: Śledzenie metryk zabezpieczeń w czasie w celu mierzenia poprawy.
  • Wymagania dotyczące zgodności: Generuj dowody skanowania zabezpieczeń na potrzeby inspekcji i certyfikacji zgodności.
  • Automatyczne korygowanie: Wyzwalaj zautomatyzowane przepływy pracy po wykryciu określonych luk w zabezpieczeniach.

Narzędzia programistyczne CodeQL

CodeQL udostępnia narzędzia do tworzenia i testowania zapytań:

Rozszerzenie Visual Studio Code

Oficjalne rozszerzenie CodeQL dla programu VS Code oferuje:

  • Programowanie zapytań: Pisanie i testowanie zapytań CodeQL przy użyciu wyróżniania składni, autouzupełniania i wbudowanej dokumentacji.
  • Analiza lokalnej bazy danych: Uruchamianie zapytań względem baz danych utworzonych na podstawie lokalnych baz kodu.
  • Wizualizacja wyników: Zobacz wyniki zapytania z nawigacją kodu źródłowego i ścieżkami przepływu danych.
  • Obsługa debugowania: Zapoznaj się z wykonywaniem zapytań, aby zrozumieć wyniki i zoptymalizować wydajność.

Interfejs wiersza polecenia

Interfejs wiersza polecenia CodeQL umożliwia analizowanie skryptowe:

  • Tworzenie bazy danych:codeql database create wyodrębnia kod do formatu z możliwością wykonywania zapytań.
  • Wykonywanie zapytania:codeql database analyze uruchamia zapytania i generuje wyniki.
  • Zapytania testowe:codeql test run sprawdza poprawność zapytań względem przypadków testowych.
  • Zarządzanie pakietami: Pobieranie standardowych pakietów zapytań i zarządzanie nimi.

Zalety języka CodeQL na potrzeby automatyzacji zabezpieczeń

Zintegrowanie języka CodeQL z procesem DevSecOps zapewnia znaczne korzyści:

Produktywność deweloperów

Wczesne wykrywanie:

  • Zabezpieczenia z lewej strony: Znajdowanie luk w zabezpieczeniach podczas programowania, a nie w środowisku produkcyjnym.
  • Szybsze korygowanie: Rozwiązywanie problemów, gdy kod jest świeży, a zmiany są małe.
  • Możliwości szkoleniowe: Deweloperzy uczą się bezpiecznych praktyk kodowania poprzez natychmiastową informację zwrotną.
  • Zredukowane przełączanie kontekstu: Wyniki zabezpieczeń są wyświetlane w znanych narzędziach programistycznych.

Dokładne wyniki:

  • Niska liczba fałszywie pozytywnych wyników: Analiza semantyczna generuje dokładniejsze wyniki niż dopasowywanie wzorców.
  • Informacje kontekstowe: Wyniki obejmują ścieżki przepływu danych pokazujące dokładnie, jak występują luki w zabezpieczeniach.
  • Zasadnicze ustalenia: Skoncentruj się na problemach podatnych na wykorzystanie, a nie kwestiach teoretycznych.
  • Odnajdywanie wariantów: Znajdź wszystkie wystąpienia wzorca luk w zabezpieczeniach, a nie tylko oczywiste przykłady.

Zabezpieczenia organizacyjne

Kompleksowe pokrycie:

  • Cała baza kodu: Przeanalizuj cały kod, w tym zależności innych firm i starsze składniki.
  • Wiele języków: Jednolita analiza bezpieczeństwa w aplikacjach poliglotycznych.
  • Spójne standardy: Zastosuj te same reguły zabezpieczeń we wszystkich repozytoriach.
  • Analiza historyczna: Przeskanuj istniejący kod, aby ustanowić punkty odniesienia zabezpieczeń.

Skalowalne zabezpieczenia:

  • Automatyczne skanowanie: Nie są wymagane ręczne przeglądy zabezpieczeń dla każdego zatwierdzenia.
  • Ciągłe monitorowanie: Regularne skanowania wykrywają nowo ujawnione luki w zabezpieczeniach.
  • Zabezpieczenia jako kod: Kodyfikuj wymagania dotyczące zabezpieczeń jako zapytania przechowywane w kontroli wersji.
  • Udostępnianie wiedzy: Biblioteki zapytań przechwytują wiedzę o zabezpieczeniach instytucjonalnych.

Zgodność i ład

Dzienniki inspekcji:

  • Historia skanowania: Rekord wszystkich skanowań zabezpieczeń ze znacznikami czasu i wynikami.
  • Śledzenie cyklu życia: Śledzenie luk w zabezpieczeniach od momentu wykrycia po ich naprawę.
  • Wymuszanie zasad: Udowadniaj, że skanowanie bezpieczeństwa przeprowadza się dla każdej wersji.
  • Generowanie dowodów: Tworzenie raportów dla audytorów i struktur zgodności.

Aby uzyskać więcej informacji na temat języka CodeQL, zobacz CodeQL Overview (Omówienie języka CodeQL).

Aby uzyskać dostępne narzędzia, zobacz CodeQL Tools (Narzędzia CodeQL).