CodeQL Usage Tricks

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

本文介绍CodeQL使用技巧,包括分析数据库构建日志以获取构建信息,利用CodeQL Action批量生成查询文件,使用codeql-debug工具调试源码定位漏洞,以及结合Maven实现SCA组件安全分析。同时分享批量查询和结果导出的实用命令。

🔎

延伸解读

从构建日志中挖掘CodeQL内部机制

通过分析build-tracer.log,可以观察到CodeQL使用Java agent技术,将codeql-java-agent.jar注入到构建JVM中,并拦截带有隐藏参数的JVM创建。这揭示了CodeQL在构建数据库时的底层行为,有助于理解其工作原理,但文章作者也坦言尚未完全解析jar内部代码,读者可自行深入研究。

利用GitHub Action获取内置查询套件

CodeQL Action在执行查询时会生成一个名为java-queries-builtin.qls的临时文件,该文件在官方仓库中并不存在。通过在上传工件步骤中指定该文件路径,可以轻松获取此查询套件,从而了解官方默认查询的组成,并替换路径后在本地复用,实现批量查询。

codeql-debug工具辅助人工审计

当CodeQL查询未发现漏洞时,codeql-debug项目可帮助定位数据库中的所有source和sink点,便于人工分析。由于CodeQL库更新,原项目部分规则失效,作者提供了修复后的版本,并说明了本地配置方法(修改数据库路径和CodeQL可执行文件路径),以及集成到GitHub Action的步骤。

CodeQL与SCA结合进行组件安全分析

通过编写QL查询统计Java项目中依赖第三方组件的引用次数,可以评估组件使用情况,辅助软件成分分析(SCA)。文章给出了具体查询代码和运行命令,最终生成dependencies.bqrs文件,再通过bqrs decode命令输出结果,为安全审计提供数据支持。

Q&A

如何从CodeQL的build-tracer.log中获取构建信息?

通过查看build-tracer.log文件,可以发现CodeQL在构建过程中加载了Java agent(codeql-java-agent.jar),并传递了额外的JVM参数,如-javaagent和-Xbootclasspath/a。这些信息有助于了解CodeQL的构建机制。

使用CodeQL Action分析Java应用时遇到javafx导致数据库创建失败怎么办?

在GitHub Actions的配置文件中,在开始阶段设置环境变量,添加javafx支持,然后重新运行分析即可。

如何获取CodeQL Action中生成的java-queries-builtin.qls文件?

在codeql.yml中添加一个上传构建产物的步骤,将/home/runner/work/_temp/codeql_databases/java-queries-builtin.qls文件上传为artifact,然后在Action执行完成后从Summary中下载。

如何使用codeql-debug工具进行源码漏洞定位?

使用codeql-debug工具可以找到数据库中的所有source和sink点,当使用QL查询未发现漏洞时,可以人工检查这些点。需要修改process.py文件,设置数据库路径和codeql可执行文件路径,并指定dependencies.ql文件。

如何将CodeQL与Maven结合进行SCA组件安全分析?

编写一个QL查询,统计每个Jar包被项目源码依赖的次数,然后使用codeql database run-queries命令运行该查询,生成dependencies.bqrs文件,再通过codeql bqrs decode命令解码输出结果。

CodeQL批量查询时,除了将ql文件路径写入qls文件,还有什么方式?

可以在qls文件中写入ql文件所在的文件夹路径,CodeQL会自动递归搜索并执行该文件夹下的所有ql文件。

🏷️

标签

➡️

继续阅读