IDE 中的漏洞扫描

返回 Go 安全

集成Go 语言服务器的编辑器,例如安装了 Go 扩展的 VS Code,可以检测依赖项中的漏洞。

依赖项漏洞检测有两种模式。它们都由Go 漏洞数据库支持,并且可以互为补充。

  • 基于导入的分析:在此模式下,编辑器通过扫描工作区中导入的软件包集来报告漏洞,并将发现结果显示在go.mod文件中作为诊断。这种方式速度很快,但如果您的代码导入了包含漏洞符号的软件包,但漏洞函数实际上是不可达的,则可能会报告误报。此模式可以通过 gopls 设置 "vulncheck": "Imports" 启用。
  • Govulncheck分析:此模式基于govulncheck命令行工具,该工具已嵌入gopls。这提供了一种低噪音、可靠的方式来确认您的代码是否实际调用了易受攻击的函数。由于此分析的计算成本可能很高,因此必须通过使用基于导入的分析的诊断报告关联的“运行 govulncheck 进行验证”代码操作,或使用go.mod文件上的 "codelenses.run_govulncheck" 代码镜头来手动触发。
Vulncheck

Go: Toggle Vulncheck (vulncheck.mp4)

这些功能在 gopls v0.11.0 或更新版本中可用。请在 go.dev/s/vsc-vulncheck-feedback 分享您的反馈。

特定编辑器说明

VS Code

Go 扩展Go extension提供了与 gopls 的集成。启用漏洞扫描功能需要以下设置:

"go.diagnostic.vulncheck": "Imports", // enable the imports-based analysis by default.
"gopls": {
  "ui.codelenses": {
    "run_govulncheck": true  // "Run govulncheck" code lens on go.mod file.
  }
}

可以使用“Go Toggle Vulncheck”命令来为当前工作区切换基于导入的分析的开启和关闭。

Vim/NeoVim

使用coc.nvim时,以下设置将启用基于导入的分析。

{
    "codeLens.enable": true,
    "languageserver": {
        "go": {
            "command": "gopls",
            ...
            "initializationOptions": {
                "vulncheck": "Imports",
            }
        }
    }
}

注意事项和说明

  • 该扩展不扫描私有软件包,也不发送任何关于私有模块的信息。所有分析都是通过从 Go 漏洞数据库中提取已知易受攻击的模块列表,然后在本地计算交集来完成的。
  • 基于导入的分析使用工作区模块中的软件包列表,如果使用了 go.work 或模块 replace/exclude,这可能与您在 go.mod 文件中看到的不同。
  • 当您修改代码或 Go 漏洞数据库更新时,govulncheck 的分析结果可能会过时。为了手动使分析结果无效,请使用显示在 go.mod 文件顶部的 “Reset go.mod diagnostics” 代码镜头。否则,结果将在一个小时后自动失效。
  • 这些功能目前不报告标准库或工具链中的漏洞。我们仍在研究如何向用户展示发现结果以及如何帮助用户处理这些问题。