Explorer CodeQL dans GitHub
Qu’est-ce que CodeQL ?
CodeQL est un moteur d’analyse de code sémantique développé par GitHub qui traite le code comme des données. Au lieu de rechercher simplement des modèles de texte, CodeQL comprend la structure et la signification de votre code, ce qui permet une analyse sophistiquée de la sécurité et de la qualité.
Les outils d’analyse statique traditionnels produisent souvent des faux positifs, car ils utilisent une correspondance de modèle simple. L’approche sémantique de CodeQL comprend le contexte du code, les relations entre les éléments de code et le flux de données via des applications, ce qui entraîne une détection des vulnérabilités plus précise.
Caractéristiques clés de CodeQL
CodeQL traite le code comme une base de données :
- Représentation structurelle : Convertit le code source en base de données qui capture les arborescences de syntaxe, les graphiques de flux de contrôle et les chemins de flux de données.
- Format interrogeable : Rend le code interrogeable à l’aide d’un langage de requête spécialisé, similaire à l’interrogation d’une base de données traditionnelle.
- Approche indépendante du langage : Prend en charge plusieurs langages de programmation, notamment C/C++, C#, Java, JavaScript/TypeScript, Python, Ruby, Go et Swift.
- Couverture complète : Analyse non seulement les fichiers individuels, mais les bases de code entières avec toutes leurs interconnexions.
CodeQL permet une analyse de sécurité précise :
- Analyse de variantes : Une fois que vous avez identifié une vulnérabilité, vous pouvez écrire des requêtes pour rechercher des problèmes similaires dans l’ensemble de votre codebase.
- Analyse du flux de données : Suit la façon dont les données passent de votre application de sources (entrée utilisateur) aux récepteurs (opérations sensibles).
- Suivi de la contamination : Identifie quand les données non approuvées atteignent des opérations sensibles sans validation ou sanitisation appropriées.
- Analyse des flux de contrôle : Comprend les chemins d’exécution et la logique conditionnelle pour rechercher des vulnérabilités qui se produisent uniquement dans des conditions spécifiques.
Fonctionnement de CodeQL
L’analyse CodeQL implique trois phases distinctes qui transforment le code source en résultats de sécurité actionnables :
Phase 1 : Créer une base de données CodeQL
La première étape extrait une représentation structurée de votre code :
- Extraction de code : Analyse vos fichiers sources pendant la compilation ou par le biais d’une analyse statique.
- Création de base de données : Génère une base de données complète représentant la structure de votre code, notamment les arborescences de syntaxe abstraites, les graphiques de flux de contrôle et les dépendances de données.
- Capture de métadonnées : Enregistre les emplacements des fichiers, les numéros de ligne, les étendues variables, les appels de fonction et les hiérarchies de classes.
- Optimisation: Indexe la base de données pour une interrogation efficace, même sur de grandes bases de code.
Cette base de données devient la base de toutes les analyses suivantes. Il est créé une seule fois et peut être interrogé plusieurs fois, ce qui rend l’analyse de sécurité itérative efficace.
Phase 2 : Exécuter des requêtes CodeQL
Une fois la base de données existante, vous exécutez des requêtes pour rechercher des problèmes de sécurité :
- Packs de requêtes standard : GitHub fournit des ensembles de requêtes organisés pour les vulnérabilités courantes (normes OWASP Top 10, CWE).
- Requêtes personnalisées : Écrivez vos propres requêtes pour rechercher des modèles de sécurité spécifiques à l’organisation ou des violations de normes de codage.
- Exécution de requête : Le moteur CodeQL exécute des requêtes sur la base de données, recherchant des modèles de code qui correspondent aux signatures de vulnérabilité.
- Performance: Les requêtes s’exécutent rapidement, car elles fonctionnent sur la base de données indexée plutôt que sur les fichiers sources bruts.
Voici quelques exemples de catégories de requêtes :
- Vulnérabilités d’injection : Injection SQL, injection de commandes, script intersites.
- Problèmes d’authentification : Stratégies de mot de passe faibles, vérifications d’authentification manquantes, gestion des sessions non sécurisées.
- Problèmes de chiffrement : Algorithmes faibles, informations d’identification codées en dur, caractère aléatoire insuffisant.
- Gestion des ressources: Fuites de mémoire, épuisement des ressources, consommation de ressources non contrôlée.
Phase 3 : Interpréter les résultats
La phase finale présente les résultats dans des formats actionnables :
- Classement des résultats : CodeQL hiérarchise les résultats par gravité, niveau de confiance et exploitabilité.
- Informations contextuelles : Chaque recherche inclut des emplacements de fichier, des numéros de ligne, des extraits de code affectés et des chemins de flux de données.
- Conseils de correction : Les résultats incluent des explications sur la vulnérabilité et les recommandations pour les corriger.
- Intégration : Les résultats s'intègrent à l'onglet Sécurité de GitHub, aux annotations de pull request, et aux fichiers SARIF pour les outils externes.
Langage de requête CodeQL
Les requêtes CodeQL sont écrites dans un langage déclaratif spécifiquement conçu pour l’analyse du code :
Structure et syntaxe de requête
CodeQL utilise la programmation logique orientée objet :
- Classes et prédicats : Définissez ce que vous recherchez à l’aide de classes qui représentent des éléments de code (fonctions, variables, expressions).
- Approche déclarative : Décrivez ce que vous souhaitez trouver plutôt que comment le trouver.
- Filtrage: Utilisez des prédicats pour faire correspondre les modèles de code et les relations.
- Composabilité : Créez des requêtes complexes en combinant des prédicats plus simples.
Exemple de structure de requête :
import javascript
from SqlExecution sql, Source source
where source.flowsTo(sql.getAnArgument())
select sql, "SQL query vulnerable to injection from $@.", source, "user input"
Cette requête recherche les vulnérabilités d’injection SQL en procédant comme suit :
- Identification des points d’exécution SQL.
- Recherche de sources d’entrée utilisateur.
- Suivi du flux de données de l’entrée à l’exécution SQL.
- Signaler des vulnérabilités avec le contexte.
Bibliothèques de requêtes standard
GitHub fournit des bibliothèques de requêtes étendues :
- Requêtes de sécurité : Détectez les 10 principales vulnérabilités, catégories CWE et problèmes de sécurité spécifiques au langage OWASP.
- Requêtes de qualité du code : Recherchez des odeurs de code, des problèmes de maintenance, des problèmes de performances et des violations de bonnes pratiques.
- Contributions communautaires : Des milliers de requêtes fournies par des chercheurs en sécurité et des développeurs.
- Mises à jour régulières : GitHub Security Lab ajoute en permanence de nouvelles requêtes pour les vulnérabilités émergentes.
Vous pouvez utiliser ces requêtes as-is ou les personnaliser pour vos besoins spécifiques.
CodeQL dans la sécurité GitHub
CodeQL s’intègre profondément aux fonctionnalités de sécurité de GitHub :
Analyse du code avec CodeQL
Analyse automatisée de la sécurité :
- Configuration par défaut : Activez l’analyse CodeQL en un clic dans les paramètres du référentiel.
- Analyses planifiées : Analysez automatiquement chaque push, pull request ou selon un horaire.
- Prise en charge multilingue : Détecte automatiquement les langues dans votre référentiel et exécute les requêtes appropriées.
- Présentation des résultats : Les résultats de sécurité s’affichent sous l’onglet Sécurité avec des explications détaillées.
Intégration des pull requests :
- Annotations inline : Les résultats de sécurité apparaissent sous forme de commentaires directement dans les lignes de code vulnérables dans les pull requests.
- Vérifications bloquantes : Configurez CodeQL en tant que vérification requise qui doit être passée avant la fusion.
- Analyse différentielle : Signale uniquement les nouvelles vulnérabilités introduites par la requête de tirage, ce qui réduit le bruit.
- Commentaires des développeurs : Les développeurs voient les problèmes de sécurité immédiatement pendant que le code est nouveau dans leur esprit.
Sécurité avancée GitHub
Pour les organisations, GitHub Advanced Security fournit des fonctionnalités supplémentaires :
- Analyse du référentiel privé : Exécutez CodeQL sur des référentiels privés.
- Exécution de requête personnalisée : Chargez et exécutez des requêtes spécifiques à l’organisation.
- Vue d’ensemble de la sécurité : Tableau de bord montrant la posture de sécurité sur tous les référentiels.
- Gestion des alertes : Triage, affectation et suivi des résultats de sécurité entre les équipes.
Utilisation de CodeQL dans des pipelines CI/CD
CodeQL s’étend au-delà de GitHub pour s’intégrer à différents systèmes CI/CD :
Approches d’intégration
Intégration de 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
Ce workflow :
- Initialise CodeQL pour les langages spécifiés.
- Compile votre application (ou analyse sans compilation).
- Exécute des requêtes de sécurité.
- Charge les résultats dans l’onglet Sécurité GitHub.
Intégration d’Azure Pipelines :
CodeQL peut s’exécuter dans Azure Pipelines à l’aide de l’interface de ligne de commande :
- Installez l’interface CLI CodeQL : Téléchargez et installez le bundle CodeQL dans votre pipeline.
-
Créer une base de données : Exécutez
codeql database creatependant votre build. -
Analyser la base de données : Exécutez
codeql database analyzeavec les packs de requêtes sélectionnés. - Exporter les résultats : Générez des fichiers SARIF pour la visualisation dans Azure DevOps.
Autres systèmes CI/CD :
L’interface CLI CodeQL prend en charge n’importe quelle plateforme CI/CD :
- Jenkins: Exécutez l'analyse CodeQL comme étapes de construction.
- CI/CD GitLab : Exécutez CodeQL dans des pipelines GitLab avec une sortie SARIF.
- CircleCI : Intégrer des analyses CodeQL dans des flux de travail CircleCI.
- Systèmes personnalisés : Utilisez l’interface CLI CodeQL à partir de n’importe quel environnement capable d’exécuter des outils en ligne de commande.
Portes de sécurité
Utilisez les résultats CodeQL comme portes de qualité :
- Échecs de builds : Configurez les pipelines pour échouer lorsque CodeQL trouve des vulnérabilités d'une gravité élevée.
- Analyse des tendances : Suivez les métriques de sécurité au fil du temps pour mesurer l’amélioration.
- Exigences de conformité : Générez des preuves d’analyse de sécurité pour les audits et les certifications de conformité.
- Correction automatique : Déclenchez des workflows automatisés quand des vulnérabilités spécifiques sont détectées.
Outils de développement CodeQL
CodeQL fournit des outils pour créer et tester des requêtes :
Extension de Visual Studio Code
L’extension officielle CodeQL pour VS Code offre :
- Développement de requêtes : Écrivez et testez des requêtes CodeQL avec la mise en surbrillance de la syntaxe, la saisie semi-automatique et la documentation inline.
- Analyse de base de données locale : Exécutez des requêtes sur des bases de données créées à partir de bases de code locales.
- Visualisation des résultats : Consultez les résultats de la requête avec les chemins de navigation et de flux de données du code source.
- Prise en charge du débogage : Parcourez l’exécution des requêtes pour comprendre les résultats et optimiser les performances.
Interface de ligne de commande
L’interface CLI CodeQL active l’analyse scriptable :
-
Création de base de données :
codeql database createextrait le code dans un format interrogeable. -
Exécution de requête :
codeql database analyzeexécute des requêtes et génère des résultats. -
Requêtes de test :
codeql test runvalide les requêtes par rapport aux cas de test. - Gestion des packs : Téléchargez et gérez les packs de requêtes standard.
Avantages de CodeQL pour l’automatisation de la sécurité
L’intégration de CodeQL dans votre processus DevSecOps offre des avantages significatifs :
Productivité des développeurs
Détection anticipée :
- Sécurité décalée vers la gauche : Recherchez des vulnérabilités pendant la phase de développement plutôt qu'en production.
- Correction plus rapide : Corrigez les problèmes lorsque le code est nouveau et que les modifications sont petites.
- Opportunités d’apprentissage : Les développeurs apprennent des pratiques de codage sécurisées à partir de commentaires immédiats.
- Basculement de contexte réduit : Les résultats de sécurité apparaissent dans les outils de développement familiers.
Résultats précis :
- Faux positifs faibles : L’analyse sémantique produit des résultats plus précis que la mise en correspondance des modèles.
- Informations contextuelles : Les résultats incluent des chemins de flux de données montrant exactement la façon dont les vulnérabilités se produisent.
- Résultats hiérarchisés : Concentrez-vous sur des questions exploitables plutôt que sur des préoccupations théoriques.
- Découverte de variantes : Recherchez toutes les instances d’un modèle de vulnérabilité, pas seulement des exemples évidents.
Sécurité organisationnelle
Couverture complète :
- Base de code entière : Analysez tout le code, y compris les dépendances tierces et les composants hérités.
- Plusieurs langues : Analyse uniforme de la sécurité dans les applications polyglottes.
- Normes cohérentes : Appliquez les mêmes règles de sécurité dans tous les référentiels.
- Analyse historique : Analysez le code existant pour établir des bases de référence de sécurité.
Sécurité évolutive :
- Analyse automatisée : Aucune révision de sécurité manuelle n’est requise pour chaque validation.
- Surveillance continue : Les analyses régulières détectent les vulnérabilités nouvellement divulguées.
- Sécurité en tant que code : Codifier les exigences de sécurité en tant que requêtes stockées dans le contrôle de version.
- Partage des connaissances : Les bibliothèques de requêtes capturent les connaissances en matière de sécurité institutionnelle.
Gouvernance et conformité
Pistes d’audit :
- Historique de l’analyse : Enregistrement de toutes les analyses de sécurité avec horodatages et résultats.
- Cycle de vie de la recherche : Suivez les vulnérabilités depuis la détection jusqu'à la correction.
- Application de la stratégie : Démontrez que les scans de sécurité se produisent à chaque sortie.
- Génération de preuves : Produisez des rapports pour les auditeurs et les infrastructures de conformité.
Pour plus d’informations sur CodeQL, consultez La vue d’ensemble de CodeQL.
Pour obtenir les outils disponibles, consultez Outils CodeQL.