Skip to main content

关于使用 CodeQL 进行代码扫描

可以使用 CodeQL 来识别代码中的漏洞和错误。 结果在 GitHub 中显示为 code scanning 警报。

谁可以使用此功能?

启用了 GitHub Advanced Security 的组织拥有的存储库

Note

网站管理员必须启用 code scanning,然后你才能使用此功能。 有关详细信息,请参阅“为设备配置代码扫描”。

如果企业所有者在企业级别设置了 GitHub Advanced Security (GHAS) 策略,则你可能无法启用或禁用 code scanning。 有关详细信息,请参阅“强制实施企业的代码安全性和分析策略”。

CodeQL 是 GitHub 开发的代码分析引擎,用于自动执行安全检查。 可使用 CodeQL 分析代码,并将结果显示为 code scanning 警报。

对 code scanning 使用 CodeQL 分析有三种主要方法:

  • 使用默认设置在存储库上快速配置对 code scanning 的 CodeQL 分析。 默认设置自动选择要分析的语言、要运行的查询套件和触发扫描的事件。 如果需要,可以手动选择要运行的查询套件和要分析的语言。 启用 CodeQL 后,GitHub Actions 将执行工作流运行以扫描代码。 有关详细信息,请参阅“配置代码扫描的默认设置”。

  • 使用高级设置将 CodeQL 工作流添加到存储库。 这会生成一个可自定义的工作流文件,该文件使用 github/codeql-action 运行 CodeQL CLI。 有关详细信息,请参阅“配置代码扫描的高级设置”。

  • 直接在外部 CI 系统中运行 CodeQL CLI 并将结果上传到 GitHub。 有关详细信息,请参阅“在现有 CI 系统上使用代码扫描”。

Note

在 GitHub Enterprise Server 3.14 上, CodeQL 操作默认使用 CodeQL CLI 版本 2.17.6。 如果在外部 CI 系统中运行分析,建议使用 CodeQL CLI 的相同版本。

有关 code scanning 警报的信息,请参阅“关于代码扫描警报”。

关于 CodeQL

CodeQL 是一种将代码视为数据的编程语言和关联的工具。 它的创建是为了使分析代码更容易,并比传统静态分析器更有信心地发现代码中的潜在漏洞。

  1. 生成 CodeQL 数据库来代表您的代码库。
  2. 然后,对该数据库运行 CodeQL 查询,以确定代码库中的问题。
  3. 将 CodeQL 与 code scanning一起使用时,查询结果在 GitHub Enterprise Server 中显示为 code scanning 警报。

CodeQL 支持编译的语言和解释的语言,并且可以在使用支持的语言编写的代码中发现漏洞和错误。

  • C/C++
  • C#
  • Go
  • Java/Kotlin
  • JavaScript/TypeScript
  • Python
  • Ruby
  • Swift

Note

  • 使用 java-kotlin 分析用 Java、Kotlin 或两者共同编写的代码。
  • 使用 javascript-typescript 分析用 JavaScript、TypeScript 或两者共同编写的代码。

有关详细信息,请参阅 CodeQL 网站上的文档:“支持的语言和框架”。

为自定义框架或利基框架建模

GitHub 专家、安全研究人员和社区参与者编写库来为常用框架和库中的数据流建模。 如果使用未建模的自定义依赖项,则可以使用 Visual Studio Code 的 CodeQL 扩展来创建这些依赖项的模型,并使用它们扩展分析。 有关详细信息,请参阅“使用 CodeQL 模型编辑器”。

CodeQL 查询

GitHub 专家、安全研究人员和社区贡献者编写和维护用于 code scanning 的默认 CodeQL 查询。 查询会定期更新以改进分析,并减少任何误报结果。 默认和扩展包中可用查询的详细信息,请参阅默认和安全扩展查询套件中包含的查询

编写自己的查询

这些查询是开源查询,因此可以在 github/codeql 存储库中查看它们并向其贡献内容。 有关详细信息,请参阅 CodeQL 文档中的关于 CodeQL 查询

运行额外查询

如果使用高级设置或外部 CI 系统扫描代码,则可以在分析过程中运行其他查询。

这些查询必须属于已发布的 CodeQL 查询包或存储库中的 CodeQL 包。

  • 当 CodeQL 查询包发布到 GitHub Container registry 时,查询所需的所有可传递依赖项和编译缓存都包含在包中。 这可以提高性能,并确保在包中运行查询每次都会提供相同的结果,直到升级到新版本的包或 CLI。

  • 可以通过多个 GitHub 容器注册表下载 CodeQL 查询包。 有关详细信息,请参阅“自定义代码扫描的高级设置”。

有关详细信息,请参阅“使用 CodeQL 包自定义分析”。