Eksplorowanie języka CodeQL w usłudze GitHub
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 createpodczas kompilacji. -
Analizowanie bazy danych: Wykonaj
codeql database analyzez 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 createwyodrębnia kod do formatu z możliwością wykonywania zapytań. -
Wykonywanie zapytania:
codeql database analyzeuruchamia zapytania i generuje wyniki. -
Zapytania testowe:
codeql test runsprawdza 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).