关于 CodeQL¶
CodeQL 是开发者用来自动化安全检查,以及安全研究人员用来执行变体分析的分析引擎。
在 CodeQL 中,代码被视为数据。安全漏洞、错误和其他错误被建模为可以针对从代码中提取的数据库执行的查询。您可以运行由 GitHub 研究人员和社区贡献者编写的标准 CodeQL 查询,或者编写您自己的查询以用于自定义分析。找到潜在错误的查询会在源文件中直接突出显示结果。
关于变体分析¶
变体分析是使用已知的安全漏洞作为种子在您的代码中查找类似问题的过程。这是一种安全工程师用来识别潜在漏洞并确保这些威胁在多个代码库中得到妥善修复的技术。
使用 CodeQL 查询代码是执行变体分析的最有效方法。您可以使用标准的 CodeQL 查询来识别种子漏洞,或通过编写您自己的自定义 CodeQL 查询来查找新的漏洞。然后,开发或迭代查询以自动查找可能使用传统手动技术遗漏的相同错误的逻辑变体。
CodeQL 分析¶
CodeQL 分析包括三个步骤
- 通过创建 CodeQL 数据库来准备代码
- 针对数据库运行 CodeQL 查询
- 解释查询结果
数据库创建¶
为了创建数据库,CodeQL 首先提取代码库中每个源文件的单个关系表示。
对于编译语言,提取通过监控正常的构建过程来完成。每次调用编译器来处理源文件时,都会创建一个该文件的副本,并收集有关源代码的所有相关信息。这包括有关抽象语法树的句法数据以及有关名称绑定和类型信息的语义数据。
对于解释语言,提取器直接在源代码上运行,解析依赖关系以提供代码库的准确表示。
CodeQL 为每种支持的语言提供了一个 提取器,以确保提取过程尽可能准确。对于多语言代码库,数据库是逐个语言生成的。
提取后,所有分析所需的数据(关系数据、复制的源文件和特定于语言的 数据库模式,它指定数据中的相互关系)将被导入到一个称为 CodeQL 数据库 的单个目录中。
查询执行¶
创建 CodeQL 数据库后,将针对它执行一个或多个查询。CodeQL 查询是用一种专门设计的面向对象查询语言 QL 编写的。您可以使用 用于 VS Code 的 CodeQL 扩展 或 CodeQL CLI 运行从 CodeQL 代码库签出的查询(或您自己编写的自定义查询)。有关查询的更多信息,请参阅“关于 CodeQL 查询”。
查询结果¶
最后一步将查询执行过程中产生的结果转换为在源代码上下文中更有意义的形式。也就是说,结果以突出显示查询旨在发现的潜在问题的方式进行解释。
查询包含元数据属性,指示如何解释结果。例如,一些查询在代码中的单个位置显示一条简单消息。其他查询显示一系列位置,代表数据流或控制流路径上的步骤,以及解释结果意义的消息。没有元数据的查询不会被解释——它们的结果以表格形式输出,而不是在源代码中显示。
解释完成后,将输出结果以供代码审查和分类。在用于 Visual Studio Code 的 CodeQL 中,解释后的查询结果会自动显示在源代码中。由 CodeQL CLI 生成的结果可以输出为多种不同格式,以便与不同的工具一起使用。
关于 CodeQL 数据库¶
CodeQL 数据库包含从代码库提取的、可查询的数据,用于特定时间点的单一语言。数据库包含代码的完整层次表示,包括抽象语法树、数据流图和控制流图的表示。
每种语言都有自己的独特数据库模式,该模式定义用于创建数据库的关系。该模式在提取过程中的初始词法分析和使用 CodeQL 进行的实际复杂分析之间提供了一个接口。例如,模式指定每个语言结构都有一个表。
对于每种语言,CodeQL 库都定义了类,以提供数据库表的抽象层。这提供了数据的面向对象视图,这使得编写查询变得更容易。
例如,在 Java 程序的 CodeQL 数据库中,两个关键表是
expressions
表包含在构建过程中分析的源代码中每个表达式的行。statements
表包含在构建过程中分析的源代码中每个语句的行。
CodeQL 库定义了类,以提供每个这些表(以及相关的辅助表)的抽象层:Expr
和 Stmt
。