
اكتشاف سلاسل الـ gadget في Java/C# باستخدام CodeQL
العثور على سلاسل gadget بلغة Java/C# باستخدام CodeQL. مزيد من المعلومات في مقالنا
استنساخ المستودع
$ git clone https://github.com/synacktiv/QLinspector.git
البحث عن الأدوات (gadgets):
$ codeql database analyze log4j --format=sarif-latest --output=log4j.sarif --search-path=./QLinspector/ synacktiv/qlinspector-java-queries
QLinspector.qlاستعلام CodeQL الرئيسي الذي يمكن استخدامه للعثور على سلاسل gadget.
فيما يلي مثال على سلسلة gadget الخاصة بـ Aspectj:

قد يُرجع تشغيل الاستعلام أعلاه أحيانًا الكثير من النتائج الإيجابية الخاطئة. لتصفيتها، تمت إضافة الفئة GadgetSanitizer. يمكنك إضافة شروط لتصفية DataFlow::Node:
/**
* placeholder for adding sanitizing steps
*/
class GadgetSanitizer extends DataFlow::Node {
GadgetSanitizer() {
this.getEnclosingCallable().hasName("")
}
}
QLinspectorOld.qlاستعلام قديم تم تطويره في البداية. لا يستخدم هذا الاستعلام نموذج التلوث (taint model) الخاص بـ CodeQL، وبالتالي قد يُرجع نتائج مختلفة.
BeanFactoryGadgetFinder.qlاستعلام يمكن استخدامه للعثور على سلاسل gadget جديدة استنادًا إلى 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