前言
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,那也不会报告该破绽。
- 假如一个破绽如果只在Linux下才有,那在Windows下执行
更多对于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...