跳至主要内容

使用 CodeQL 包定制分析

您可以使用 CodeQL 包运行其他人维护的 CodeQL 查询,或共享您自行开发的 CodeQL 查询。

谁可以使用此功能?

CodeQL 可用于以下仓库类型

您可以通过下载他人创建的包并在代码库上运行它们来自定义 CodeQL 分析。欲了解更多信息,请参阅 CodeQL 查询包

下载并使用 CodeQL 查询包

在能够使用 CodeQL 查询包分析数据库之前,您必须从 GitHub Container Registry 下载所需的所有软件包。可以通过在 codeql database analyze 命令中使用 --download 标志,或运行 codeql pack download 来完成此操作。如果软件包未公开提供,则需要使用 GitHub App 或个人访问令牌进行身份验证。有关更多信息和示例,请参阅 将 CodeQL 分析结果上传到 GitHub

选项是否必填用途
<scope/name@version:path>使用逗号分隔的列表指定一个或多个 CodeQL 查询包的作用域和名称以下载。可选地,包含要下载并解压的版本。默认情况下会下载该包的最新版本。可选地,包含要运行的查询、目录或查询套件的路径。如果未包含路径,则运行该包的默认查询。
--github-auth-stdin通过标准输入将用于 GitHub REST API 身份验证的 GitHub App 或个人访问令牌从您的密钥存储传递给 CLI。如果命令已能够访问设置了该令牌的 GITHUB_TOKEN 环境变量,则无需此操作。

注意

如果您指定了特定版本的查询包,请注意您指定的版本可能最终会因为 CodeQL 最新版本而变得过旧,难以高效使用。为确保最佳性能,如果需要固定查询包的确切版本,请在每次升级所使用的 CodeQL CLI 时重新评估您所锁定的版本。

有关包兼容性的更多信息,请参阅 CodeQL 查询包参考

下载并使用查询包的基本示例

此示例使用 --download 选项运行 codeql database analyze 命令,以

  1. 下载 octo-org/security-queries 包的最新版本。
  2. 下载与版本 1.0.1 兼容octo-org/optional-security-queries 包的一个版本(本例中为 1.0.2)。有关语义化版本兼容性的更多信息,请参阅 npm 的语义化版本范围文档
  3. 运行 octo-org/security-queries 中的所有默认查询。
  4. 仅运行 octo-org/optional-security-queries 中的查询 queries/csrf.ql
$ echo $OCTO-ORG_ACCESS_TOKEN | codeql database analyze --download /codeql-dbs/example-repo \
    octo-org/security-queries \
    octo-org/optional-security-queries@~1.0.1:queries/csrf.ql \
    --format=sarif-latest --output=/temp/example-repo-js.sarif

> Download location: /Users/mona/.codeql/packages
> Installed fresh octo-org/security-queries@1.0.0
> Installed fresh octo-org/optional-security-queries@1.0.2
> Running queries.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> [1/2] Found in cache: /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> Starting evaluation of octo-org/security-queries/query1.ql.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> [2/2] Found in cache: /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> Starting evaluation of octo-org/optional-security-queries/queries/csrf.ql.
> [2/2 eval 694ms] Evaluation done; writing results to octo-org/security-queries/query1.bqrs.
> Shutting down query evaluator.
> Interpreting results.

直接下载 CodeQL 包

如果您想在不立即运行的情况下下载 CodeQL 包,可以使用 codeql pack download 命令。这在希望在运行 CodeQL 查询时避免联网时非常有用。运行 CodeQL 分析时,您可以像前面示例那样以相同方式指定包、版本和路径。

echo $OCTO-ORG_ACCESS_TOKEN | codeql pack download <scope/name@version:path> <scope/name@version:path> ...

从多个 GitHub Container Registry 下载 CodeQL 包

如果您的 CodeQL 包分布在多个容器注册表中,则必须告诉 CodeQL CLI 在何处查找每个包。有关详细信息,请参阅 代码扫描的工作流配置选项

指定在 CodeQL 包中运行哪些查询

查询限定符由 codeql database analyze 及其他对查询集合进行操作的命令使用。查询限定符的完整形式为 scope/name@range:path,其中

  • scope/name 是 CodeQL 包的限定名称。
  • range 是一个 语义化版本范围
  • path 是指向单个查询、包含查询的目录或查询套件文件的文件系统路径。

当您指定 scope/name 时,rangepath 为可选。如果省略 range,将使用指定包的最新版本。如果省略 path,则使用指定包的默认查询套件。

path 可以是以下之一:.ql 查询文件、包含一个或多个查询的目录,或 .qls 查询套件文件。如果省略包名称,则必须提供 path,该路径将相对于当前进程的工作目录进行解释。不支持全局模式(glob)匹配。

如果同时指定了 scope/namepath,则 path 不能是绝对路径。它被视为相对于 CodeQL 包根目录的相对路径。

查询限定符示例

  • codeql/python-queries - 最新版本的 codeql/python-queries 包默认查询套件中的所有查询。

  • codeql/python-queries@1.2.3 - 版本为 1.2.3codeql/python-queries 包默认查询套件中的所有查询。

  • codeql/python-queries@~1.2.3 - 最新版本的 codeql/python-queries 包中,满足 >=1.2.3<1.3.0 的所有查询。

  • codeql/python-queries:Functions - 最新版本的 codeql/python-queries 包中 Functions 目录下的所有查询。

  • codeql/python-queries@1.2.3:Functions - 版本为 1.2.3codeql/python-queries 包中 Functions 目录下的所有查询。

  • codeql/python-queries@1.2.3:codeql-suites/python-code-scanning.qls - 版本为 1.2.3codeql/python-queries 包中 codeql-suites/python-code-scanning.qls 文件中的所有查询。

  • suites/my-suite.qls - 相对于当前工作目录的 suites/my-suite.qls 文件中的所有查询。

提示

标准 CodeQL 查询包的默认查询套件为 codeql-suites/<lang>-code-scanning.qls。每个包的 codeql-suites 目录中还有其他实用的查询套件。例如,codeql/cpp-queries 包包含以下查询套件:

  • cpp-code-scanning.qls - 用于 C++ 的标准代码扫描查询。该包的默认查询套件。
  • cpp-security-extended.qls - 来自默认 cpp-code-scanning.qls 套件的查询,外加低严重性和低精度的查询。
  • cpp-security-and-quality.qls - 来自 cpp-security-extended.qls 的查询,外加可维护性和可靠性查询。

您可以在 CodeQL 仓库 中查看这些查询套件的源码。其他语言的查询套件也类似。

使用模型包分析对自定义依赖的调用

您可以使用 --model-packs 选项在代码扫描分析中包含已发布的模型包。例如:

$ codeql database analyze /codeql-dbs/my-company --format=sarif-latest \
  --model-packs my-repo/my-java-model-pack \
  --output=/temp/my-company.sarif codeql/java-queries

在此示例中,标准查询包 codeql/java-queries 中的相关查询将使用模型包 my-repo/my-java-model-pack 中的依赖信息,检查调用这些依赖的代码是否存在漏洞。

您可以在一次分析中指定多个已发布的模型包。

有关编写您自己的模型包的更多信息,请参阅 创建和使用 CodeQL 包

关于已发布的包

当一个包被发布用于分析时,codeql pack createcodeql pack publish 命令会验证内容完整性,并向其中添加一些额外的内容。

  • 对于查询包,会复制其所依赖的每个库包的精确版本。使用该查询包的用户无需单独下载这些库包。

  • 对于查询包,会预编译每个查询的表示形式。这比在每次分析时编译查询的 QL 源码要快得多。

大多数此类数据位于已发布包中的 .codeql 目录下,但预编译的查询保存在与每个查询的 .ql 源文件并列的 .qlx 后缀文件中。当使用已发布包中的查询分析数据库时,CodeQL 将加载这些文件而不是 .ql 源文件。如果您需要修改一个已发布的包,请务必删除所有 .qlx 文件,因为它们可能阻止对 .ql 文件所做的修改生效。

© . This site is unofficial and not affiliated with GitHub, Inc.