代码扫描

通过适用于 Azure DevOps 的 GitHub Advanced Security 中的代码扫描,可以分析 Azure DevOps 存储库中的代码,查找安全漏洞和编码错误。 分析发现的任何问题都会作为警报引发。 代码扫描使用 CodeQL 来识别漏洞。

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

适用于 Azure DevOps 的 GitHub Advanced Security 可与 Azure Repos 配合使用。 如果要将 GitHub Advanced Security 与 GitHub 存储库配合使用,请参阅 GitHub Advanced Security

代码扫描的其他配置

语言和查询支持

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

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

语言 Identifier 可选替代标识符(如果有)
C/C++ c-cpp ccpp
C# csharp
Go go
Java/Kotlin java-kotlin
JavaScript/TypeScript javascript
Python python
Ruby ruby
Swift swift

提示

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

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

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

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

代码扫描生成模式自定义

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

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

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

对于通过适用于 Azure DevOps 的 GitHub Advanced Security 运行代码扫描分析,autobuild 生成模式是一个单独的生成任务 AdvancedSecurity-CodeQL-Autobuild@1

提示

生成模式 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)会将你定向到“高级安全”选项卡中的警报详细信息视图。

提示

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