CodeQL如何分析闭源jar包

CodeQL分析jar包的一种思路和测试

Jar文件是java代码编译后产物,聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库。

如果CodeQL需要分析jar文件,可以通过反编译得到项目源码,后续再通过javac等编译命令生成CodeQL数据库。理论可行,实践开始。

脚本工具:https://github.com/ttonys/CodeQLAnalyseJar

反编译

反编译工具:

编译

编译工具:

数据库构建流程

jar包反编译再编译过程中,会存在报错,对codeql分析有一定影响,但实测依然可以检测漏洞。

经过本地测试,选定反编译工具为procyonjava-decompiler,编译工具选择ant

思路:

1、使用procyon反编译jar得到java文件,结果比较符合源码。

2、使用java-decompiler反编译jar得到lib文件,里面包含构建所需jar包

3、编写build.xml文件,使用ant进行编译,运行ant -f build.xml格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0"?>
<project name="fax" basedir="." default="build">
<property name="src.dir" value="src"/>
<property name="web.dir" value="BOOT-INF"/>
<property name="build.dir" value="${web.dir}/classes"/>
<property name="name" value="fax"/>
<property name="tomcat.home" value="/Users/sys71m/Downloads/apache-tomcat-10.0.23"/>

<path id="master-classpath">
<fileset dir="${web.dir}/lib">
<include name="*.jar"/>
</fileset>
<pathelement path="${build.dir}"/>
</path>

<target name="build" description="Compile source tree java files">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}"
source="1.8" target="1.8"
optimize="off"
debug="on" failonerror="false"
>
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>
</target>

<target name="clean" description="Clean output directories">
<delete>
<fileset dir="${build.dir}">
<include name="**/*.class"/>
</fileset>
<fileset dir="${tomcat.home}/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</delete>
</target>
</project>

其他

  • 在ant编译过程中,通过设置failonerror来确保及时部分文件报错也不会终止编译过程。
  • procyonjava-decompiler得到的java源码会有所不同,可以通过替换报错java文件的方式来使编译结果最优。

Reference

Author: Sys71m
Link: https://www.sys71m.top/2022/08/20/CodeQL如何分析闭源jar包/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.