CodeQLでJava/C#ガジェットチェーンを探すツールです。 詳細はこちらの記事をご覧ください。
リポジトリをクローンします。
$ git clone https://github.com/synacktiv/QLinspector.git
ガジェットを検索します。
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlガジェットチェーンを見つけるために使用できるメインのCodeQLクエリです。
Aspectjガジェットチェーンを使用した例は次のとおりです。

上記のクエリを実行すると、多くの偽陽性が返されることがあります。それらをフィルタリングするために、GadgetSanitizerクラスが追加されています。DataFlow::Nodeを除外する条件を追加できます。
/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.ql当初開発された古いクエリです。このクエリはCodeQLの汚染(taint)モデルを使用しないため、異なる結果を返す可能性があります。
BeanFactoryGadgetFinder.qlorg.apache.naming.factory.BeanFactoryに基づいた新しいガジェットチェーンを見つけるために使用できるクエリです。BeanFactoryクラスは、デフォルトコンストラクタで任意のクラスのインスタンスを作成し、Stringパラメータを1つ持つ任意のパブリックメソッドを呼び出すことを可能にします。
詳細はこちらのブログ記事を参照してください: https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlCommonsBeanutilsチェーンで使用されるgetOutputPropertiesメソッドの代替を見つけるために使用できるクエリです。
詳細はこちら:
ObjectFactoryFinder.qlorg.apache.naming.factory.BeanFactoryの代替を見つけるために使用できるクエリです。JNDIエクスプロイトの際に役立つ可能性があります。
詳細はこちらのブログ記事を参照してください: https://www.veracode.com/blog/research/exploiting-jndi-injections-java