一、CodeQL CLI 安装和配置

1.下载CodeQL CLI 压缩包

https://github.com/github/codeql-cli-binaries/releases

2.创建CodeQL目录,如$HOME/codeql-home

3.创建CodeQL查询的本地拷贝

CodeQL仓库包含分析C/C++, C#, Java, JavaScript、python等所需的查询和库文件。需要拷贝一份仓库到codeql-home目录,重命名仓库文件夹为codeql-repo

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

  • go的仓库地址:https://github.com/github/codeql-go/
  • 假设CodeQL仓库目录为$HOME/codeql-home/codeql-repo,那么go的仓库目录可以设置为$HOME/codeql-home/codeql-go

4.解压CodeQL CLI 压缩包$HOME/codeql-home目录

5.运行CodeQL

(1)通过直接执行$HOME/codeql-home/codeql/codeql来运行CodeQL

(2)将$HOME/codeql-home/codeql目录添加到环境变量

二、创建CodeQL数据库

命令:

codeql database create <database> --language=<language-identifier>

参数说明:

<database>:创建的数据库的路径,必须是不存在的文件夹

--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

三、使用CodeQL CLI分析数据库

命令:

codeql database analyze <database> <queries> --format=<format> --output=<output>

参数说明:

<database> 预分析的数据库路径

<queries> 要在数据库上运行的查询。可以指定一个或多个单独的查询文件,指定将以递归方式搜索查询文件的目录,或者命名定义了一组特定查询的查询套件。

--format  分析生成的结果文件的文件格式

--output  分析结果的输出路径

还可以通过--threads指定运行查询时要使用的线程数。默认选项是1

示例:

codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv

上述分析的结果会在新创建的文件夹js-analysis下的js-results.csv文件中输出

运行目录中的所有查询

您可以通过提供目录路径而不是列出所有单个查询文件来运行目录中的所有查询。路径是递归搜索的,因此子文件夹中包含的所有查询也将被执行。

重要

您不应在执行database analyze时指定QL包的根目录, 因为它包含一些并非为命令使用而设计的特殊查询。相反,要运行各种有用的查询,请运行LGTM.com查询套件之一。

例如,要执行Functions 目录中包含的所有Python查询,您将运行:

codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif

会生成一个SARIF结果文件。通过--format=sarif-latest可确保结果根据CodeQL支持的最新SARIF规范进行格式化。

结果

您可以将分析结果保存为多种不同格式,包括SARIF和CSV。

SARIF(数据分析结果交换格式)是定义输出文件格式的OASIS 标准。 SARIF 标准用于简化静态分析工具分享其结果的方式。 有关更多信息,请参见SARIF概述

如果选择将结果生成为CSV,则输出的每条告警将包含以下信息:

名称 标识结果的查询名称。 Inefficient regular expression
描述 查询的描述。 A regular expression that requires exponential time to match certain inputs can be a performance bottleneck, and may be vulnerable to denial-of-service attacks.
严重程度 查询的严重性。 error
信息 告警消息。 This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\\\'.
路径 包含告警的文件的路径。 /vendor/codemirror/markdown.js
起跑线 触发告警的代码开始的文件行。 617
开始栏 起始行的列,用于标记告警代码的开始。第一列不包括在内。 32
终点线 触发告警的代码结束的文件行。与起始行相同时不包括在内。 64
结束栏 可能的话,在结束行的列中标记告警代码的结尾。否则,将重复结束行。 617

结果文件可以集成到您自己的代码审查或调试基础结构中。例如,SARIF文件输出可通过IDE的SARIF查看插件在源代码中的正确告警位置进行突出显示。

在CodeQL CLI中使用自定义查询

您可以通过编写自己的查询来突出显示特定的漏洞或错误,从而自定义CodeQL分析。

写一个有效的查询

在运行自定义分析之前,您需要编写一个有效的查询,并将其保存在带有.ql扩展名的文件中。有大量可用的文档可帮助您编写查询。有关更多信息,请参阅学习CodeQL帮助中的CodeQL查询

包括查询的元数据

查询元数据包含在每个查询文件的顶部。它为用户提供有关查询的信息,并告诉CodeQL CLI如何处理查询结果。

使用命令运行查询时,必须包括以下两个属性,以确保正确解释结果:database analyze

  • 查询标识符(@id):小写字母或数字,通过分隔构成单词序列/-,识别和查询进行分类。
  • 查询类型(@kind):标识查询是警报()还是路径()。@kind problem@kind path-problem

有关这些元数据属性的更多信息,请参见CodeQL查询元数据和《查询元数据样式指南》

注意

如果要与其他应用程序一起使用查询,则元数据要求可能会有所不同。有关更多信息,请参见学习CodeQL帮助 中的关于CodeQL查询

创建一个自定义的QL包

编写自己的查询时,应将它们保存在自定义QL pack目录中。QL包提供了一种组织CodeQL分析中使用的文件的方法。该目录必须包含一个qlpack.yml在根目录下命名的文件。您的自定义查询应保存在QL包根目录或其子目录中。

对于每个QL包,该qlpack.yml文件都包含告诉CodeQL如何编译查询,该包所依赖的库以及在何处查找查询套件定义的信息。有关此文件中包含的内容的更多信息,请参见“ 定制QL包”

CodeQL CLI入门的更多相关文章

  1. NET Core 环境搭建和命令行CLI入门

    NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...

  2. NET Core 环境搭建和命令行CLI入门[转]

      NET Core 环境搭建和命令行CLI入门 时间:2016-07-06 01:48:19      阅读:258      评论:0      收藏:0      [点我收藏+]   标签: N ...

  3. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  4. Spring boot 官网学习笔记 - Spring Boot CLI 入门案例

    安装CLI https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.1.RELEASE/spring-b ...

  5. Vue -cli 入门 --项目搭建(一)

    一. 安装node.js环境. 在node.js官网下载稳定版本(https://nodejs.org/en/) 下载完成后点击安装,安装过程很简单,一直next即可,安装完成会自动添加node及np ...

  6. Azure CLI 简单入门

    Azure CLI 是什么 Azure 命令行接口 (CLI) 是用于管理 Azure 资源的 Microsoft 跨平台命令行体验. Azure CLI 易于学习,是构建适用于 Azure 资源的自 ...

  7. ABPHelper.CLI及其依赖项简单介绍

    目录 目录 ABPHelper.CLI 入门 使用指南 命令行 技术点如下 Scriban 通过Microsoft.Extensions.FileProviders.Embedded获取嵌入资源 通过 ...

  8. 3D打印CLI文件格式的读取

    CLI 英文全称:COMMON LAYER INTERFACE 中文名称:通用层接口. 推荐从官方网址看一下其完整的内容: (https://www.hmilch.net/downloads/cli_ ...

  9. .NET Core 系列5 :使用 Nuget打包类库

    NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...

随机推荐

  1. 【laravel】用户认证之----手动认证用户

    模型 如果某个模型类需要用于认证,必须继承自 Illuminate\Foundation\Auth\User 基类,否则会报错.然后在这个模型类中使用 Notifiable Trait,里面提供了用户 ...

  2. python map函数、filter函数、reduce函数

    1.map函数:map(func,可迭代对象): ①func可以是自定义的函数,也可以是功能简单的匿名函数(通过lambda定义) ②处理逻辑:表示将传入的可迭代对象依次循环,将每个元素按照传入的fu ...

  3. HTML基础和标签

    HTML 1.属性 在开始标签中写的键值对 2.颜色 ①英文 ②16进制代码  例如: #cccccc  #ccc (缩写) #000000 ③Rgba(0~255,255,255,0~1) 0~1代 ...

  4. Java MD5获取

    MD5算法具有以下特点: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD ...

  5. Mysql安装使用教程

    一:简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理.MySQL是开放源代码的,因此任何人都可以在Genera ...

  6. vue脚手架创建项目名字报错

    vue inti webpack TimeManger 报错 Sorry, name can no longer contain capital letters 原来这个capital是大写的意思,上 ...

  7. PHP date_time_set() 函数

    ------------恢复内容开始------------ 实例 设置时间: <?php$date=date_create("2013-05-01");date_time_ ...

  8. PHP ftp_quit() 函数

    定义和用法 ftp_quit() 函数关闭 FTP 连接. 语法 ftp_quit(ftp_connection) 参数 描述 ftp_connection 必需.规定要关闭的 FTP 连接. 提示和 ...

  9. PHP sqrt() 函数

    实例 返回不同数的平方根: <?phpecho(sqrt(0) . "<br>");echo(sqrt(1) . "<br>"); ...

  10. CF EC 86 E Placing Rooks 组合数学

    LINK:Placing Rooks 丢人现场.jpg 没看到题目中的条件 放n个rook 我以为可以无限放 自闭了好半天. 其实只用放n个.那么就容易很多了. 可以发现 不管怎么放 所有列/所有行 ...