Co to jest CodeQL?
CodeQL to aparat analizy używany przez deweloperów do automatyzowania kontroli zabezpieczeń oraz przez badaczy zabezpieczeń do przeprowadzania analizy wariantów.
W języku CodeQL kod jest traktowany jak dane. Luki w zabezpieczeniach, błędy i inne błędy są modelowane jako zapytania, które można wykonywać względem baz danych wyodrębnionych z kodu. Możesz uruchamiać standardowe zapytania CodeQL napisane przez badaczy i współautorów społeczności w usłudze GitHub lub pisać własne, które mają być używane w analizach niestandardowych. Zapytania, które znajdują potencjalne usterki, podkreślają wynik bezpośrednio w pliku źródłowym.
W tej lekcji dowiesz się więcej o narzędziu do analizy statycznej CodeQL i sposobie korzystania z baz danych, zestawów zapytań i pakietów językowych zapytań w celu przeprowadzenia analizy wariantów.
Analiza wariantów
Analiza wariantów to proces używania znanej luki w zabezpieczeniach jako inicjatora w celu znalezienia podobnych problemów w kodzie. Jest to technika używana przez inżynierów zabezpieczeń do identyfikowania potencjalnych luk w zabezpieczeniach i zapewnienia, że te zagrożenia zostały prawidłowo naprawione w wielu bazach kodu.
Wykonywanie zapytań względem kodu przy użyciu języka CodeQL jest najbardziej wydajnym sposobem przeprowadzania analizy wariantów. Możesz użyć standardowych zapytań CodeQL, aby zidentyfikować luki w zabezpieczeniach inicjatora lub znaleźć nowe luki w zabezpieczeniach, pisząc własne niestandardowe zapytania CodeQL. Następnie można opracowywać lub iterować zapytania, aby automatycznie znaleźć logiczne warianty tej samej usterki, która może zostać pominięta przy użyciu tradycyjnych technik ręcznych.
Bazy danych CodeQL
Bazy danych CodeQL zawierają dane z możliwością wykonywania zapytań wyodrębnione z bazy kodu dla pojedynczego języka w określonym momencie w czasie. Baza danych zawiera pełną hierarchiczną reprezentację kodu, w tym reprezentację abstrakcyjnego drzewa składni, grafu przepływu danych i wykresu przepływu sterowania.
Każdy język ma własny unikatowy schemat bazy danych, który definiuje relacje używane do tworzenia bazy danych. Schemat udostępnia interfejs między początkową analizą leksykaną wykonywaną podczas procesu wyodrębniania a rzeczywistą złożoną analizą ewaluatora zapytań CodeQL. Schemat określa na przykład, że istnieje tabela dla każdej konstrukcji języka.
Dla każdego języka biblioteki CodeQL definiują klasy w celu zapewnienia warstwy abstrakcji w tabelach bazy danych. Zapewnia to obiektowy widok danych, co ułatwia pisanie zapytań.
Na przykład w bazie danych CodeQL dla programu Java dwie tabele kluczy to:
- Tabela
expressionszawierająca wiersz dla każdego wyrażenia w kodzie źródłowym, który został przeanalizowany podczas procesu kompilacji. - Tabela
statementszawierająca wiersz dla każdej instrukcji w kodzie źródłowym, który został przeanalizowany podczas procesu kompilacji.
Biblioteka CodeQL definiuje klasy w celu zapewnienia warstwy abstrakcji dla każdej z tych tabel (i powiązanych tabel pomocniczych): Expr i Stmt.
Zestawy zapytań
Zestawy zapytań CodeQL umożliwiają wybieranie zapytań na podstawie nazwy pliku, właściwości metadanych lub lokalizacji na dysku lub w pakiecie QL. Utwórz pakiety zapytań dla zapytań, które mają być często używane w analizach CodeQL.
Zestawy zapytań umożliwiają przekazywanie wielu zapytań do języka CodeQL bez konieczności określania ścieżki do każdego pliku zapytania osobno. Definicje zestawu zapytań są przechowywane w plikach YAML z rozszerzeniem .qls. Definicja pakietu to sekwencja instrukcji, w których każda instrukcja jest mapowaniem YAML z (zwykle) pojedynczym kluczem. Instrukcje są wykonywane w kolejności, w której są wyświetlane w definicji zestawu zapytań. Po wykonaniu wszystkich instrukcji w definicji pakietu wynik jest zestawem wybranych zapytań.
Domyślne zestawy zapytań
Istnieją dwa wbudowane zestawy zapytań dla języka CodeQL:
-
default: Są to zapytania uruchamiane domyślnie w skanowaniu kodu CodeQL w usłudze GitHub, dostępne przy użyciu domyślnej konfiguracji skanowania kodu. Zapytania w tym zestawie zapytań są bardzo precyzyjne i zwracają kilka wyników skanowania kodu fałszywie dodatniego. W stosunku dosecurity-extendedzestawu zapytań domyślny pakiet zwraca mniej wyników skanowania kodu o niskiej pewności. -
security-extended: Ten pakiet zawiera wszystkie zapytania zdefaultpakietu oraz dodatkowe zapytania zabezpieczeń z nieco niższą precyzją i ważnością. Jest ona dostępna z domyślną konfiguracją skanowania kodu i jest wyświetlana jako opcja "Rozszerzona" na liście rozwijanej Zestawy zapytań. W stosunku dodefaultzestawu zapytań ten pakiet może zwrócić większą liczbę wyników skanowania kodu fałszywie dodatniego.
Domyślna konfiguracja skanowania kodu będzie używać default zestawu zapytań. Można to zmienić, wybierając ikonę przepełnienia, aby wyświetlić konfigurację CodeQL, a następnie wybierając przycisk edytuj. W obszarze "Ustawienia skanowania" możesz wybrać jedną z dwóch opcji opisanych jako pakiet zapytań.
Pakiety CodeQL
Pakiety CodedQL służą do organizowania plików używanych w analizie CodeQL, dzięki czemu można łatwo tworzyć, udostępniać, zależeć od i uruchamiać zapytania CodeQL i biblioteki. Zawierają one zapytania, pliki biblioteki, zestawy zapytań i ważne metadane. Za pomocą pakietów CodeQL i poleceń zarządzania pakietami w interfejsie wiersza polecenia CodeQL można opublikować zapytania niestandardowe i zintegrować je z analizą bazy kodu.
Istnieją trzy typy pakietów CodeQL: pakiety zapytań, pakiety biblioteki i pakiety modelu.
- Pakiety zapytań są przeznaczone do uruchamiania. Po opublikowaniu pakietu zapytań pakiet zawiera wszystkie przejściowe zależności i wstępnie skompilowane reprezentacje każdego zapytania oprócz źródeł zapytań. Zapewnia to spójne i wydajne wykonywanie zapytań w pakiecie.
- Pakiety bibliotek są przeznaczone do użycia przez pakiety zapytań (lub inne pakiety biblioteki) i nie zawierają samych zapytań. Biblioteki nie są kompilowane oddzielnie.
- Pakiety modelu mogą służyć do rozszerzania analizy skanowania kodu w celu uwzględnienia zależności, które nie są domyślnie obsługiwane. Pakiety modelu są obecnie w wersji beta i mogą ulec zmianie. W okresie beta pakiety modelu są dostępne do analizy języka Java na poziomie repozytorium. Aby uzyskać więcej informacji na temat tworzenia własnych pakietów modelu, zobacz "Tworzenie pakietu modelu CodeQL".
Struktura pakietu CodeQL
Interfejs wiersza polecenia CodeQL może służyć do tworzenia i publikowania pakietu przy użyciu polecenia pack init. To polecenie utworzy wymaganą strukturę katalogu i pliki, w tym główny plik o nazwie qlpack.yml w katalogu głównym. Metadane w każdym qlpack.yml pliku informują CodeQL, jak skompilować wszystkie zapytania w pakiecie, biblioteki, od których zależy pakiet i od czego można znaleźć definicje zestawu zapytań.
Zawartość pakietu CodeQL (zapytania lub biblioteki używane w analizie CodeQL) znajduje się w tym samym katalogu co qlpack.yml, lub jego podkatalogach.
Katalog zawierający plik qlpack.yml służy jako katalog główny zawartości pakietu CodeQL. Oznacza to, że dla wszystkich plików .ql i plików .qll w pakiecie, CodeQL rozpozna wszystkie instrukcje importu względem katalogu, który zawiera plik qlpack.yml w katalogu głównym pakietu.
Oto przykładowy qlpack.yml plik:
name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
codeql/java-all: "*"
codeql/suite-helpers: "*"
Aby uzyskać więcej informacji na temat tworzenia i publikowania własnych pakietów CodeQL, zobacz "Publikowanie i używanie pakietów CodeQL".[1]