代码扫描疑难解答

通常,如果遇到 CodeQL 执行错误,则 CodeQL CLI 将报告它作为退出代码运行的每个命令的状态。 退出代码可为后续命令或依赖于 CodeQL CLI 的其他工具提供信息。 有关退出代码的详细信息,请参阅退出代码

先决条件

类别 要求
权限 - 若要查看存储库的所有警报的摘要:存储库的 参与者 权限。
- 若要消除高级安全性中的警报: 项目管理员 权限。
- 若要管理高级安全性中的权限:需要成为 项目集合管理员 组的成员,或者将 高级安全性:管理设置 权限设置为 允许

有关高级安全权限的详细信息,请参阅 “管理高级安全”权限

错误:'database finalize' CodeQL 命令 (32)

此错误表示完成 CodeQL 数据库创建时出现问题,而这可能源于提取错误或缺少生成步骤。

故障排除步骤:

  1. 验证代码是否存在并已编译
    • 对于已编译的语言,请验证生成流程是否正在编译代码,且正在 AdvancedSecurity-Codeql-InitAdvancedSecurity-Codeql-Analyze 任务之间进行。 你可在指定生成命令中找到常见生成命令和所需的标志(例如,“干净且无缓存/无守护程序”)。
    • 对于解释的语言,请确认项目中指定语言有一些源代码。
  2. 检查提取错误
    • 验证提取错误是否会影响 CodeQL 数据库的运行状况。
    • 查看日志文件,了解提取错误和警告,以便评估总体数据库运行状况。
  3. 调查严重错误
    • 如果大多数文件遇到提取程序错误,则请进一步调查以了解提取不当的根本原因。

错误:自动生成脚本 (1)

此错误描述了某一自动生成故障,并表明代码扫描设置或配置出现问题。

故障排除步骤:

错误:在代理工具缓存中未找到 CodeQL 目录

此错误表示安装适用于自托管代理的 CodeQL 时出现问题。

故障排除步骤:

错误:未设置语言管道变量

尝试运行 CodeQL 而未设置用于指定要扫描哪些语言的管道变量时,会出现此错误。

故障排除步骤:

未返回任何结果的 CodeQL

本节提供针对 CodeQL 分析未生成任何结果的情况的相关指导。

故障排除步骤:

  1. 检查是否存在已检测到的漏洞
    • 请考虑代码可能没有任何漏洞。 如果预计存在漏洞但未检测到,这请继续进行验证。
  2. 查看查询套件配置
    • 确认正在使用的查询套件,并在必要时考虑切换到更全面的套件。
    • 或者,也可创建自定义查询套件以进行定制分析。
  3. 调整用于查看结果的权限
    • 确保已授予适当的权限(至少为参与者级别)以访问分析结果。 有关详细信息,请参阅 Advanced Security 权限

CodeQL 超时

如果AdvancedSecurity-Codeql-Analyze@1任务显示This job was abandoned ... we lost contact with the agent并且您正在使用托管的 Microsoft 代理,则任务将触及到付费托管代理的内置 6 小时超时。 可以尝试改为在自托管代理上运行分析。

代码扫描任务权限

代码扫描生成任务使用管道标识来调用高级安全 REST API。 默认情况下,同一项目中的管道有权上传通过运行 CodeQL 分析生成的 SARIF 文件。 如果从生成服务帐户中删除了这些权限,或者如果你有自定义设置(例如,托管在与存储库不同的项目中的管道),请手动授予这些权限。

故障排除步骤:

  • 向管道中使用的生成服务帐户授予 Advanced Security: View alertsAdvanced Security: Manage and dismiss alerts 权限。对于项目范围的管道,该帐户为 [Project Name] Build Service ([Organization Name]);对于集合范围的管道,该帐户为 Project Collection Build Service ([Organization Name])

代码扫描将结果发布到非目标存储库

如果管道定义位于一个存储库中,并且 GitHub 高级安全性要扫描的源代码位于另一个存储库中,则结果可能会被处理并提交到不正确的存储库,发布到包含管道定义的存储库,而不是源代码存储库。

若要启用预期的结果路由,请将管道环境变量 advancedsecurity.publish.repository.infer: true 设置为从工作目录中的存储库中推断要发布的存储库。

trigger:
  - main

resources:
  repositories:
    # PipelineRepo: The repository containing the pipeline definition.
    # This is optional and only needed if you plan to reference files or scripts from this repo.
    - repository: PipelineRepo
      type: git
      name: DevOpsPipelineRepo
      ref: refs/heads/main
      trigger:
        - main
    # SourceRepo: The repository where scanning and publishing will occur.
    - repository: SourceRepo
      type: git
      name: code-to-analyze-repo
      ref: refs/heads/main
      trigger:
        - main

jobs:
  - job: "CodeQLScan"
    displayName: "CodeQL Scanning with Inferred Publishing"
    variables:
      # Enable repository inference
      advancedsecurity.publish.repository.infer: true
    steps:
      # Checkout the SourceRepo
      - checkout: SourceRepo

      # Initialize CodeQL
      - task: AdvancedSecurity-Codeql-Init@1
        displayName: "Initialize CodeQL"
        inputs:
          languages: "python,javascript" # Adjust based on repository languages

      # Perform CodeQL analysis
      - task: AdvancedSecurity-Codeql-Analyze@1
        displayName: "Analyze Code with CodeQL"

将 CodeQL 捆绑包手动安装到自托管代理

通过使用 GitHub 上提供的体系结构安装脚本,将 CodeQL 捆绑包安装到代理工具缓存。 这些脚本要求将 $AGENT_TOOLSDIRECTORY 环境变量设置为代理上代理工具目录的位置, C:/agent/_work/_tool例如。 或者,可以手动实现以下步骤:

  1. GitHub 选择最新的 CodeQL 发布捆绑包。
  2. 下载捆绑包并将其解压缩到代理工具目录中的以下目录(通常位于 _work/_tool 下):./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/。 使用最新版本的 v2.16.0,文件夹名称为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/。 详细了解代理工具目录
  3. x64.complete 文件夹内创建名为 ./CodeQL/0.0.0-[codeql-release-bundle-tag] 的空文件。 以上面的示例为例,x64.complete 文件的结束文件路径为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete

如何显式定义存储库以将代码扫描警报发布到?

  • 使用管道环境变量 advancedsecurity.publish.repository.infer: true 来推断工作目录中的存储库,以确定要发布的存储库。
  • 另一种选择是,如果不显式签出存储库或使用别名签出存储库,请使用变量 advancedsecurity.publish.repository: $[ convertToJson(resources.repositories['YourRepositoryAlias']) ]

有关详细信息,请查看 发行说明