CodeQl初学
做代码审计过程中也用过很多代码扫描工具,也分析过其扫描的原理。最近网上看到很多大佬在学习GitHub之前公布的一个新开源工具codeql,瞬间有了学习的兴趣,跟着大佬们的路线自己也跟着学习一下。通过参考大佬们的一些文章,自己也亲自实践下。
一丶QL&&CodeQL
QL是⼀种声明性的,⾯向对象的查询语⾔,经过优化可实现对分层数据结构的⾼效分析。支持对C++,C#,Java,JavaScript,Python,go等多种语言进行分析,可用于分析代码,查找代码中控制流等信息。
CodeQL 是一个语义代码分析引擎,它可以扫描发现代码库中的漏洞。使用 CodeQL,可以像对待数据一样查询代码。用户可以使用 ql 语言编写自定义规则识别软件中的漏洞,也可以使用ql自带的规则进行扫描。
Git链接:https://securitylab.github.com/tools/codeql/
TryCodeQL on LGTM.com:https://lgtm.com/query/rule:1823453799/lang:java/
CodeQL语句是这样的:
接下来我将开始在本地搭建环境,一起来体验CodeQL:
二、本地环境搭建
1.安装VsCode
下载地址:https://code.visualstudio.com/Download
2.下载CodeQL分析程序
下载地址:https://github.com/github/codeql-cli-binaries/releases/download/v2.7.3/codeql-win64.zip
3.下载相关的库文件
CodeQL仓库包含分析C/C++, C#, Java, JavaScript、python等所需的查询和库文件。
下载地址:https://github.com/github/codeql
4.下载最新版的VScode,安装CodeQL扩展程序:
**注意:**CodeQL 扩展至少需要 Visual Studio Code 1.39,不支持旧版本。
地址:https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql
填写下载的分析程序的路径,其他默认
将$HOME/codeql-home/codeql目录添加到环境变量
也可以使用如下方法离线安装 CodeQL 扩展:
-
下载CodeQL VSIX 文件。然后,在“扩展”视图中,单击“更多操作” >“从 VSIX 安装”,然后选择 CodeQL VSIX 文件。
链接:https://github.com/github/vscode-codeql/releases/download/v1.5.9/vscode-codeql-v1.5.9.vsix
为 CodeQL 更新现有工作区
可以通过直接创建 CodeQL 存储库的本地克隆将 CodeQL 库添加到现有工作区:https : //github.com/github/codeql。
要使标准库在您的工作区中可用:
1、选择File > Add Folder to Workspace,然后选择github/codeql存储库的本地检出。
2、使用“新建文件夹”或“将文件夹添加到工作区”选项为每种目标语言创建一个新文件夹,以保存自定义查询和库。
3、qlpack.yml在每个目标语言文件夹中创建一个文件。这会告诉 CodeQL CLI 该文件夹的目标语言及其依赖项。(的main分支github/codeql已经有这些文件。)CodeQL 将在所有打开的工作区文件夹中或在用户的搜索路径中查找依赖项。
例如,要创建一个名为my-custom-cpp-pack依赖于 C++ 的 CodeQL 标准库的自定义 CodeQL 文件夹,请创建一个qlpack.yml包含以下内容的文件:
name: my-custom-cpp-pack
version: 0.0.0
libraryPathDependencies: codeql/cpp-all
5.创建Codeql数据库
命令:
codeql database create <database> --language=<language-identifier>
参数说明:
:创建的数据库的路径,必须是不存在的文件夹
–language:如下
C/C++ | cpp |
---|---|
C# | csharp |
Go | go |
Java | java |
JavaScript/TypeScript | javascript |
Python | python |
其它参数:
–source-root 指定数据库创建时的源文件根目录,默认为当前目录。
–command 指定语言的编译命令,不要给python和JavaScript指定该命令。
非编译型语言创建数据库
codeql database create --language=javascript --source-root <folder-to-extract> <output-folder>/javascript-database
6、创建QL包,编写CodeQl脚本
创建 CodeQL 数据库后,将对其执行一个或多个查询。CodeQL 查询是用一种专门设计的面向对象的查询语言编写的,称为 QL。
7、执行查询
最后一步将查询执行期间产生的结果转换为在源代码上下文中更有意义的形式。也就是说,结果的解释方式突出了查询旨在发现的潜在问题。
查询包含指示应如何解释结果的元数据属性。例如,某些查询在代码中的单个位置显示一条简单的消息。其他的则显示一系列代表数据流或控制流路径上的步骤的位置,以及解释结果重要性的消息。没有元数据的查询不会被解释——它们的结果作为表格输出,而不显示在源代码中。
在解释之后,结果被输出用于代码审查和分类。在 CodeQL for Visual Studio Code 中,解释的查询结果会自动显示在源代码中。CodeQL CLI 生成的结果可以输出为多种不同格式,以供不同工具使用。
三、案例演示(WebGoat)
1、下载webgoat8.0版本:
https://github.com/WebGoat/WebGoat/archive/refs/tags/v8.0.0.M21.zip
2、创建Codeql数据库(本地需要已经安装maven,webgoat是基于maven构建的)
在webgoat根目录D:\CodeQlTest\WebGoat-8.0.0.M26下运行命令:
codeql database create java-database --language=java
查看webgoat根目录,数据库已新建成功
3、Vscode增加CodeQl标准库
点击文件–>选择将文件夹添加到工作区–>选中本地CodeQl库
4、通过VsCode的QL插件添加CodeQL数据库
选择之前创建的webgoat的数据库java-database
## 5、创建QL包,编写CodeQl脚本
QL 包必须包含qlpack.yml
在其根目录中调用的文件。
在codeql-repository\java\ql\examples目录下新建webgoatquery.ql"文件。
6、编写查询语句
在webgoatquery.ql中编写如下语句
import java
from Class B
where B.getName()="WebGoat"
select B
右键点击:RunQuery
执行成功,会查询到WebGoat这个类
修改代码,查询一个方法
点击lessonPage,跳转到代码