1 前言
1.1 背景
CodeQL 是一个代码分析平台,在它的帮助下,安全研究人员可以利用已知的安全漏洞来挖掘类似的漏洞。
CodeQL 就是一种代码分析平台。借助这个平台,安全研究人员可以实现变种分析的自动化。这里所谓的变种分析,就是以已知的安全漏洞作为参照物,在我们的目标代码中寻找类似的安全问题的过程,也就是照葫芦画瓢的过程。
此外,为了提高安全分析人员的工作效率,CodeQL 平台还提供了许多有用的工具、脚本、查询和代码库。
1.2 相关概念
1.2.1 CodeQL 核心
- QL 语言
在静态程序分析学科中,通常采用一种 Data-Log 的声明式语言来代替命令式语言进行结果分析,具体可以参考「静态程序分析」文章。而 QL 语言便是 Data-Log 语言的一种。
- QL 数据库
CodeQL 数据库中存放的是使用 CodeQL 创建和分析的关系数据。 可以将其看作是目标代码的中间分析产物。
1.2.2 CodeQL 工作原理
CodeQL 工作流程:
- 将代码创建成数据库
- 编写 QL 查询从数据库中查询代码
- 解释查询结果
1.2.2.1 数据库创建
使用语言相关的 extractor 从代码中提取抽象语法树(ast)、名称绑定的语义和类型信息,把源代码转化成单关系表示(single relational representation),以 CodeQL 数据库存储。而在 CodeQL 中,是通过一种 CSV flow
模型来作为中间代码的。
此外,每种语言都有自己独特的数据库模式,用于定义创建数据库的关系。该图为提取过程中的初始词汇分析与使用 CodeQL 的实际复杂分析提供了界面。
1.2.2.2 执行查询
使用 CodeQL 专门设计的面向对象语言 QL 来查询此前创建的数据库
1.2.2.3 结果分析
将查询结果对应到源代码的上下文中去,即通过查询结果的解释找到源码中所对应的潜在漏洞
1.3 CodeQL 安装
首先需要下载 CodeQL CLI
二进制 文件 并安装,CLI 二进制文件支持主流的操作系统,包括 Windows、MacOS、Linux(以在 MacOS 上安装为例,Windows 上同理):
# 下载 codeql.zip
wget https://github.com/github/codeql-cli-binaries/releases/latest/download/codeql.zip
# 解压
unzip codeql.zip
# 将 codeql 添加至 path 中
echo "export PATH=\$PATH:/path/to/codeql" >> ~/.zshrc
source ~/.zshrc
然后需要下载相关库文件: https://github.com/Semmle/ql 。库文件是开源的,后续要做的是根据这些库文件来编写 QL 脚本。
之后,需要在 VSCode 上安装对应的扩展,在应用商店中搜索 CodeQL 即可。安装之后,需要在扩展设置里配置 CLI 文件的位置。
此外,还有一种快捷配置的方式,即: start workspace 项目。
注意:该工作区内含了 QL 库,因此一定要使用递归方式来下拉工作区代码。递归方式下拉该仓库后,不需要再下载 https://github.com/Semmle/ql
这个库了。
git clone --recursive git@github.com:github/vscode-codeql-starter.git
在配置好环境之后,就可以利用 CLI 工具来创建数据库了。以 Java 代码为例,使用如下命令创建:
codeql database create <database-folder> --language=java --command="mvn clean install --file pom.xml"
技巧 如果省略 --command
参数,则 codeQL 会自动检测并使用自己的工具来构建。但还是强烈推荐使用自己自定义的参数,尤其是大项目时。
建立好的数据库,其目录结构为:
- log/ # 输出的日志信息
- db-java/ # 编译的数据库
- src.zip # 编译所对应的目标源码
- codeql-database.yml # 数据库相关配置
除了在本地构建数据库外,CodeQL 还提供了在线版本: LGTM.com 。一方面,可以在其上面直接搜索开源项目,下载数据库;另一方面,也可以上传代码,后台会自动生成代码数据库。同时,在选定项目后,也可以在线查询,十分方便。
最后在 VSCode 中,点击「打开工作区」来打开刚刚下拉的 vscode-codeql-starter
工作区,在 CodeQL 插件里,打开刚刚生成的 database。
然后编写自己的 CodeQL 脚本,并将脚本保存至 vscode-codeql-starter/codeql-custom-queries-java
处,这样 import 模块时就可以正常引用。将编写的 ql 脚本在 VSCode 中打开,之后点击 CodeQL 插件中的 Run Query
,即可开始查询。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论