
Encontrando cadeias de gadgets Java/C# com CodeQL
Encontrando cadeias de gadgets Java/C# com CodeQL. Mais informações no nosso artigo
Clone o repositório
$ git clone https://github.com/synacktiv/QLinspector.git
Procure por gadgets:
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlA principal query CodeQL que pode ser usada para encontrar cadeias de gadgets.
aqui está um exemplo com a cadeia de gadgets Aspectj:

Executar a query acima às vezes pode retornar muitos falsos positivos. Para filtrá-los, a classe GadgetSanitizer foi adicionada. Você pode adicionar condições para filtrar DataFlow::Node:
/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.qlQuery antiga que foi inicialmente desenvolvida. Esta query não usa o modelo de taint do CodeQL, portanto pode retornar resultados diferentes.
BeanFactoryGadgetFinder.qlUma query que pode ser usada para encontrar novas cadeias de gadgets baseadas no org.apache.naming.factory.BeanFactory. A classe BeanFactory, permite criar uma instância de qualquer classe com um construtor padrão e chamar qualquer método público com um parâmetro String.
Mais informações neste blogpost: https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlUma query que pode ser usada para encontrar alternativas ao método getOutputProperties usado na cadeia CommonsBeanutils.
Mais informações aqui:
ObjectFactoryFinder.qlUma query que pode ser usada para encontrar alternativas ao org.apache.naming.factory.BeanFactory. Isso pode ser útil durante a exploração de JNDI.
Mais informações neste blogpost: https://www.veracode.com/blog/research/exploiting-jndi-injections-java