CodeQL 进阶 & 项目分析 & 漏报解决 & Jar包分析
2026-01-24 20:24:57

CodeQL 进阶 & 项目分析 & 漏报解决 & Jar包分析

利用开源Java漏洞靶场 - https://github.com/whgojp/JavaSecLab/进行分析测试

使用JDK 8u442

建立分析数据库

1
codeql database create codeqltest --language=java --command="mvn clean install"

CodeQL CWE规则 - Common Weakness Enumeration - 是一套用于在源代码中自动检测安全漏洞的查询规则,如SQL注入,SSRFRCE等漏洞

CodeQL CWE规则存放于ql/src/Security/CWE目录下

SARIF文件 - 一种标准化的JSON格式,统一表示来自不同静态分析工具的漏洞报告,VSCode中的SARIF Viewer可兼容表示

利用CodeQL CWE规则进行静态分析

XXE漏洞为例,利用CodeQL自带的CWE规则检测源代码中可能存在的XXE漏洞并输出为SARIF文件,在VSCode中打开

1
codeql database analyze codeqltest codeql/java-queries:Security/CWE/CWE-611 --format=sarif-latest --output=XXE.sarif

可以看到可以根据结果定位到sourcesink

image

对整个项目的存在的所有漏洞进行检测,不指定CWE编号即可

1
codeql database analyze codeqltest --format=sarif-latest --output=vulCheck.sarif

漏报处理

漏报的危险程度 > 误报,CWE的规则不可能完全覆盖所有攻击面,所以要在原有基础上进行优化

RCE漏洞检测为例,CWE-078的漏洞规则会漏检通过反射调用实现RCE的场景

image

原因是没有将传给invoke函数方法的参数作为sink

构造查询语句

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
import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.dataflow.DataFlow


module SQLINJ_Source_To_sink_Config implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) {
source instanceof RemoteFlowSource
}

predicate isSink(DataFlow::Node sink) {
exists(Method method, MethodCall call, Parameter param |
// 1. 匹配 java.lang.reflect.Method.invoke 方法
method.hasName("invoke") and
method.getDeclaringType().hasQualifiedName("java.lang.reflect", "Method") and

// 2. 找到代码中的 Method.invoke() 调用点
call.getMethod() = method and

// 3. sink 节点是 invoke 调用的任意参数
sink.asExpr() = call.getArgument(_) and

// 4. 关键逻辑:检查该参数表达式中是否包含对方法参数的访问
// (递归检查所有子表达式,包括自身)
exists(Expr access |
access = param.getAnAccess() and // 获取方法参数的访问表达式
sink.asExpr().getAChildExpr*() = access // 检查是否在参数子树中
)
)
}
}

module SQLINJ_Source_To_sink = TaintTracking::Global<SQLINJ_Source_To_sink_Config>;

from DataFlow::Node source, DataFlow::Node sink
where SQLINJ_Source_To_sink::flow(source, sink)
select source, "-->", sink

image

以及在CWE规则的SQL注入检测中,默认的CWE规则是只检测JDBC场景下的SQL注入的,但是experimental测试模块下的CWE规则是可以检测MyBatis场景下的SQL注入的,所以不能无脑直接扫描

image

image

image

CodeQL 分析 Jar

上面CodeQL都是直接分析源代码,如何分析Jar也是一个问题

使用JavaSecLab项目测试

使用IDEA的插件Java Decompiler进行反编译,直接从插件目录把java-decompiler.jar拖出来用

插件要求JDK17,先用JDK17的环境反编译

1
java -jar /Users/gehansheng/Desktop/Java安全/java-decompiler.jar JavaSecLab.jar JavaSecLab-Decompiler/

image

反编译完成后,会在JavaSecLab-Decompiler/目录下生成一个jar包,将jar解压后发现解压后文件不是classes而是java文件

直接在JavaSecLab-Decompiler/构建CodeQL数据库

1
codeql database create codeqltestdec --language=java --overwrite --build-mode none

进行CodeQL查询,分析正常

image

上一页
2026-01-24 20:24:57
下一页