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注入,SSRF,RCE等漏洞
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 |
可以看到可以根据结果定位到source和sink点

对整个项目的存在的所有漏洞进行检测,不指定CWE编号即可
1 | codeql database analyze codeqltest --format=sarif-latest --output=vulCheck.sarif |
漏报处理
漏报的危险程度 > 误报,CWE的规则不可能完全覆盖所有攻击面,所以要在原有基础上进行优化
以RCE漏洞检测为例,CWE-078的漏洞规则会漏检通过反射调用实现RCE的场景

原因是没有将传给invoke函数方法的参数作为sink点
构造查询语句
1 | import java |

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



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/ |

反编译完成后,会在JavaSecLab-Decompiler/目录下生成一个jar包,将jar解压后发现解压后文件不是classes而是java文件
直接在JavaSecLab-Decompiler/构建CodeQL数据库
1 | codeql database create codeqltestdec --language=java --overwrite --build-mode none |
进行CodeQL查询,分析正常
