通常,如果遇到 CodeQL 执行错误,则 CodeQL CLI 将报告它作为退出代码运行的每个命令的状态。 退出代码可为后续命令或依赖于 CodeQL CLI 的其他工具提供信息。 有关退出代码的详细信息,请参阅退出代码。
先决条件
类别 | 要求 |
---|---|
权限 | - 若要查看存储库的所有警报的摘要:存储库的 参与者 权限。 - 若要消除高级安全性中的警报: 项目管理员 权限。 - 若要管理高级安全性中的权限:需要成为 项目集合管理员 组的成员,或者将 高级安全性:管理设置 权限设置为 允许。 |
有关高级安全权限的详细信息,请参阅 “管理高级安全”权限。
错误:'database finalize' CodeQL 命令 (32)
此错误表示完成 CodeQL 数据库创建时出现问题,而这可能源于提取错误或缺少生成步骤。
故障排除步骤:
- 验证代码是否存在并已编译
- 对于已编译的语言,请验证生成流程是否正在编译代码,且正在
AdvancedSecurity-Codeql-Init
与AdvancedSecurity-Codeql-Analyze
任务之间进行。 你可在指定生成命令中找到常见生成命令和所需的标志(例如,“干净且无缓存/无守护程序”)。 - 对于解释的语言,请确认项目中指定语言有一些源代码。
- 对于已编译的语言,请验证生成流程是否正在编译代码,且正在
- 检查提取错误
- 验证提取错误是否会影响 CodeQL 数据库的运行状况。
- 查看日志文件,了解提取错误和警告,以便评估总体数据库运行状况。
- 调查严重错误
- 如果大多数文件遇到提取程序错误,则请进一步调查以了解提取不当的根本原因。
错误:自动生成脚本 (1)
此错误描述了某一自动生成故障,并表明代码扫描设置或配置出现问题。
故障排除步骤:
- 配置生成步骤
- 删除“自动生成”步骤,并在管道中为已编译语言配置特定的生成步骤。
- 请参阅配置适用于 Azure DevOps 的 GitHub Advanced Security 中提供的设置准则。
错误:在代理工具缓存中未找到 CodeQL 目录
此错误表示安装适用于自托管代理的 CodeQL 时出现问题。
故障排除步骤:
- 请参阅配置适用于 Azure DevOps 的 GitHub Advanced Security 中提供的设置准则或配置脚本。
错误:未设置语言管道变量
尝试运行 CodeQL 而未设置用于指定要扫描哪些语言的管道变量时,会出现此错误。
故障排除步骤:
- 设置语言管道变量
- 确保正确配置语言管道变量。 请参阅配置适用于 Azure DevOps 的 GitHub Advanced Security 中提供的设置准则。
- 支持的语言包括
csharp
、cpp
、go
、java
、javascript
、python
、ruby
和swift
。
未返回任何结果的 CodeQL
本节提供针对 CodeQL 分析未生成任何结果的情况的相关指导。
故障排除步骤:
- 检查是否存在已检测到的漏洞
- 请考虑代码可能没有任何漏洞。 如果预计存在漏洞但未检测到,这请继续进行验证。
- 查看查询套件配置
- 确认正在使用的查询套件,并在必要时考虑切换到更全面的套件。
- 或者,也可创建自定义查询套件以进行定制分析。
- 调整用于查看结果的权限
- 确保已授予适当的权限(至少为参与者级别)以访问分析结果。 有关详细信息,请参阅 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 alerts
和Advanced 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
例如。 或者,可以手动实现以下步骤:
- 从 GitHub 选择最新的 CodeQL 发布捆绑包。
- 下载捆绑包并将其解压缩到代理工具目录中的以下目录(通常位于
_work/_tool
下):./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/
。 使用最新版本的v2.16.0
,文件夹名称为./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/
。 详细了解代理工具目录。 - 在
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']) ]
有关详细信息,请查看 发行说明。