Qu’est-ce que CodeQL ?
CodeQL est le moteur d’analyse utilisé par les développeurs pour automatiser les vérifications de sécurité et par les chercheurs en sécurité pour effectuer une analyse des variantes.
Dans CodeQL, le code est traité comme des données. Les vulnérabilités de sécurité, les bogues et d’autres erreurs sont modélisés en tant que requêtes qui peuvent être exécutées sur des bases de données extraites d’un code. Vous pouvez exécuter les requêtes CodeQL standard, écrites par des chercheurs et contributeurs de la communauté GitHub, ou écrire les vôtres pour les utiliser dans des analyses personnalisées. Les requêtes qui recherchent les bogues potentiels mettent en évidence le résultat directement dans le fichier source.
Dans cette unité, vous allez découvrir l’outil d’analyse statique CodeQL et la façon dont il utilise les bases de données, les suites de requêtes et les packs de langages de requête pour effectuer une analyse des variantes.
Analyse des variantes
L’analyse des variantes est le processus qui consiste à utiliser une faille de sécurité connue comme valeur initiale pour rechercher des problèmes similaires dans votre code. Il s’agit d’une technique que les ingénieurs de sécurité utilisent pour identifier les vulnérabilités potentielles et s’assurer que ces menaces sont correctement corrigées sur plusieurs bases de code.
L’interrogation du code à l’aide de CodeQL est la méthode la plus efficace pour effectuer une analyse des variantes. Vous pouvez utiliser les requêtes CodeQL standard pour identifier les vulnérabilités de départ, ou rechercher de nouvelles vulnérabilités en écrivant vos propres requêtes CodeQL personnalisées. Ensuite, vous pouvez développer ou itérer sur la requête pour rechercher automatiquement les variantes logiques du même bogue qui pourraient être non détectées avec les techniques manuelles traditionnelles.
Bases de données CodeQL
Les bases de données CodeQL contiennent des données interrogeables extraites d’une base de code pour une seule langue à un moment donné. La base de données contient une représentation hiérarchique complète du code, y compris une représentation de l’arborescence de la syntaxe abstraite, le graphique de flux de données et le graphique de flux de contrôle.
Chaque langage possède son propre schéma de base de données unique qui définit les relations utilisées pour créer une base de données. Le schéma fournit une interface entre l’analyse lexicale initiale effectuée lors du processus d’extraction et l’analyse complexe réelle de l’évaluateur de requête CodeQL. Le schéma spécifie par exemple qu’il existe une table pour chaque construction du langage.
Pour chaque langage, les bibliothèques CodeQL définissent des classes pour fournir une couche d’abstraction sur les tables de base de données. Ceci fournit une vue orientée objet des données, ce qui facilite l’écriture des requêtes.
Par exemple, dans une base de données CodeQL pour un programme Java, deux tables clés sont :
- La table
expressions, qui contient une ligne pour chaque expression individuelle du code source qui a été analysée pendant le processus de build. - La table
statements, qui contient une ligne pour chaque instruction individuelle du code source qui a été analysée pendant le processus de build.
La bibliothèque CodeQL définit des classes pour fournir une couche d’abstraction sur chacune de ces tables (et les tables auxiliaires associées) : Expr et Stmt.
Suites de requêtes
Les suites de requêtes CodeQL permettent de sélectionner des requêtes en fonction de leur nom de fichier, de leurs propriétés de métadonnées ou de leur emplacement sur le disque ou dans un pack QL. Créez des suites de requêtes pour les requêtes que vous souhaitez fréquemment utiliser dans vos analyses CodeQL.
Les suites de requêtes vous permettent de passer plusieurs requêtes à CodeQL sans avoir à spécifier le chemin d’accès à chaque fichier de requête individuellement. Les définitions de suite de requêtes sont stockées dans des fichiers YAML avec l’extension .qls. Une définition de suite est une séquence d’instructions, où chaque instruction est un mappage YAML avec (en général) une clé unique. Les instructions sont exécutées dans l’ordre dans lequel elles apparaissent dans la définition de la suite de requêtes. Une fois que toutes les instructions de la définition de la suite ont été exécutées, le résultat est un ensemble de requêtes sélectionnées.
Suites de requêtes par défaut
Il existe trois suites de requêtes intégrées pour CodeQL :
-
default: Voici les requêtes exécutées par défaut dans l’analyse de code CodeQL sur GitHub, disponible dans la configuration par défaut de l’analyse de code. Les requêtes de cette suite de requêtes sont très précises et ne renvoient que peu de résultats d’analyse de code faux positifs. Par rapport à la suite de requêtessecurity-extended, la suite par défaut renvoie moins de résultats d'analyse de code à faible confiance. -
security-extended: Cette suite contient toutes les requêtes de la suitedefault, plus des requêtes de sécurité supplémentaires avec une précision et une gravité légèrement inférieures. Elle est disponible avec la configuration par défaut de l’analyse du code et est répertoriée comme option « Étendue » dans la liste déroulante suites de requêtes. Par rapport à la suitedefault, cette suite peut renvoyer un nombre plus grand de résultats d’analyse de code faux positifs.
La configuration par défaut de l’analyse de code utilisera la suite de requêtes default. Cela peut être modifié en sélectionnant l’icône de dépassement de capacité pour afficher la configuration CodeQL, puis en sélectionnant le bouton Modifier. Sous « Paramètres d’analyse », vous pouvez choisir l’une des deux options décrites comme suite de requêtes.
Packs CodeQL
Les packs CodeQL sont utilisés pour organiser les fichiers utilisés lors de l’analyse CodeQL pour que vous puissiez créer, partager, compter sur, et exécuter des requêtes et des bibliothèques CodeQL aisément. Ils contiennent des requêtes, des fichiers de bibliothèque, des suites de requêtes et des métadonnées importantes. Avec les packs CodeQL et les commandes de gestion de packages dans la CLI CodeQL, vous pouvez publier vos requêtes personnalisées et les intégrer dans votre analyse de base de code.
Il existe trois types de packs CodeQL, les packs de requêtes, les packs de bibliothèques, et les packs de modèles.
- Les packs de requêtes sont conçus pour être exécutés. Quand un pack de requêtes est publié, le paquet inclut toutes les dépendances transitives et les représentations pré-compilées de chaque requête en plus des sources des requêtes. Ceci garantit une exécution cohérente et efficace des requêtes dans le pack.
- Les packs de bibliothèque sont conçus pour être utilisés par des packs de requêtes (ou d’autres packs de bibliothèque) et ne contiennent pas de requêtes elles-mêmes. Les bibliothèques ne sont pas compilées séparément.
- Les packs de modèles peuvent être utilisés pour développer l’analyse de l’analyse du code afin d’inclure des dépendances qui ne sont pas prises en charge par défaut. Les packs de modèles sont actuellement en version bêta et peuvent faire l’objet de modifications. Pendant la phase bêta, des packs de modèles sont disponibles pour l'analyse Java au niveau du référentiel. Pour plus d’informations sur la création de vos propres packs de modèles, consultez « Créer un pack de modèles CodeQL ».
Structure d’un pack CodeQL
L’interface CLI CodeQL peut être utilisée pour développer et publier un pack à l’aide de la pack init commande. Cette commande créera la structure de répertoire et les fichiers requis, y compris le fichier principal appelé qlpack.yml dans son répertoire racine. Les métadonnées de chaque fichier qlpack.yml indiquent à CodeQL comment compiler des requêtes du pack, de quelles bibliothèques le pack dépend, et où trouver les définitions de suites de requêtes.
Le contenu du pack CodeQL (les requêtes ou bibliothèques utilisées dans l’analyse CodeQL) est inclus dans le même répertoire que qlpack.yml ou ses sous-répertoires.
Le répertoire contenant le fichier qlpack.yml sert en tant que répertoire racine du contenu du pack CodeQL. Autrement dit, pour tous les .ql et .qlls fichiers du pack, CodeQL résout toutes les instructions d’importation relatives au répertoire contenant le fichier qlpack.yml depuis la racine du pack.
Voici un exemple de fichier qlpack.yml :
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: "*"
Pour plus d’informations sur la création et la publication de vos propres packs CodeQL, consultez « Publier et utiliser des packs CodeQL. » [1]