初探 CodeQL 自动化代码分析(二)
使用场景
之前介绍了如何使用命令行形式的coedql,也提到它的适用之处。
这篇就介绍一下如何在 Visual Studio Code 中使用 codeql 插件,对项目代码做自动化分析。
这也是大家分析代码时最常用的方法。
.
.
搭建环境与安装
和命令行工具一样,首先要下载codeql核心引擎,
https://github.com/github/codeql-cli-binaries/releases/tag/v2.7.3
然后再下载配合核心引擎的仓库
注意要把上面两个目录放至同级目录里
最后配置一下环境变量
export PATH=$PATH:/data/CodeQL/codeql_cli
简单搭建好之后,输入以下命令验证安装成功
codeql resolve languages
codeql resolve qlpacks
前面的步骤和上一篇完全一样,详情参考前文
.
.
漏洞靶场代码数据库构建
在网上找到一个适合用来练习codeql的靶场项目,注意到是一个Java Project
克隆到本地之后使用如下命令搭建数据库
在有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环境版本太高的话很可能会出错
最后构建数据库如下:
.
.
使用 Visual Studio code 插件进行分析
首先打开VScode,插件搜索CodeQL,然后install安装
随后配置好核心引擎的执行目录
即填codeql核心引擎安装的目录位置
安装好后,左上角选择FIle,打开我们的codeql仓库
之后点击侧方选项框中的codeql插件按钮
在Databases模块中选择Add a CodeQL database : From a folder
然后找到刚才生成的代码数据库,选择导入
导入成功:注意要有打勾符号,没有的话右边选择这个数据库,并使它作为当前数据库
Set Current Database
再次回到刚才的Exploer,选择并查看刚刚打开的codeql仓库目录
因为这个项目是Java构建的,代码数据库刚才也是生成Java格式的
所以查询语句的使用自然是要用Java的查询语句
可以看到 仓库中的java目录下有一个ql目录,这里存放的就是大量codeql官方给出的查询语句文件
在ql目录下继续看,定位到src文件夹的Security/CWE
点进去看可以发现,基本上所有的查询语句根据文件的名字就能知道是什么
比如CWE-074里的文件,JndiInjection.ql
字面上就是用来查询是否有JNDI注入查询语句
右键这个CWE-074目录,选择倒数第二个
执行结果如下:显示为没有jndi注入
使用CWE-089,sql注入模块来探测是否有漏洞
.
探测报告:
.
的确存在,这一结果也和靶场的漏洞符合(参考github的Readme.md)
之后就可以根据报告提供的位置,人工验证一下是否真实有注入。
毕竟codeql只是辅助,它的结果不一定就是准确的,而且使用的是官方给的查询语句,就很大可能会报错
有时候同一个数据库,同一个查询语句,最后执行的结果不一样也是存在的。
至于为什么会这样,我目前还没有太明白
后续文章会通过解析codeql查询语句原理尝试解决。
.
.
总结
codeql 的VScode插件可以非常方便地辅助研究者进行代码审计,它核心的点就在于查询语句的编写,
虽然官方提供了许多查询语句,但并不是每一个都适合,会出现误报等情况。
所以很有必要了解查询语句编写和codeql查询原理
在后面的文章我会试着探讨怎么写出合适到手项目的codeql查询文件
.
.
./