Was ist CodeQL?

Abgeschlossen

CodeQL ist die Analyse-Engine, die von Entwicklern zum Automatisieren von Sicherheitsüberprüfungen und von Sicherheitsexperten zum Durchführen von Variantenanalysen verwendet wird.

In CodeQL wird Code wie Daten behandelt. Sicherheitsrisiken, Fehler und andere Probleme werden als Abfragen modelliert, die für aus Code extrahierte Datenbanken ausgeführt werden können. Sie können die CodeQL-Standardabfragen ausführen, die von GitHub-Experten und Mitwirkenden der Community geschrieben wurden, oder eigene Abfragen zur Verwendung in benutzerdefinierten Analysen schreiben. Abfragen, die potenzielle Fehler finden, markieren das Ergebnis direkt in der Quelldatei.

In dieser Lerneinheit erfahren Sie mehr über das statische Analysetool CodeQL und darüber, wie es Datenbanken, Abfragesammlungen und Abfragesprachpakete verwendet, um Variantenanalysen durchzuführen.

Variantenanalyse

Bei der Variantenanalyse wird ein bekanntes Sicherheitsrisiko als Ausgangswert verwendet, um ähnliche Probleme in Ihrem Code zu identifizieren. Es ist eine Technik, die Sicherheitstechniker verwenden, um potenzielle Sicherheitsrisiken zu identifizieren und sicherzustellen, dass diese Bedrohungen über mehrere Codebasen ordnungsgemäß behoben sind.

Das Abfragen von Code mithilfe von CodeQL ist die effizienteste Methode zum Durchführen von Variantenanalysen. Sie können die CodeQL-Standardabfragen verwenden, um Seedsicherheitsrisiken zu identifizieren, oder neue Sicherheitsrisiken ermitteln, indem Sie Ihre eigenen benutzerdefinierten CodeQL-Abfragen schreiben. Anschließend können Sie die Abfrage entwickeln oder durchlaufen, um automatisch logische Varianten desselben Fehlers zu finden, die mit herkömmlichen manuellen Techniken übersehen werden könnten.

CodeQL-Datenbanken

CodeQL-Datenbanken enthalten abfragefähige Daten, die aus einer Codebasis für eine einzelne Sprache zu einem bestimmten Zeitpunkt extrahiert wurden. Die Datenbank enthält eine vollständige hierarchische Darstellung des Codes, einschließlich einer Darstellung der abstrakten Syntaxstruktur, des Datenflussdiagramms und des Ablaufsteuerungsdiagramms.

Jede Sprache verfügt über ein eigenes eindeutiges Datenbankschema, das die Beziehungen definiert, die zum Erstellen einer Datenbank verwendet werden. Das Schema stellt eine Schnittstelle zwischen der anfänglichen lexikalischen Analyse während des Extraktionsvorgangs und der eigentlichen komplexen Analyse der CodeQL-Abfrageauswertung bereit. Das Schema gibt beispielsweise an, dass für jedes Sprachkonstrukt eine Tabelle vorhanden ist.

Für jede Sprache definieren die CodeQL-Bibliotheken Klassen, um eine Abstraktionsebene für die Datenbanktabellen bereitzustellen. Diese Vorgehensweise bietet eine objektorientierte Sicht der Daten, die das Schreiben von Abfragen vereinfacht.

In einer CodeQL-Datenbank für ein Java-Programm sind beispielsweise diese zwei Schlüsseltabellen vorhanden:

  • Die expressions-Tabelle enthält eine Zeile für jeden einzelnen Ausdruck im Quellcode, der während des Buildprozesses analysiert wurde.
  • Die statements-Tabelle enthält eine Zeile für jede einzelne Anweisung im Quellcode, die während des Buildprozesses analysiert wurde.

Die CodeQL-Bibliothek definiert Klassen, um eine Abstraktionsebene für jede dieser Tabellen (und die zugehörigen Hilfstabellen) bereitzustellen: Expr und Stmt.

Abfragesammlungen

CodeQL-Abfragesammlungen bieten eine Möglichkeit, Abfragen basierend auf ihrem Dateinamen, Metadateneigenschaften oder Speicherort auf dem Datenträger oder in einem QL-Paket auszuwählen. Erstellen Sie Abfragesammlungen für die Abfragen, die Sie häufig in Ihren CodeQL-Analysen verwenden möchten.

Abfragesammlungen ermöglichen es Ihnen, mehrere Abfragen an CodeQL zu übergeben, ohne den Pfad zu jeder Abfragedatei einzeln angeben zu müssen. Abfrage-Suiten-Definitionen werden in YAML-Dateien mit der Erweiterung .qls gespeichert. Eine Sammlungsdefinition ist eine Sequenz von Anweisungen, wobei jede Anweisung eine YAML-Zuordnung mit (normalerweise) einem einzelnen Schlüssel ist. Die Anweisungen werden in der Reihenfolge ausgeführt, in der sie in der Abfragesammlungsdefinition vorliegen. Nachdem alle Anweisungen in der Sammlungsdefinition ausgeführt wurden, ist das Ergebnis ein Satz ausgewählter Abfragen.

Standardabfrage-Suiten

Es gibt zwei integrierte Abfragesammlungen für CodeQL:

  • default: Dies sind die Abfragen, die standardmäßig in der CodeQL-Codeüberprüfung auf GitHub ausgeführt werden und mit dem Standardsetup der Codeüberprüfung verfügbar ist. Die Abfragen in dieser Abfragesuite sind sehr präzise und geben nur wenige falsch positive Codeüberprüfungsergebnisse zurück. Im Vergleich zur Abfragesuite security-extended liefert die Standardsuite weniger Codeüberprüfungsergebnisse mit geringer Konfidenz.
  • security-extended: Diese Suite enthält alle Abfragen aus der default-Suite sowie zusätzliche Sicherheitsabfragen mit etwas geringerer Genauigkeit und niedrigerem Schweregrad. Sie ist mit dem Standardmäßigen Setup der Codeüberprüfung verfügbar und wird in der Dropdownliste der Abfragesammlungen als Option "Erweitert" aufgeführt. Im Vergleich zur Abfragesuite default gibt diese Suite unter Umständen eine größere Anzahl falsch positiver Codeüberprüfungsergebnisse zurück.

Im Standardsetup der Codeüberprüfung wird die Abfragesuite default verwendet. Dies kann geändert werden, indem Sie das Überlaufsymbol auswählen, um die CodeQL-Konfiguration anzuzeigen, und dann auf die Schaltfläche "Bearbeiten" klicken. Unter "Scaneinstellungen" können Sie eine der beiden Optionen auswählen, die als Abfragesuite beschrieben sind.

CodeQL-Pakete

CodedQL-Pakete werden verwendet, um die in der CodeQL-Analyse verwendeten Dateien zu organisieren, damit Sie CodeQL-Abfragen und -Bibliotheken einfach erstellen, freigeben, Abhängigkeiten davon definieren und ausführen können. Sie enthalten Abfragen, Bibliotheksdateien, Abfragesammlungen und wichtige Metadaten. Mit CodeQL-Paketen und den Paketverwaltungsbefehlen in der CodeQL CLI können Sie Ihre benutzerdefinierten Abfragen veröffentlichen und in die Analyse Ihrer Codebasis integrieren.

Es gibt drei Arten von CodeQL-Paketen: Abfragepakete, Bibliothekspakete und Modellpakete.

  • Abfragepakete sind zum Ausführen konzipiert. Wenn ein Abfragepaket veröffentlicht wird, enthält das Paket zusätzlich zu den Abfragequellen alle transitiven Abhängigkeiten und vorkompilierte Darstellungen jeder Abfrage. Dadurch wird konsistentes und effizientes Ausführen der Abfragen im Paket sichergestellt.
  • Bibliothekspakete sind so konzipiert, dass sie von Abfragepaketen (oder anderen Bibliothekspaketen) verwendet werden und keine Abfragen selbst enthalten. Die Bibliotheken werden nicht separat kompiliert.
  • Modellpakete können verwendet werden, um die Codeüberprüfungsanalyse zu erweitern, um Abhängigkeiten einzuschließen, die standardmäßig nicht unterstützt werden. Modellpakete befinden sich derzeit in der Betaphase und können noch geändert werden. Während der Betaversion stehen Modellpakete für die Java-Analyse auf Repositoryebene zur Verfügung. Weitere Informationen zum Erstellen eigener Modellpakete finden Sie unter „Erstellen eines CodeQL-Modellpakets“.

CodeQL-Paketstruktur

Die CodeQL CLI kann zum Entwickeln und Veröffentlichen eines Pakets mithilfe des pack init Befehls verwendet werden. Dieser Befehl erstellt die erforderliche Verzeichnisstruktur und die erforderlichen Dateien, einschließlich der Hauptdatei namens qlpack.yml im Stammverzeichnis. Die Metadaten in jeder qlpack.yml-Datei teilen CodeQL mit, wie Abfragen im Paket zu kompilieren sind, von welchen Bibliotheken das Paket abhängt und wo die Definitionen der Abfragesuite zu finden sind.

Der Inhalt des CodeQL-Pakets (Abfragen oder Bibliotheken, die in der CodeQL-Analyse verwendet werden) befindet sich im selben Verzeichnis wie qlpack.yml oder in dessen Unterverzeichnissen.

Das Verzeichnis, das die Datei „qlpack.yml“ enthält, fungiert als Stammverzeichnis für den Inhalt des CodeQL-Pakets. Das heißt, für alle .ql-Dateien und .qll-Dateien im Paket wird CodeQL alle Importanweisungen relativ zu dem Verzeichnis auflösen, das die qlpack.yml-Datei im Root-Verzeichnis des Pakets enthält.

Hier ist ein Beispiel für eine qlpack.yml-Datei angegeben:

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: "*"

Weitere Informationen zum Erstellen und Veröffentlichen eigener CodeQL-Pakete finden Sie unter „Veröffentlichen und Verwenden von CodeQL-Paketen“.[1]