
Поиск цепочек гаджетов Java/C# с помощью CodeQL
Поиск Java/C# гаджет-цепочек с помощью CodeQL. Дополнительная информация в нашей статье
Клонируйте репозиторий:
$ 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Старый запрос, который был разработан изначально. Этот запрос не использует taint-модель CodeQL, поэтому он может возвращать другие результаты.
BeanFactoryGadgetFinder.qlЗапрос, который можно использовать для поиска новых гаджет-цепочек на основе org.apache.naming.factory.BeanFactory. Класс BeanFactory позволяет создать экземпляр произвольного класса с конструктором по умолчанию и вызывать любой публичный метод с одним параметром типа String.
Дополнительная информация в этом блог-посте: https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlЗапрос, который можно использовать для поиска альтернатив методу getOutputProperties, используемому в цепочке CommonsBeanutils.
Дополнительная информация здесь:
ObjectFactoryFinder.qlЗапрос, который можно использовать для поиска альтернатив org.apache.naming.factory.BeanFactory. Это может быть полезно при эксплуатации JNDI.
Дополнительная информация в этом блог-посте: https://www.veracode.com/blog/research/exploiting-jndi-injections-java