
Trouver des chaînes de gadgets Java/C# avec CodeQL
Trouver des chaînes de gadgets Java/C# avec CodeQL. Plus d'informations dans notre article
Clonez le dépôt
$ git clone https://github.com/synacktiv/QLinspector.git
Recherchez des gadgets :
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlLa requête CodeQL principale qui peut être utilisée pour trouver des chaînes de gadgets.
Voici un exemple avec la chaîne de gadgets AspectJ :

L'exécution de la requête ci-dessus peut parfois renvoyer beaucoup de faux positifs. Pour les filtrer, la classe GadgetSanitizer a été ajoutée. Vous pouvez ajouter des conditions pour filtrer les DataFlow::Node :
/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.qlAncienne requête développée initialement. Cette requête n'utilise pas le modèle de taint de CodeQL et peut donc renvoyer des résultats différents.
BeanFactoryGadgetFinder.qlUne requête qui peut être utilisée pour trouver de nouvelles chaînes de gadgets basées sur org.apache.naming.factory.BeanFactory. La classe BeanFactory permet de créer une instance d'une classe arbitraire avec un constructeur par défaut et d'appeler toute méthode publique avec un paramètre String.
Plus d'informations dans cet article de blog : https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlUne requête qui peut être utilisée pour trouver des alternatives à la méthode getOutputProperties utilisée dans la chaîne CommonsBeanutils.
Plus d'informations ici :
ObjectFactoryFinder.qlUne requête qui peut être utilisée pour trouver des alternatives à org.apache.naming.factory.BeanFactory. Cela peut être utile lors de l'exploitation de JNDI.
Plus d'informations dans cet article de blog : https://www.veracode.com/blog/research/exploiting-jndi-injections-java