
Encontrando cadenas de gadgets de Java/C# con CodeQL
Encontrando cadenas gadget de Java/C# con CodeQL. Más información en nuestro artículo
Clona el repositorio
$ git clone https://github.com/synacktiv/QLinspector.git
Buscar gadgets:
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlLa consulta principal de CodeQL que se puede usar para encontrar cadenas gadget.
Aquí hay un ejemplo con la cadena gadget Aspectj:

Ejecutar la consulta anterior a veces puede devolver muchos falsos positivos. Para filtrarlos, se ha añadido la clase GadgetSanitizer. Puedes añadir condiciones para filtrar :
DataFlow::Node/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.qlConsulta antigua que se desarrolló inicialmente. Esta consulta no utiliza el modelo de taint de CodeQL, por lo que podría devolver resultados diferentes.
BeanFactoryGadgetFinder.qlUna consulta que se puede utilizar para encontrar nuevas cadenas gadget basadas en org.apache.naming.factory.BeanFactory. La clase BeanFactory permite crear una instancia de una clase arbitraria con un constructor por defecto y llamar a cualquier método público con un parámetro String.
Más información en esta entrada de blog: https://www.veracode.com/blog/research/exploiting-jndi-injections-java
CommonsBeanutilsGadgetFinder.qlUna consulta que se puede utilizar para encontrar alternativas al método getOutputProperties utilizado en la cadena CommonsBeanutils.
Más información aquí:
ObjectFactoryFinder.qlUna consulta que se puede utilizar para encontrar alternativas a org.apache.naming.factory.BeanFactory. Esto podría ser útil durante la explotación de JNDI.
Más información en esta entrada de blog: https://www.veracode.com/blog/research/exploiting-jndi-injections-java