乐趣区

关于go:Go的全新漏洞检测工具govulncheck来了

前言

Go 平安团队在 2022.09.06 公布了全新的破绽检测工具govulncheck,能够帮忙咱们发现 Go 程序里的安全漏洞。

本文具体介绍该工具目前的现状以及接下来的性能布局。

Go 破绽检测零碎架构

上图是 Go 平安团队对于 Go 代码破绽检测的零碎架构图。

  • 第 1 步,破绽采集。Go 平安团队会采集泛滥破绽数据库,包含公开的破绽数据库 (例如 National Vulnerability Database (NVD) 和 GitHub Advisory Database)、社区反馈的 Go package 破绽)以及 Go 团队修复过的安全漏洞等。
  • 第 2 步:更新 Go 的破绽数据库。对于第 1 步里收集到的安全漏洞,Go 平安团队会出具评估报告,对报告的破绽做评审,如果确认是须要解决的会进入到 Go 的破绽数据库里。这些破绽存储的依照 Open Source Vulnerability (OSV) format 格局进行存储,并且能够通过 API 获取到。
  • 第 3 步:工具集成。对于新的破绽解决后,会相应更新 pkg.go.dev 上的破绽阐明以及公布破绽检测工具 govulncheck 的新版本。govulncheck能够剖析扫描你的代码仓库,只展现那些真正影响到你程序执行的破绽。govulncheck工具十分牢靠,很少误报,能够帮忙你疾速发现一些已知的安全漏洞。

Go 破绽数据库

Go 平安团队保护了一个破绽数据库,地址是 https://vuln.go.dev,也就是下面第 2 步所说的破绽数据库。

  • 如果你发现了新破绽,能够通过这个安全漏洞链接)报告破绽。
  • 如果你认为已有的破绽报告形容有问题,能够在这个链接进行反馈。

Go 的破绽数据库里蕴含的破绽,能够在这个链接地址 pkg.go.dev/vuln 进行查看。

govulncheck

全新的 govulncheck 命令能够帮忙你发现代码里的安全漏洞。

装置和应用办法如下:

$ go install golang.org/x/vuln/cmd/govulncheck@latest
$ govulncheck ./...

govulncheck是一个独立的工具,可能会频繁更新和迭代。Go 平安团队对于 govulncheck 的长期打算是把该工具集成到 Go 的公布版本里。

备注:

  • golang.org/x下所有 package 的源码独立于 Go 源码的骨干分支,也不在 Go 的二进制安装包里。如果须要应用 golang.org/x 下的 package,能够应用 go get 来装置。govulncheck工具就属于这种状况。
  • golang.org/x/exp下的所有 package 都属于试验性质或者被废除的 package,不倡议应用。

golang.org/x/vuln 这个仓库里蕴含有 3 个次要模块:

  • vulncheck 包。为了不便把 govulncheck 的破绽检测性能集成给其它工具或服务,vulncheck 里把 govulncheck 的性能进行了封装,在 vulncheck 这个 package 里提供了相应的 Go 函数,能够被间接调用。
  • govulncheck命令。是命令行工具,对 vulncheck 包里破绽检测性能做了封装。
  • client 包。该 package 封装了一个用于和 Go 破绽数据库交互的 client。

集成

为了不便 Go 开发者更早和更好地理解到破绽信息,Go 团队把破绽检测也集成到了 Go 的工具链和服务里。

例如,大家能够在 package.go.dev 网站的版本破绽页面查看到 golang.org/text 这个 package 各个版本的安全漏洞状况。

Go 的 VS Code 扩大插件对于 govulncheck 的反对也很快就能够公布。

总结

  • 具体的 govulncheck 命令应用阐明参考:官网文档。
  • 目前 govulncheck 也有一些局限性,比方:

    • 扫描二进制文件的安全漏洞时,要求该二进制文件必须是应用 Go 1.18 或者更高版本编译的,不反对对低版本编译的二进制文件进行安全漏洞扫描。
    • 对于函数指针和接口 (interface) 调用的剖析比拟激进,在某些状况下可能导致误报破绽。
    • govulncheck不可能展现 Go 二进制文件里扫描进去的安全漏洞的调用图(call graph),这是因为 Go 二进制文件并不蕴含具体的调用链信息。对于二进制文件里的代码也可能产生误报。
    • 只会报告 govulncheck 以后执行的 Go 编译环境和配置 (GOOS/GOARCH) 下的破绽。例如,

      • 假如一个破绽如果只在 Linux 下才有,那在 Windows 下执行 govulncheck 的时候就不会报告该破绽。对于跨平台开发的我的项目,比方 Windows 下开发,理论部署在 Linux 上,那就可能导致开发环境下不能检测出破绽。
      • 假如 Go 1.18 规范库里才有的破绽,如果以后执行 govulncheck 所在的编译环境的 Go 版本是 1.19,那也不会报告该破绽。

更多对于 govulncheck 的限度,能够参考 govulncheck limitations。

开源地址

文章和示例代码开源在 GitHub: Go 语言高级、中级和高级教程。

公众号:coding 进阶。关注公众号能够获取最新 Go 面试题和技术栈。

集体网站:Jincheng’s Blog。

知乎:无忌。

References

  • https://go.dev/blog/vuln
  • https://go.dev/security/vuln/
  • https://go.dev/security/vuln/…
  • https://pkg.go.dev/golang.org…
退出移动版