Codeql初学

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
Gogo
Javajava
JavaScript/TypeScriptjavascript
Pythonpython

其它参数:

–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,跳转到代码
在这里插入图片描述

### CodeQL 入门教程 CodeQL 是一种强大的查询语言,用于分析和理解源代码中的安全漏洞和其他质量问题。它允许开发者编写复杂的查询来检测潜在的安全隐患并改进软件质量。 #### 什么是 CodeQLCodeQL 是由 Semmle 开发的一种静态分析技术,现在已成为 GitHub 的一部分。它可以用来扫描代码库以查找已知的漏洞模式以及自定义逻辑错误[^5]。通过学习 CodeQL开发人员可以更有效地识别代码中的安全隐患,并提高整体安全性。 #### 安装与配置 要开始使用 CodeQL,首先需要安装必要的工具链。可以通过以下链接下载官方支持的 CodeQL CLI 工具包: - **GitHub CodeQL**: [https://github.com/github/codeql](https://github.com/github/codeql) 完成安装后,还需要设置环境变量以便命令行能够访问这些工具。具体步骤如下所示: ```bash export PATH=$PATH:/path/to/your/codeql-cli/bin ``` #### 编写第一个 Query 下面是一个简单的例子,展示如何利用 CodeQL 查找 C++ 中未初始化指针的情况: ```codeql import cpp from Pointer p where not exists(p.initializer) select p, "This pointer is never initialized." ``` 此脚本会遍历整个项目文件树结构寻找那些声明之后从未被赋予初始值的指针变量[^6]。 #### 运行 Queries 一旦创建好 query 文件 (通常扩展名为 .ql),就可以借助 `codeql` 命令执行它们: ```bash codeql database analyze --format=csv mydb UninitializedPointers.ql > results.csv ``` 上述指令将会把查询结果导出到 CSV 文件当中便于后续处理或者报告生成[^7]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值