了解 CodeQL 结果
在前面的单元中,你创建了一个数据库,并从代码中扫描了提取的文件。 现在,可以查看结果并确定是否存在要解决的安全漏洞。
解释的查询结果将自动显示在 Visual Studio Code 的 CodeQL 扩展的源代码中。 CodeQL CLI 生成的输出结果可以采用多种格式用于各种工具。
可以通过修改查询的 select 语句来控制分析结果在源代码中的显示方式。 你可以在开发查询时使结果清晰易懂。 在查询控制台或 Visual Studio Code 的 CodeQL 扩展中编写自己的查询时,对于可以选择的内容没有任何约束。
如果要使用查询在 GitHub 代码扫描中创建警报,或使用 CodeQL CLI 生成有效的分析结果,则需要以所需格式生成 select 语句报告结果。
借助 Copilot Autofix 的修复工作流
在 CodeQL 标识问题后,最重要的步骤是解决此问题。 GitHub通过允许你直接从警报移动到建议的修补程序,将检测与修正集成。
使用 Copilot Autofix 修复警报
在“安全”选项卡中打开 CodeQL 警报时,GitHub显示有关问题的详细信息,包括受影响的代码、严重性以及问题引入方式。
对于受支持的警报,你还会看到 Copilot 自动修复。
Copilot Autofix 分析警报并生成建议的修补程序。 这包括:
- 解决该问题的代码更改
- 说明问题发生的原因
- 关于修复如何解决该问题的指导
你不是从头开始手动编写修复,而是从建议的修改开始。
典型的工作流如下所示:
- CodeQL 在工作流中运行并创建警报。
- 打开警报并查看受影响的代码。
- Copilot Autofix 会生成建议的修复方案。
- 您审阅说明和拟议的更改。
- 应用修复,这会创建一个拉取请求。
- 拉取请求在合并前会先通过各项检查并接受审查。
此工作流将检测直接连接到修正,而无需离开GitHub接口。
Copilot 自动修复不会自动应用更改。 你负责评审和批准修补程序。 这样可以确保:
- 该修复方案与你的代码库相契合。
- 如果需要,可以调整实现。
- 更改将经过您现有的审核流程。
Autofix 最适用于:
- 常见的漏洞模式,例如注入风险或不安全的 API 使用情况。
- 可通过明确的本地化代码更改来解决的问题。
对于更复杂的问题,Autofix 可能会提供指导,但可能需要修改修补程序或实现自定义解决方案。
警报中的修复建议
即使 Autofix 不可用,某些警报也包括建议的修补程序。
这些建议:
- 突出显示应更改的代码部分。
- 提供有关如何解决问题的指导。
编写修补程序时,可以使用这些建议作为起点。
使用 Dependabot 修正依赖项
并非所有漏洞都来自代码。 有些是通过依赖项引入的。
Dependabot 通过以下方法自动解决这些问题:
- 检测易受攻击的依赖项。
- 使用更新的版本创建拉取请求。
- 允许您查看并合并修复内容。
这些拉取请求遵循与 Autofix 相同的工作流程:
- 建议进行更改。
- 运行检查。
- 审查并更新合并。
这使得依赖项修正与修复应用程序代码问题的方式一致。
补救工作流自动化
你可以使用 GitHub Actions 将修复流程自动化。
例如,工作流可以:
- 对 Autofix 或 Dependabot 的拉取请求运行测试。
- 根据严重性应用标签。
- 要求高风险更改必须经过批准。
- 自动合并低风险更新。
这些工作流可确保修复工作:
- 在整个团队内保持一致。
- 在合并之前进行验证。
- 集成到您的开发流程中。
从检测到解析
在完整的工作流中:
- CodeQL 检测到漏洞。
- Copilot Autofix 建议修复方案。
- 已创建拉取请求。
- GitHub Actions验证更改。
- 修复被审查并更新合并。
通过将 CodeQL 分析与 Copilot Autofix、Dependabot 和工作流自动化相结合,可以创建一个系统,不仅会发现问题,而且还有助于有效地解决这些问题。
处理代码扫描警报
可以设置代码扫描以检查存储库中的代码。 可以使用默认 CodeQL 分析、非Microsoft分析或其他类型的分析。 生成的警报在存储库中并排显示。
GitHub 的默认 CodeQL 分析所包含的警报属性可能多于来自非 Microsoft 工具或自定义查询的结果。 在默认工作流中,代码扫描在默认分支上和拉取请求期间定期分析代码。
每个警报都包含以下信息:
- 代码存在的问题及识别该问题的工具名称。
- 触发警报的代码行。
- 警报的属性,例如严重性。
- 安全严重性。
- 问题被引入的时刻。
- 问题的性质。
信息还包括在 CodeQL 分析标识警报时如何解决问题。 此外,通过 CodeQL 扫描代码可以检测代码中的数据流问题。
除了手动修复漏洞之外,还可以使用 Dependabot 安全更新自动执行依赖项修正。
当 Dependabot 检测到易受攻击的依赖项时,它会创建一个拉取请求来更新依赖项。 这些拉取请求可以集成到自动化工作流中,以简化修正。
使用 Dependabot 自动执行依赖项修正
典型的自动化工作流遵循以下模式:
- Dependabot 创建拉取请求来更新易受攻击的依赖项。
- GitHub Actions 工作流会在
pull_request事件发生时触发。 - 该工作流会检查拉取请求是否由
dependabot[bot]创建。 - 有关更新(如依赖项类型或版本更改)的元数据可用于确定下一个操作。
- 该工作流会执行验证检查、添加标签,或为低风险更新启用自动合并。
以下示例演示了一个简单的GitHub Actions工作流,该工作流仅针对 Dependabot 拉取请求运行。 它会验证更新,并在检查通过后启用自动合并。
name: Dependabot remediation
on:
pull_request:
branches:
- main
permissions:
pull-requests: write
jobs:
dependabot:
if: github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: npm test
- name: Enable auto-merge for approved updates
if: ${{ success() }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ github.event.pull_request.html_url }}
run: gh pr merge --auto --merge "$PR_URL"
此方法可帮助团队减少手动工作,同时确保在合并之前验证依赖项更新。
在生产方案中,自动合并通常仅限于低风险更新,例如修补程序版本,并结合分支保护规则、所需的状态检查和评审策略。
向团队通报修复活动
为了提高依赖项更新的可见性,团队通常将 Dependabot 与外部通知系统集成。
除了GitHub通知外,还可以使用:
- 通过 Slack 或 Microsoft Teams 集成实现团队协作。
- 用于自定义集成和自动化流程的 GitHub Webhooks
例如,工作流或 Webhook 可以在以下情况下通知团队:
- 已创建一个 Dependabot 拉取请求。
- 验证检查失败。
- 已合并一项安全更新。
这些通知可帮助团队在需要关注修复工作时快速响应。
数据流警报
数据流分析在代码中查找潜在的安全问题,包括:
- 以损害安全性的方式使用数据。
- 将危险参数传递给函数。
- 泄露敏感信息。
代码扫描报告数据流警报时,GitHub 将向你展示数据通过代码移动的方式。 可以使用这些数据流警报来标识泄露敏感信息的代码区域。 此知识可帮助你识别恶意用户攻击的入口点。
严重性级别
默认情况下,任何严重性为 “错误”的代码 扫描结果都会导致检查失败。
警报严重性级别为:
- Error
- Warning
- 注释
可以指定触发代码扫描警报的拉取请求应失败的严重性级别。
安全严重性级别
代码扫描生成的安全查询显示警报的安全严重性级别。
安全严重性级别为:
- 危急
- 高
- 中等
- 低
GitHub 使用常见漏洞评分系统(CVSS)数据来计算警报的安全严重性。
默认情况下,任何安全严重性为 “严重 ”或 “高 ”的代码扫描结果都会导致检查失败。 可以指定哪个安全严重性级别会导致代码扫描结果的检查失败。
关闭代码扫描警报
可通过两种方式关闭警报:
- 修复代码中的问题。
- 消除或删除警报。
关闭代码扫描警报
忽略警报是一种关闭你认为不需要修复的警报的方法。 例如,你可能会忽略仅用于测试的代码中的错误警报。 如果修复错误所需的工作量大于改进代码的潜在好处,则还可以消除警报。
可以从代码中的代码扫描注释或 “安全 ”选项卡上的摘要列表中消除警报。若要从列表中消除警报,请选择“ 消除警报 ”菜单,选择消除原因,然后选择“ 消除警报 ”按钮。
当您忽略警报时:
- 该警报在所有分支中均已关闭。
- 该警报已从项目的当前警报数量中移除。
- 警报将移动到警报摘要中的 “已关闭 ”列表。 如有必要,你可以从那里重新打开它。
- 已记录关闭警报的原因。
- 下次代码扫描运行时,同一代码不会生成警报。