
Finding Java/C# gadget chains with CodeQL
CodeQL로 Java/C# 가젯 체인(gadget chain) 찾기. 자세한 내용은 아티클에서 확인하세요.
저장소를 클론합니다.
$ 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 가젯 체인을 사용한 예시입니다:

위 쿼리를 실행하면 때때로 많은 오탐(false positive)이 반환될 수 있습니다. 이를 필터링하기 위해 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 매개변수 하나를 가진 공개 메서드를 호출할 수 있게 해줍니다.
이 블로그 게시물에서 자세한 정보를 확인하세요: 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