关于CodeQL可以看科普文Github安全实验室:开源代码分析引擎codeql,设漏洞奖励计划。
官方文档给出了CodeQL支持的编程语言及框架。
https://codeql.github.com/docs/codeql-overview/supported-languages-and-frameworks/
本文涉及的相关官方文档:
https://codeql.github.com/docs/codeql-cli/about-ql-packs/
https://codeql.github.com/docs/codeql-cli/getting-started-with-the-codeql-cli/
一、背景描述
写给jiayuan师傅的CodeQL手摸手教程。
二、环境准备
以Java为例,Java是编译型语言,所以你需要事先安装好项目编译所需的全部环境,例如:JDK、Maven。
1、CodeQL CLI
CodeQL CLI用来创建和分析数据库。
1.1 下载CodeQL压缩包:
https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip
1.2 将CodeQL CLI的可执行文件添加到环境变量,方便灵活调用
2、CodeQL 标准库
包含了必须的一些标准库(内置库)和一些查询样例。
CodeQL的标准库不像其他编程语言一样会与解释器同时安装,而是需要我们手动下载。
https://github.com/github/codeql
注意:CodeQL解释器会按照某个规则(我记得没错的话,应该是会查找CodeQL CLI所在目录的兄弟目录以及其子目录)寻找CodeQL标准库的位置,若是没有找到,则需要你手动将CodeQL标准库添加到VSCode的工作区中。
3、Visual Studio Code
下载VSCode,因为官方提供了VSCode编写CodeQL的插件
https://code.visualstudio.com/
4、Visual Studio Code CodeQL插件
Ctrl+Shift+X => 输入CodeQL => install
在CodeQL扩展中配置CodeQL CLI的路径,例如$HOME/codeql_home/codeql.exe
NOTE: 如果你想要中文显示VSCode的话,可以安装中文的插件
三、编写第一个查询
1、下载WebGoat
因为我本地的Java环境是1.8的,WebGoat在新版本中已经不支持Java 1.8,所以通过如下命令下载一个支持Java 1.8的旧版本的WebGoat
git clone --branch v8.0.0 https://github.com/WebGoat/WebGoat.git
2、创建CodeQL数据库
备注:需要已经安装Maven,因为WebGoat项目是基于Maven构建的,CodeQL在创建数据库时,会自动探测并使用对应的编译方式。
在WebGoat根目录下面执行如下命令,会自动编译并且为该项目创建一个名为webgoat-qldb的QL数据库。
codeql database create webgoat-qldb -l java
创建完该项目的数据库后,该项目的源码文件在后面几乎就用不到了(除非像更新QL数据库这种需求),CodeQL查询时主要使用的便是该项目的数据库文件。
3、创建你的第一个QL包
你需要创建一个文件夹,用来存放后续你编写的CodeQL脚本,CodeQL官方称这个文件夹为QL Pack。
例如名为example-query的文件夹,并在里面创建1个QL Pack的配置文件,名称固定为`qlpack.yml`;再创建一个ql后缀的文件,名称随意。
在VSCode中打开这个文件夹
4、编写QL包的配置文件
将如下信息填入qlpack.yml文件
name: example-query
version: 0.0.0
libraryPathDependencies: codeql-java
第一行表示这个QL包的名称为example-query,必选,如果你在VSCode中同时打开多个QL包时,要保证这个name的值唯一不重复;
第二行表示这个QL包的版本号,必选;
第三行表示这个QL包的依赖,必选,codeql-java表示需要Java语言的QL标准库依赖。
5、VSCode工作区增加CodeQL标准库
为了让CodeQL解释器能够访问标准库,我们需要将标准库所在文件夹也加入到加入工作区中。
VSCode - 文件 - 将文件夹加入工作区 - 选择在【环境准备 - CodeQL标准库】章节中存放CodeQL标准库的文件夹。
6、VSCode添加CodeQL数据库
在VSCode的CodeQL插件中添加之前用CodeQL创建的WebGoat的数据库。
选择webgoat-qldb那个文件夹。如下是添加成功后的页面。
7、编写第一个查询
在webgoat-queyr.ql文件中编写如下代码,用来查找WebGoat项目中所有声明的方法。
import java
from Method m
select m
然后右键点击【CodeQL: Run Query 】来执行本次查询,执行完成后在右边可以看到多出一列用来显示查询结果。
点击结果里面的任意条目,可以跳到对应的文件中。