了解 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 分析警报并生成建议的修补程序。 这包括:

  • 解决该问题的代码更改
  • 说明问题发生的原因
  • 关于修复如何解决该问题的指导

你不是从头开始手动编写修复,而是从建议的修改开始。

典型的工作流如下所示:

  1. CodeQL 在工作流中运行并创建警报。
  2. 打开警报并查看受影响的代码。
  3. Copilot Autofix 会生成建议的修复方案。
  4. 您审阅说明和拟议的更改。
  5. 应用修复,这会创建一个拉取请求。
  6. 拉取请求在合并前会先通过各项检查并接受审查。

此工作流将检测直接连接到修正,而无需离开GitHub接口。

Copilot 自动修复不会自动应用更改。 你负责评审和批准修补程序。 这样可以确保:

  • 该修复方案与你的代码库相契合。
  • 如果需要,可以调整实现。
  • 更改将经过您现有的审核流程。

Autofix 最适用于:

  • 常见的漏洞模式,例如注入风险或不安全的 API 使用情况。
  • 可通过明确的本地化代码更改来解决的问题。

对于更复杂的问题,Autofix 可能会提供指导,但可能需要修改修补程序或实现自定义解决方案。

警报中的修复建议

即使 Autofix 不可用,某些警报也包括建议的修补程序。

这些建议:

  • 突出显示应更改的代码部分。
  • 提供有关如何解决问题的指导。

编写修补程序时,可以使用这些建议作为起点。

使用 Dependabot 修正依赖项

并非所有漏洞都来自代码。 有些是通过依赖项引入的。

Dependabot 通过以下方法自动解决这些问题:

  • 检测易受攻击的依赖项。
  • 使用更新的版本创建拉取请求。
  • 允许您查看并合并修复内容。

这些拉取请求遵循与 Autofix 相同的工作流程:

  1. 建议进行更改。
  2. 运行检查。
  3. 审查并更新合并。

这使得依赖项修正与修复应用程序代码问题的方式一致。

补救工作流自动化

你可以使用 GitHub Actions 将修复流程自动化。

例如,工作流可以:

  • 对 Autofix 或 Dependabot 的拉取请求运行测试。
  • 根据严重性应用标签。
  • 要求高风险更改必须经过批准。
  • 自动合并低风险更新。

这些工作流可确保修复工作:

  • 在整个团队内保持一致。
  • 在合并之前进行验证。
  • 集成到您的开发流程中。

从检测到解析

在完整的工作流中:

  1. CodeQL 检测到漏洞。
  2. Copilot Autofix 建议修复方案。
  3. 已创建拉取请求。
  4. GitHub Actions验证更改。
  5. 修复被审查并更新合并。

通过将 CodeQL 分析与 Copilot Autofix、Dependabot 和工作流自动化相结合,可以创建一个系统,不仅会发现问题,而且还有助于有效地解决这些问题。

处理代码扫描警报

可以设置代码扫描以检查存储库中的代码。 可以使用默认 CodeQL 分析、非Microsoft分析或其他类型的分析。 生成的警报在存储库中并排显示。

GitHub 的默认 CodeQL 分析所包含的警报属性可能多于来自非 Microsoft 工具或自定义查询的结果。 在默认工作流中,代码扫描在默认分支上和拉取请求期间定期分析代码。

每个警报都包含以下信息:

  • 代码存在的问题及识别该问题的工具名称。
  • 触发警报的代码行。
  • 警报的属性,例如严重性。
  • 安全严重性。
  • 问题被引入的时刻。
  • 问题的性质。

信息还包括在 CodeQL 分析标识警报时如何解决问题。 此外,通过 CodeQL 扫描代码可以检测代码中的数据流问题。

GHAS 中的 CodeQL 分析警报的屏幕截图。

除了手动修复漏洞之外,还可以使用 Dependabot 安全更新自动执行依赖项修正。

当 Dependabot 检测到易受攻击的依赖项时,它会创建一个拉取请求来更新依赖项。 这些拉取请求可以集成到自动化工作流中,以简化修正。

使用 Dependabot 自动执行依赖项修正

典型的自动化工作流遵循以下模式:

  1. Dependabot 创建拉取请求来更新易受攻击的依赖项。
  2. GitHub Actions 工作流会在 pull_request 事件发生时触发。
  3. 该工作流会检查拉取请求是否由 dependabot[bot] 创建。
  4. 有关更新(如依赖项类型或版本更改)的元数据可用于确定下一个操作。
  5. 该工作流会执行验证检查、添加标签,或为低风险更新启用自动合并。

以下示例演示了一个简单的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)数据来计算警报的安全严重性。

默认情况下,任何安全严重性为 “严重 ”或 “高 ”的代码扫描结果都会导致检查失败。 可以指定哪个安全严重性级别会导致代码扫描结果的检查失败。

关闭代码扫描警报

可通过两种方式关闭警报:

  • 修复代码中的问题。
  • 消除或删除警报。

关闭代码扫描警报

忽略警报是一种关闭你认为不需要修复的警报的方法。 例如,你可能会忽略仅用于测试的代码中的错误警报。 如果修复错误所需的工作量大于改进代码的潜在好处,则还可以消除警报。

可以从代码中的代码扫描注释或 “安全 ”选项卡上的摘要列表中消除警报。若要从列表中消除警报,请选择“ 消除警报 ”菜单,选择消除原因,然后选择“ 消除警报 ”按钮。

显示用于消除代码扫描警报的下拉菜单和按钮的动画。

当您忽略警报时:

  • 该警报在所有分支中均已关闭。
  • 该警报已从项目的当前警报数量中移除。
  • 警报将移动到警报摘要中的 “已关闭 ”列表。 如有必要,你可以从那里重新打开它。
  • 已记录关闭警报的原因。
  • 下次代码扫描运行时,同一代码不会生成警报。