设置代码扫描

GitHub Advanced Security for Azure DevOps 中的代码扫描可让你分析 Azure DevOps 存储库中的代码,以查找安全漏洞和编码错误。 您需要使用适用于 Azure DevOps 的 GitHub 高级安全性,或者,如果您使用独立体验,则需要启用适用于 Azure DevOps 的 GitHub 代码安全性。 分析发现的任何问题都会作为警报发出。 代码扫描使用 CodeQL 来识别漏洞。

CodeQL 是 GitHub 开发的代码分析引擎,用于自动执行安全检查。 可以使用 CodeQL 分析代码,将结果显示为代码扫描警报。 有关 CodeQL 的更具体文档,请参阅 CodeQL 文档

适用于 Azure DevOps 的 GitHub Advanced Security 可与 Azure Repos 配合使用。 若要将 GitHub 高级安全性与 GitHub 存储库配合使用,请参阅 GitHub 高级安全性

先决条件

类别 要求
权限 - 若要查看存储库的所有警报的摘要:存储库的 参与者 权限。
- 若要消除高级安全性中的警报: 项目管理员 权限。
- 若要管理高级安全性中的权限:需要成为 项目集合管理员 组的成员,或者将 高级安全性:管理设置 权限设置为 允许

有关高级安全权限的详细信息,请参阅 “管理高级安全”权限

更多代码扫描配置

语言和查询支持

GitHub 专家、安全研究人员和社区参与者编写和维护用于代码扫描的默认 CodeQL 查询。 查询会定期更新,以改进分析并减少任何误报结果。 这些查询是开源查询,因此可以在 github/codeql 存储库中查看它们并向其贡献内容。

CodeQL 支持并使用以下语言标识符:

语言 标识符 可选替代标识符(如果有)
C/C++ c-cpp ccpp
C#(编程语言) csharp
走吧 go
Java/Kotlin java-kotlin
JavaScript/TypeScript javascript
Python语言 python
红宝石 ruby
迅速 swift

提示

  • 使用 c-cpp 分析用 C、C++ 或两者编写的代码。
  • 使用 java-kotlin 分析用 Java 或/和 Kotlin 编写的代码。
  • 使用 javascript 分析用 JavaScript 和/或 TypeScript 编写的代码。

有关详细信息,请参阅支持的语言和框架

可以在生成日志中查看 CodeQL 执行的特定查询和任务详细信息。

代码扫描发布结果任务的屏幕截图。

代码扫描生成模式自定义

设置管道进行扫描时,代码扫描支持两种生成模式:

  • none - CodeQL 数据库直接从代码库创建,而无需生成代码库(支持所有解释型语言,还支持 C# 和 Java)。
  • manual - 定义用于工作流中代码库的生成步骤(支持所有编译语言)。

有关不同生成模式的详细信息,包括每种生成模式的优点比较,请参阅 用于编译语言的 CodeQL 代码扫描

提示

生成模式 none 可用于其他解释语言,例如 JavaScript、Python、Ruby。 如果为 C# 或 Java 指定生成模式 none,以及其他不支持生成模式 none 的已编译语言,则管道任务将失败。

以下代码演示了具有多种语言和 none 生成模式的有效配置示例:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

以下代码演示了具有多种语言和 none 生成模式的无效配置的示例:

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

代码扫描警报

适用于 Azure DevOps 的 GitHub Advanced Security 的代码扫描警报包括按存储库的代码扫描标志,用于警示代码级别的应用程序漏洞。

要使用代码扫描,需要先配置适用于 Azure DevOps 的 GitHub Advanced Security

Azure DevOps 中 Repos 下的“Advanced Security”选项卡是查看代码扫描警报的中心。 选择“代码扫描”选项卡以查看扫描警报。 可以按分支、状态、管道、规则类型和严重性进行筛选。 此时,警报中心不会显示针对已为 PR 分支完成的扫描的对应警报。

重命名管道或分支不会对结果产生影响 - 最多可能需要 24 小时才能显示新名称。

如果选择运行自定义 CodeQL 查询,则默认情况下将不为不同查询包生成的警报提供单独的筛选器。 可以按规则进行筛选,该规则对每个查询都是不同的。

存储库代码扫描警报的屏幕截图。

如果关闭了存储库的 Advanced Security,则无法访问“Advanced Security”选项卡和生成任务中的结果。 生成任务不会失败,但在禁用高级安全性的情况下运行时,任何生成结果都将被隐藏且不被保留。

警报详细信息

选择某个警报以查看更多详细信息,包括修正指南。 每个警报都包含位置、说明、示例和严重性。

代码扫描警报详细信息的屏幕截图。

部分 说明
位置 位置部分详细说明了 CodeQL 检测到漏洞的特定实例。 如果存在多个违反同一规则的代码实例,则会为每个不同位置生成一个新警报。 “位置”卡包含指向受影响代码片段的直接链接,因此可以选择要定向到 Azure DevOps Web UI 的代码片段以进行编辑。
说明 说明由 CodeQL 工具根据问题提供。
建议 建议是针对给定代码扫描警报的建议修复。
示例 示例部分显示了代码中已识别弱点的简化示例。
严重性 严重性级别可以是低、中、高或严重。 严重性评分基于已识别的常见弱点枚举 (CWE) 的给定通用漏洞评分系统 (CVSS) 评分。 在这篇 GitHub 博文中了解有关如何对严重性进行评分的详细信息。

查看存储库的警报

任何拥有存储库参与者权限的人都可以在“Repos”下的“Advanced Security”中查看存储库所有警报的摘要。 选择代码扫描选项卡,以查看所有秘密扫描警报。

要显示结果,需要先运行代码扫描任务。 第一次扫描完成后,所有检测到的漏洞都会显示在“Advanced Security”选项卡中。

默认情况下,警报页显示存储库默认分支的依赖项扫描结果。

给定警报的状态反映默认分支和最新运行管道的状态,即使该警报存在于其他分支和管道上也是如此。

忽略代码扫描警报

要消除警报,需要具有适当的权限。 默认情况下,只有项目管理员可以消除 Advanced Security 警报。

要消除警报,请执行以下操作:

  1. 导航到要关闭的警报并选择该警报。
  2. 选择关闭警报下拉列表。
  3. 请选择“接受的风险”或“误报”作为关闭原因(如果尚未选择)。
  4. 在“注释”文本框中添加可选注释。
  5. 选择“关闭”以提交并关闭警报。
  6. 警报状态从开启更改为已关闭并显示您的取消原因。

如何关闭代码扫描警报的屏幕截图。

此操作会关闭所有分支中的警报通知。 还将消除包含相同漏洞的其他分支。 之前已消除的任何警报都可以手动重新打开。

管理拉取请求上的代码扫描警报

如果为拉取请求中的新代码更改创建了警报,则会在拉取请求的“概述”选项卡的注释部分作为注释报告,并在“高级安全存储库”选项卡中作为警报显示。拉取请求分支有一个新的分支选择器条目。

可以查看受影响的代码行,查看结果摘要,并在概述部分解决批注问题。

活动代码拉取请求注释的屏幕截图。

要取消拉取请求警报,则必须导航到警报详情视图,关闭警报并解决批注问题。 否则,只需更改注释状态(1)即可解析批注,但不会关闭或修复基础警报。

封闭代码拉取请求注释的屏幕截图。

要查看拉取请求分支的全部结果,请导航至存储库>高级安全性并选择您的拉取请求分支。 选择 批注上的“显示更多详细信息 ”(2)会将你定向到“高级安全”选项卡中的警报详细信息视图。

提示

只有当受影响的代码行与拉取请求的目标分支相比,拉取请求差异完全唯一时,才会创建批注。