CodeQL使用流程

[toc]

# 前言

好久没用 CodeQL 了,看了自己之前写的文章发现竟然没有做过相关记录
然后就不知道怎么用了 hhh

# 使用流程

# 0x1 生成数据库

我们拿到一套源码,首先需要使用 CodeQL 生成数据库

执行命令:
codeql database create <database> --language=<language-identifier>
参数说明:
<database> :创建数据库的路径,目录会在执行命令的时候被创建
--language : 指定数据库语言,输入标识符。当和–db-cluster 一起使用时,可以指定多个,用’,' 分隔,也可以进行多次指定。
--db-cluster :为多种语言创建数据库
--command :创建一个或多个编译语言数据库的时候使用。python 和 JavaScript/TypeScript 不需要该参数,如果编译语言不带该参数,codeql 会自动检测并编译
--no-run-unnecessary-builds :为多语言创建数据库,且包括编译和非编译语言时,可以利用 --no-run-unnecessary-builds 来帮助非编译语言跳过 command 选项
更多参数说明
CodeQL 支持以下语言

语言 标识符
C/C++ cpp
C# csharp
GO go
Java java
JavaScript/TypeScript javascript
Python python
Ruby ruby

案例:

1
codeql database create xxx-database  --language="java"  --command="mvn clean install --file pom.xml" --source-root=文件目录

962dcc2d739aeddc138604f43eabb6e8.png
成功之后
0ce711b4c117dfc66b296a08b6c7b929.png
然后在当前目录下会生成一个名为 “xxx-database” 的文件夹

# 0x2 导入 codeql 规则

这里使用‘starter workspace’,也就是 git 仓库

  1. 下载 starter
    git clone --recursive https://github.com/github/vscode-codeql-starter/
    或者
    git clone https://github.com/github/vscode-codeql-starter/
    项目下载完成后,进入项目目录
    git submodule update --init
    git submodule update --remote
    确保包含需要的子模块
    截图使用的是第一种方法
    479934456f6c44228c2f3e8057ac0e86.png
    子模块需要定期更新
    ef88b51020a9d4ed8fdb5bda8029fc94.png

  2. 在 VS Code 中打开 starter workspace
    84a6738a5e83ddeb45752d064e986647.png
    4e682ce5e87fbc0dd1897081928067fd.png

注意:
starter 子模块中包括 C/C++, C#, Java, JavaScript, Python, Ruby 以及 GO 的规则,在 vscode-codeql-starter\ql 下
CodeQL 暂时无法扫描 php 代码

# 0x3 导入数据库

我们生成的数据库为文件夹,那我们就选择 “From a folder”
f34afaeeb873e92b778012073f19323d.png

# 0x4 运行规则

点开项目文件,我们可以看见 ql 下有很多规则
b21766327a9941eca1f56dd455c1ec10.png
因为示例源码为 java 语言,我们选择 java 下的规则文件夹
右键选择 "CodeQL:RunQueries in Selected Files"
里面有 81 个 CWE 规则
bce12ed22e130d749eeae5b4d9caffcf.png

# 0x5 查看结果

点击左侧的一条规则,可以看到对应规则运行的结果在右侧
ccbdb52e0810eda9b4d99e3ac19c4e0d.png