
Un atelier CodeQL couvrant CVE-2021-21380
Dans cet atelier, nous utiliserons le raisonnement syntaxique et sémantique pour trouver une injection SQL dans le composant d'évaluation de la plateforme XWiki, documentée par la CVE-2021-21380
Veuillez compléter cette section avant l'atelier, si possible.
Installez Visual Studio Code.
Installez l'extension CodeQL pour Visual Studio Code.
Vous n'avez pas besoin d'installer la CLI CodeQL : l'extension s'en chargera pour vous.
Clonez ce dépôt :
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip dans la vue Explorateur et sélectionnez la commande CodeQL: Set Current Database.Cmd/Ctrl+Shift+P), recherchez et exécutez la commande CodeQL: Install Pack Dependencies.github dans la boîte pour filtrer la liste.cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions et cve-2021-21380-solutions-tests.L'atelier est divisé en plusieurs exercices présentant le support du langage QL pour Java et se termine par une requête finale pour trouver l'injection SQL connue. Dans ces exercices, vous apprendrez :
Dans cet atelier, nous rechercherons des vulnérabilités d'injection SQL connues dans le composant API d'évaluation de la plateforme XWiki. De telles vulnérabilités peuvent se produire dans les applications lorsque des informations contrôlées par un utilisateur externe parviennent à un code d'application qui construit et exécute de manière non sécurisée une requête SQL.
L'injection SQL connue discutée dans cet atelier est examinée dans GHSA-79rg-7mv3-jrr5 dans la Base de données d'avis GitHub. Pour trouver l'injection SQL, et les variantes possibles, nous allons résoudre les sous-problèmes suivants :
Dans les premiers exercices, nous raisonnerons sur les informations syntaxiques, en utilisant l'arbre de syntaxe abstraite (AST), pour identifier :
Trouvez toutes les méthodes portant le nom getAverageRating et leur type déclarant dans le programme en complétant la requête exercise1.ql
java fournit une classe Method pour raisonner sur les méthodes d'un programme.Method fournit les prédicats membres getName et hasName pour raisonner sur le nom d'une méthode.Method fournit le membre getDeclaringType pour raisonner sur le type qui déclare la méthode.Une solution se trouve dans la requête exercise1.ql
Une solution à l'exercice 1 renvoie une liste de méthodes. Certaines sont définies dans une interface appelée RatingsManager et d'autres dans les classes AbstractRatingsManager et RatingsScriptService.
À partir des informations renvoyées par la requête et de la documentation des composants XWiki, nous pouvons déduire que :
Role, et d'une implémentation annotée avec Component.ScriptService est rendu accessible aux pages wiki via les scripts.Trouvez toutes les classes annotées avec l'annotation Component en complétant la requête exercise2.ql.
Notez que le nom complet du type de l'annotation est org.xwiki.component.annotation.Component.
this dans le prédicat caractéristique.Class fournit une méthode getAnAnnotation pour obtenir les annotations associées.Annotation fournit le prédicat membre getType pour raisonner sur son type.Type fournit les prédicats membres getName et hasName pour raisonner sur le nom d'un type.RefType, représentant les classes et interfaces, fournit les prédicats membres getQualifiedName et hasQualifiedName pour raisonner sur le nom complet du type de référence.Une solution se trouve dans la requête exercise2.ql