初探 CodeQL 自动化代码分析(二)

使用场景

之前介绍了如何使用命令行形式的coedql,也提到它的适用之处。

这篇就介绍一下如何在 Visual Studio Code 中使用 codeql 插件,对项目代码做自动化分析。

这也是大家分析代码时最常用的方法。

.

.

搭建环境与安装

和命令行工具一样,首先要下载codeql核心引擎,

https://github.com/github/codeql-cli-binaries/releases/tag/v2.7.3

然后再下载配合核心引擎的仓库

https://github.com/github/codeql.git

注意要把上面两个目录放至同级目录里

最后配置一下环境变量

export PATH=$PATH:/data/CodeQL/codeql_cli

简单搭建好之后,输入以下命令验证安装成功

codeql resolve languages

codeql resolve qlpacks

image-20220518104448962

前面的步骤和上一篇完全一样,详情参考前文

.

.

漏洞靶场代码数据库构建

在网上找到一个适合用来练习codeql的靶场项目,注意到是一个Java Project

https://github.com/l4yn3/micro_service_seclab.git

克隆到本地之后使用如下命令搭建数据库

在有pom.xml的目录下:

codeql database create ./seclab-database –language=”java” –command=”mvn clean install –file pom.xml”

3.

踩坑记录:

如果显示fail [‘mvn’,’clean’,’install’],则去掉–command这个参数,使用codeql内置的编译打包器进行编译打包

如果还是不行,则尝试使用项目中自带的maven,自己下载的maven环境版本太高的话很可能会出错

最后构建数据库如下:

image-20220518104530227

.

.

使用 Visual Studio code 插件进行分析

首先打开VScode,插件搜索CodeQL,然后install安装

随后配置好核心引擎的执行目录

即填codeql核心引擎安装的目录位置

image-20220518104742075

image-20220518104802168

image-20220518104844352

安装好后,左上角选择FIle,打开我们的codeql仓库

image-20220518104925249

之后点击侧方选项框中的codeql插件按钮

在Databases模块中选择Add a CodeQL database : From a folder

然后找到刚才生成的代码数据库,选择导入

image-20220518104958630

导入成功:注意要有打勾符号,没有的话右边选择这个数据库,并使它作为当前数据库

Set Current Database

image-20220518105023345

再次回到刚才的Exploer,选择并查看刚刚打开的codeql仓库目录

因为这个项目是Java构建的,代码数据库刚才也是生成Java格式的

所以查询语句的使用自然是要用Java的查询语句

可以看到 仓库中的java目录下有一个ql目录,这里存放的就是大量codeql官方给出的查询语句文件

image-20220518105057021

在ql目录下继续看,定位到src文件夹的Security/CWE

点进去看可以发现,基本上所有的查询语句根据文件的名字就能知道是什么

比如CWE-074里的文件,JndiInjection.ql

字面上就是用来查询是否有JNDI注入查询语句

右键这个CWE-074目录,选择倒数第二个

image-20220518105259290

执行结果如下:显示为没有jndi注入

image-20220518105331205

使用CWE-089,sql注入模块来探测是否有漏洞

image-20220518105612591

.

探测报告:

image-20220518105816233

.

的确存在,这一结果也和靶场的漏洞符合(参考github的Readme.md)

image-20220518105859893

之后就可以根据报告提供的位置,人工验证一下是否真实有注入。

毕竟codeql只是辅助,它的结果不一定就是准确的,而且使用的是官方给的查询语句,就很大可能会报错

有时候同一个数据库,同一个查询语句,最后执行的结果不一样也是存在的。

至于为什么会这样,我目前还没有太明白

后续文章会通过解析codeql查询语句原理尝试解决。

.

.

总结

codeql 的VScode插件可以非常方便地辅助研究者进行代码审计,它核心的点就在于查询语句的编写,

虽然官方提供了许多查询语句,但并不是每一个都适合,会出现误报等情况。

所以很有必要了解查询语句编写和codeql查询原理

在后面的文章我会试着探讨怎么写出合适到手项目的codeql查询文件

.

.

./