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 |
c 或 cpp |
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)会将你定向到“高级安全”选项卡中的警报详细信息视图。
提示
只有当受影响的代码行与拉取请求的目标分支相比,拉取请求差异完全唯一时,才会创建批注。