CodeQL 实用指南:从原理到漏洞检测全流程

一、简介

CodeQL 是一种基于语义的静态代码分析工具,用于自动化检测代码中的安全漏洞,核心原理是通过将代码转换为可查询的数据库,并基于自定义规则(QL 查询)进行模式匹配和数据流分析

二、运行逻辑

简单理解就是 CodeQL 通过将源代码转换为其分析引擎可理解的数据库形式,然后应用预定义或自定义的查询规则,来检测代码中可能存在的漏洞,逻辑如下:

  • 首先CodeQL读取源代码并使用 Extractor 模块进行解析,生成抽象语法树(AST)、控制流图(CFG)和数据流图(DFG)等结构。

  • 然后,将这些结构存储在本地的 CodeQL 数据库中。

  • 接着,用户根据需要选择自定义或官方的规则,编写或使用 QL 查询规则。

  • 最后,在 CodeQL 数据库上执行这些查询,进行漏洞特征匹配或数据流分析,生成漏洞检测报告。

image-20250209140153064

三、CodeQL 安装(本文使用 mac m4 设备)

1、安装 Xcode和Rosetta

M 芯片在安装 CodeQL 前需要安装 Xcode和Rosetta,终端上运行以下命令,

1
softwareupdate –-install-rosetta

image-20250209143911600

2、下载 CodeQL 分析引擎和规则库

3、创建 CodeQL 文件夹

新建一个 CodeQL 文件夹,用来存放上面下载的分析引擎和规则库,文件夹(名字自定义)内容如下:

image-20250209142022722

4、配置 CodeQL 全局变量

编辑 ~/.zshrc 文件,指定 codeql 路径 CodeQL/codeql

1
2
3
4
vim ~/.zshrc
export PATH="/Users/用户名/Files/CodeQL/codeql:$PATH"

source ~/.zshrc

验证是否安装成功,输入 codeql

image-20250209143958898

5、启动扫描

本地扫描

1)生成数据库,由于项目的不同,命令存在差异,命令不对或项目存在问题时容易出现报错,例如项目中没有 pom.xml 文件,使用了 command=”mvn -fn clean install –file pom.xml -Dmaven.test.skip=true” ,可直接使用以下命令,注意:在项目路径下执行命令可不指定源代码路径,非项目路径下执行需要添加–source-root

1
2
codeql database create <数据库存放的路径及名称> --language=代码类型
codeql database create <数据库存放的路径及名称> --language=代码类型 --source-root=<源代码位置>

image-20250209152717681

2)漏洞扫描

  • 使用 CodeQL 官方规则库,输出格式为 csv
1
codeql database analyze /java-sec-code --format=csv --output=results.csv

image-20250209153216747

3、查看扫描结果,结果在项目源码处

image-20250209153956718

自定义扫描规则命令

1
codeql database analyze <数据库存放的路径及名称> <自定义规则.qls> --format=csv --output=results.csv

vscode 扫描

1、插件市场搜索 codeql

image-20250208162914471

安装完成后,点击设置 codeql 路径

image-20250208164319712

3、打开项目源码文件夹

image-20250209161126120

4、点击 QL 插件-》点击Form a folder -》选择生成的项目数据库-》点击 create one to get started 选择项目语言

image-20250209161444949

image-20250209161534302

替换 example.ql 规则即可针对生成的数据库进行扫描,并定位漏洞代码,以下使用官方的 xxe ql 规则,点击左侧边栏中的 example.ql 运行按钮进行扫描 ,最右侧为扫描结果

image-20250209160034994

Github 扫描

image-20250209203905290

image-20250209204000830

点击action 后输入 codeql ,点击 configure 进行配置

image-20250209204126841

image-20250209204348252

image-20250209204419849

然后点击 action 等待一段时间后可查看扫描结果

image-20250209204740874

image-20250209204806635

点击 Security 可查看扫描结果

点击可查看具体的漏洞位置

image-20250209205955184

四、总结

本文基于 mac Codeql 的使用。