
Finding Java/C# gadget chains with CodeQL
Finden von Java/C#-Gadget-Chains mit CodeQL. Weitere Informationen in unserem Artikel
Repository klonen
$ git clone https://github.com/synacktiv/QLinspector.git
Nach Gadgets suchen:
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlDie Haupt-CodeQL-Query, mit der Gadget-Chains gefunden werden können.
Hier ist ein Beispiel mit der Aspectj-Gadget-Chain:

Die Ausführung der obigen Query kann manchmal viele False Positives zurückgeben. Um diese herauszufiltern, wurde die Klasse GadgetSanitizer hinzugefügt. Sie können Bedingungen hinzufügen, um DataFlow::Node herauszufiltern:
/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.qlAlte Query, die ursprünglich entwickelt wurde. Diese Query verwendet das Taint-Modell von CodeQL nicht und kann daher andere Ergebnisse liefern.
BeanFactoryGadgetFinder.qlEine Query, mit der neue Gadget-Chains auf Basis von org.apache.naming.factory.BeanFactory gefunden werden können. Die Klasse BeanFactory ermöglicht es, eine Instanz einer beliebigen Klasse mit Standardkonstruktor zu erstellen und jede öffentliche Methode mit einem String-Parameter aufzurufen.
Weitere Informationen in diesem Blogpost: https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlEine Query, mit der Alternativen zur Methode getOutputProperties gefunden werden können, die in der CommonsBeanutils-Chain verwendet wird.
Weitere Informationen hier:
ObjectFactoryFinder.qlEine Query, mit der Alternativen zu org.apache.naming.factory.BeanFactory gefunden werden können. Dies könnte bei der JNDI-Exploitation nützlich sein.
Weitere Informationen in diesem Blogpost: https://www.veracode.com/blog/research/exploiting-jndi-injections-java