一、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. Spring学习之AOP的实现方式

    Spring学习之AOP的三种实现方式 一.介绍AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能 ...

  2. Seaborn实现单变量分析

    import numpy as np import pandas as pd from scipy import stats,integrate import matplotlib.pyplot as ...

  3. 撸了一个 Feign 增强包

    前言 最近准备将公司的一个核心业务系统用 Java 进行重构,大半年没写 Java ,JDK 都更新到 14 了,考虑到稳定性等问题最终还是选择的 JDK11. 在整体架构选型时,由于是一个全新的系统 ...

  4. 自述:自学Java应该注意什么问题?

    Hello,大家好,我是若风,我是一名IT从业者,纵观当今局势,国内IT互联网行业发展是比较好的,当然学IT技术的人员也特别多,网上的学习资源也非常多,现在有很多人在学技术,想想要进入到 IT这个行业 ...

  5. PHP xml_parse() 函数

    定义和用法 xml_parse() 函数解析 XML 文档.高佣联盟 www.cgewang.com 如果成功,该函数则返回 TRUE.如果失败,则返回 FALSE. 语法 xml_parse(par ...

  6. PHP mysqli_sqlstate() 函数

    返回最后一个 MySQL 操作的 SQLSTATE 错误代码: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB ...

  7. api接口返回动态的json格式?我太难了,尝试一下 linq to json

    一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...

  8. Android SQLite轻量级数据库(简单介绍)

    SQLite它是相当于嵌入到安卓里的一个小数据库吧, 它也可以使用SQL语句进行数据库的增删改查操作,但是是SQL1992的语句. 然后SQLite也有自己的语句,但是学过SQL的应该都会发现,它比较 ...

  9. Java 程序员生产神器 IDEA 的常用快捷键、插件及设置

    对于 Java 程序员来说,使用 IDEA 集成环境是最称手的.优点不多讲,用过的人都知道.IDEA 虽好,但为了充分利用 IDEA 的优势,我分享一下我常用快捷键.插件和设置. 常用快捷键 Ctrl ...

  10. Flask 框架小记

    Flask 框架小记 Flask 实例 创建示例的代码 from flask import Flask # __name__ 是模块名, 用于反射导入模块 app = Flask(__name__, ...