0%

CodeQL学习笔记(一)

序言

杨柳散和风,青山澹吾虑。

CodeQL搭建环境,初步上手。

背景介绍

Semmle公司最早独创性的开创了一种QL语言,Semmle QL,并且运行在自家LGTM平台上。

LGTM平台上存放的就是一些开源项目,用户可以选择分析的语言,编写ql语句进行程序安全性查询。

2019年,GitHub(背后是微软)收购了Semmle公司,开源了CodeQL分析引擎。

CodeQL 引擎

image-20211021182151966

CodeQL引擎:

  • 将源码通过Extractor模块进行代码信息分析&提取,构建一套自己的关系型数据库Snapshot Database。

    编译型语言:Extractor观察编译器的编译过程,捕获编译器生成的AST,语义信息(名称绑定、类型信息、运算操作等),控制流,数据流信息,外加一份源码。

    解释型语言:Extractor直接分析源代码。

  • Snapshot Database里面包括:源代码,关系数据。

  • 接下来用户输入QL语句,经过CodeQL的工具库转换为Compiled Query,参与查询。

  • 最终展示查询结果。

Extractor做了哪些事情?

image-20211026141929462

如图所示:

  1. 对于待分析的源代码,首先Copy一份,用于后续保留。
  2. 将源码转换为关系型数据,也就是trap文件,放在database里面(比如,每个Java文件可以生成一个trap文件)。
  3. 上面二者(Copy + Database)构建为snapshot快照。

环境准备

CodeQL CLI来作为工具库 VSCode作为查询前端

CodeQL-CLI-binaries

文本命令行工具

下载地址:https://github.com/github/codeql-cli-binaries MacOS直接下载osx版本

配置环境变量

image-20211021210656167 image-20211021210555887

把$CODEQL放在插件中:

image-20211022114854132

CodeQL Library

CodeQL Query 查询工具库,负责编译QL语言,必不可少。

下载地址:https://github.com/github/codeql

image-20211021210535079

codeql-lib文件夹下存放的是各个语言的若干QL模块(qll文件),模块中有若干class可以用来match语言的若干case,这些class可以分为四种类型:

  • 语法型
  • 控制流型
  • 类型推断型
  • 污点跟踪型

源码准备

参考楼兰师傅,自己本地follow一遍

下载待分析的源码

选择WebGoat,jdk8版本

1
git clone --branch v8.0.0 https://github.com/WebGoat/WebGoat.git

构建数据库

到这里,codeql已经是一个命令行工具了,你可以随时在终端里调用它。

在WebGoat根目录下,创建数据库:

1
2
cd WebGoat
codeql database create webgoat-qldb -l java
image-20211022113654741

构建之后的数据库:

image-20211022114145300

VSCode

配置数据库

将上一步生成的webgoatqldb加载到vscode中,From a folder

image-20211022160542029

配置QL Pack

QL packs organize the files used in CodeQL analysis and can store queries, library files, query suites, and important metadata. Their root directory must contain a file named qlpack.yml. Your custom queries should be saved in the QL pack root, or its subdirectories.

按照官方文档来,新建一个文件夹codeql-query(存放配置文件和查询语句),表示一个QL查询包,编写配置文件alpack.yml:

1
2
3
name: example-query # 包名 确保唯一性 必写
version: 0.0.0 # 版本号 必写
libraryPathDependencies: codeql-java # 依赖 必写

添加到工作区

Add folder to workspace,保证codeql-home,codeql-query包添加到工作区:

QL查询

image-20211022160948714

编写QL脚本之后,直接右键->Code:Run Query;

图中为查询所有method,右侧为查询到的结果,点击既可查看对应的src源码。