CodeQL 实用指南:从原理到漏洞检测全流程
一、简介
CodeQL 是一种基于语义的静态代码分析工具,用于自动化检测代码中的安全漏洞,核心原理是通过将代码转换为可查询的数据库,并基于自定义规则(QL 查询)进行模式匹配和数据流分析。
二、运行逻辑
简单理解就是 CodeQL 通过将源代码转换为其分析引擎可理解的数据库形式,然后应用预定义或自定义的查询规则,来检测代码中可能存在的漏洞,逻辑如下:
首先CodeQL读取源代码并使用 Extractor 模块进行解析,生成抽象语法树(AST)、控制流图(CFG)和数据流图(DFG)等结构。
然后,将这些结构存储在本地的 CodeQL 数据库中。
接着,用户根据需要选择自定义或官方的规则,编写或使用 QL 查询规则。
最后,在 CodeQL 数据库上执行这些查询,进行漏洞特征匹配或数据流分析,生成漏洞检测报告。
三、CodeQL 安装(本文使用 mac m4 设备)
1、安装 Xcode和Rosetta
M 芯片在安装 CodeQL 前需要安装 Xcode和Rosetta,终端上运行以下命令,
1 | softwareupdate –-install-rosetta |
2、下载 CodeQL 分析引擎和规则库
3、创建 CodeQL 文件夹
新建一个 CodeQL 文件夹,用来存放上面下载的分析引擎和规则库,文件夹(名字自定义)内容如下:
- codeql:存放 https://github.com/github/codeql-cli-binaries/releases codeql-osx64.zip 解压文件
- ql:存放 https://github.com/github/codeql 解压文件
- databases:空文件夹,存放后续 codeql 生成的数据库文件
4、配置 CodeQL 全局变量
编辑 ~/.zshrc 文件,指定 codeql 路径 CodeQL/codeql
1 | vim ~/.zshrc |
验证是否安装成功,输入 codeql
5、启动扫描
本地扫描
1)生成数据库,由于项目的不同,命令存在差异,命令不对或项目存在问题时容易出现报错,例如项目中没有 pom.xml 文件,使用了 command=”mvn -fn clean install –file pom.xml -Dmaven.test.skip=true” ,可直接使用以下命令,注意:在项目路径下执行命令可不指定源代码路径,非项目路径下执行需要添加–source-root
1 | codeql database create <数据库存放的路径及名称> --language=代码类型 |
2)漏洞扫描
- 使用 CodeQL 官方规则库,输出格式为 csv
1 | codeql database analyze /java-sec-code --format=csv --output=results.csv |
3、查看扫描结果,结果在项目源码处
自定义扫描规则命令
1 | codeql database analyze <数据库存放的路径及名称> <自定义规则.qls> --format=csv --output=results.csv |
vscode 扫描
1、插件市场搜索 codeql
安装完成后,点击设置 codeql 路径
3、打开项目源码文件夹
4、点击 QL 插件-》点击Form a folder -》选择生成的项目数据库-》点击 create one to get started 选择项目语言
替换 example.ql 规则即可针对生成的数据库进行扫描,并定位漏洞代码,以下使用官方的 xxe ql 规则,点击左侧边栏中的 example.ql 运行按钮进行扫描 ,最右侧为扫描结果
Github 扫描
点击action 后输入 codeql ,点击 configure 进行配置
然后点击 action 等待一段时间后可查看扫描结果
点击 Security 可查看扫描结果
点击可查看具体的漏洞位置
四、总结
本文基于 mac Codeql 的使用。






















