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