本文章为CodeQL使用笔记第一篇,并带着大家一步步学习搭建好CodeQL的使用环境。该系列文章均为个人理解,如有错误之处,还望大家不吝赐教,感谢。好了,闲话少说,开始正题。
一、CodeQL简介
GitHub官方介绍(机翻):CodeQL 是开发人员用来自动执行安全检查的分析引擎,在 CodeQL中,代码被视为数据。安全漏洞、bug和其他错误被建模为可以针对从代码数据构建成的数据库执行的查询。我们可以运行由 研究人员和社区贡献者在GitHub 编写的标准 CodeQL 查询,或编写自己的代码以在自定义分析中使用,便于直接在源文件查找潜在 bug 。
可能大家用过很多其他的源代码漏洞扫描工具,其原理大部分为关键字匹配,有的比较好的商业版工具还有一些数据流跟踪的功能,但是总体来说,这都是一种静态扫描的方法,叫做静态应用程序安全测试(SAST)。而CodeQL与这种SAST的方法有点不同,它并不直接去抓取关键字,而是将代码当作类似HTML/XML文档结构数据源,来构建出一个关系型数据库,我们可以通过对该数据库的关联查询,来分析函数调用与数据流向。
简单来说,就是codeql是一个将代码转化成类似数据库的形式,并基于该database进行分析的引擎。在 CodeQL 中,代码被视为基础数据,并通过该基础数据进行建模分析后形成一个数据库,我们要去寻找漏洞或者bug时,只需像执行SQL查询语句一样即可。
CodeQL可以支持的分析语言和框架有:C/C++、C#、Go/aka Golang、Java、Kotlin、Ruby、Swift、JavaScript/ECMAScript/TypeScript(很遗憾,暂时不支持PHP,不过我们可以用RIPS这样的工具来扫描PHP的应用程序),其中除了JavaScript/ECMAScript、Python、Ruby这三种语言不需要编译器支持以外,其余语言需要进行构建数据库分析之前,必须要有对应的编译器(即对应的开发环境)。
利用CodeQL进行代码分析有三个步骤:
1、创建CodeQL 数据库
2、运行CodeQL 查询语句分析数据库
3、解析查询结果
二、CodeQL环境搭建
本文编写时,使用intel芯片的mac,如有使用m1/2芯片的mac,需要对应下载软件,以保持兼容性。
CodeQL可以在Linux、Windows、macOS上运行,本文以macOS为例进行环境搭建。
2.1 所需工具
vscode:查询编写工具,需要集成CodeQL插件。
2.2 codeql-cli环境变量配置
vscode直接下载安装就行。
下载codeql-cli与配置
根据不同的操作系统下载不同的zip包,mac系统下载codeql-osx64.zip。最好事先准备一个无中文路径的文件夹目录,将包放于其中并解压。例如下图
然后根据当前osx所使用的shell,进行配置。bash的话需要配置.bash_profile文件,zsh的话配置.zprofile文件。
这里需要在环境变量中配置一个CODEQL_HOME,路径等于codeql-cli解压的路径,最后CODEQL_HONE加入原有PATH中,然后使用export PATH即可。至于图中的其他配置,是我的Java开发环境以及maven的环境变量,这里后面再来说明。同时注意,这里使用code ~/.zprofile打开环境变量配置文件,并不是mac自带的命令,是我用将vscode加入了命令行并重命名为code,感兴趣可以自己搜索配置。
保存好后,接下来使用命令source ~/.zprofile使环境变量生效后,就可以运行codeql-cli,检查是否正确配置,codeql -v,没有错误的话应该如下图
2.3 vscode安装ql插件
vscode安装ql插件,直接在扩展商店搜索即可
安装完成后,需要点击红框中的齿轮按钮,进行配置codeql-cli到该插件,才能调用codeql-cli命令。
注意,配置时,不能只配置目录,需要配置codeql这个可执行文件的完整路径。实际上也可以不用配置该路径,因为我们将其加入了环境变量中,插件会自动去寻找codeql-cli可执行文件。
2.4 加载依赖库
从官方地址下载codeql-lib
将该zip包放到和codeql-cli同目录下,并解压并重命名为ql,然后用vscode打开该文件夹,并将它添加到工作区。
我们可以看到,加载好的ql库,有很多可以扫描的语言或框架
三、CodeQL初体验
加载好codeql-lib后看到的工程目录,就是已经写好了很多测试用例的,但是并不完全准确,有时候可能会漏报,因此我们也有必要去熟悉CodeQL的语法,来自己思考一些测试逻辑,并编写测试脚本。
下面我们先来体验用一下CodeQL。
之前提到过,利用CodeQL进行代码分析有三个步骤:
1、创建CodeQL 数据库
2、运行CodeQL 查询语句分析数据库
3、解析查询结果
3.1 创建CodeQL数据库
我们先到GitHub下载Java-sec-code这个java漏洞靶场,该靶场比较简单,但是对于我们理解常见java漏洞非常方便,同时由于漏洞利用过程中的调用链很简单,也便于我们初学codeql时熟悉codeql的查询语法。
靶场下载地址:https://github.com/JoyChou93/java-sec-code
将其解压后,进入该目录,并在终端执行命令:
codeql database create testJava -l=java,database create表示需要生成一个数据库,名字叫做testJava,这个名字可以随意给,-l=java表示要用于审计的项目是Java编写的,-l也可以写成--language。
不出意外的话,这里会出意外。大家应该还记得之前配置codeql-cli时,截图中的环境变量里,有一个maven和jdk环境变量吧。由于CodeQL只是一个引擎,它并不具备Java的编译环境,因此我们需要在自己机器中,配置好Java开发编译环境,以及maven环境,为什么需要maven?因为该漏洞靶场是用maven进行包管理的,怎么看出来的?在项目工程里,有一个pom.xml文件,这就是maven包管理的特征。
到这里如果无法继续执行下去,那么大家还需要去配置Java环境与maven环境,搜索mac配置jdk 1.8环境变量,mac配置maven环境变量即可,这里不再赘述。
好了,一切都没有问题之后,我们的数据库也就生成了,如下:
另外,如果对codeql-lib加载后,有出现黄色的原点,定位到文件是qlpack.xml的name那一行,那么就是缺少一些依赖。解决方法就是进入对应qlpack.xml文件所在的目录,终端打开,执行codeql pack install命令即可。
3.2 运行CodeQL 查询语句分析数据库&解析查询结果
在运行查询语句之前,我们还需要通过vscode的QL插件将其加载到vscode中。
选择vscode的QL插件,然后选中“From a folder”,加载上刚生成的那个testJava目录。
然后在vscode中,打开Java分析库中的sql注入查询例子,进行分析。
注意这个文件的查找路径,打开就行,然后右键选择CodeQL: Run Query on Selected Database。
完成之后,将会在右侧出现结果,这里是查到了两个sql注入问题。
到了这里,就算完成了数据库分析与解析查询结果了,接下来,我们需要观察代码,来验证一下,是否真的存在sql注入,是否误报。
3.3 验证判断
我们点击右侧的查询结果,就会自动跳转到对应文件的对应代码中。
这一处,直接使用了sql语句拼接,然后执行jdbc查询,同时对参数也没有发现过滤的函数调用,明显是属于sql注入。
再看第二处:
虽然这里使用的是PrepareStatment方式去执行sql,但是总体问题和第一处一样,也是存在sql注入的。
那么到这里,我们对CodeQL的初步使用就完成了,也确认了并没有误报,那么会不会存在漏报呢?
原文始发于微信公众号(和光同尘hugh):CodeQL使用笔记(一)--环境搭建
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论