Golang
Golang作为一款近年来最火热的服务端语言之一,深受广大程序员的喜爱,笔者最近也在用,特别是高并发的场景下,golang易用性的优势十分明显,但笔者这次想要介绍的并不是golang本身,而且golang代码的漏洞扫描工具,毕竟作为服务端的程序,安全性一直是一个不同忽视的地方
Go安全团队在2022.09.06发布了全新的漏洞检测工具 govulncheck
,可以帮助开发者发现Go程序里的安全漏洞。
在2023.07.13, govulncheck
终于有了1.0.0的发布版本,在官方文档中https://go.dev/blog/govulncheck
中,一起发布的还有一份官方的安全最佳实践指引 ****:里面包含了以下几个方面:
1.定期扫描源代码和二进制库 ——推荐用govulncheck
2.更新golang版本和依赖库版本
3.通过模糊测试发现边缘情况漏洞**
4.#Go的race detector检查多协程竞争的情况
5.使用Vet命令检查代码潜在的问题
看的出来golang安全团队在这里是下了大的功夫,这里主要介绍下第一个工具:govulncheck
govulncheck
govulncheck介绍
govulncheck是一个命令行工具,帮助Go用户在项目依赖中查找已知的漏洞。该工具可以分析代码库和二进制文件,并通过优先考虑实际调用你代码的函数中的漏洞来减少干扰。
原理
go 安全团队和社区成员共同维护了一个漏洞库 govulndb,收集了从 2018 年推出 go module 后 go 相关的漏洞信息。
这意味着,go vender形式的项目不能使用它
govulncheck 首先会找出代码中使用的模块和包的版本信息,然后通过接口调用漏洞库的最新数据,最后进行数据对比,将受影响的包或模块列举输出。
针对漏洞数据库的来源也有好几个:
1.National Vulnerability Database
( NVD
)
2.GitHub Advisory Database
- 社区反馈
- 官方自己发现的漏洞
通过上面的信息来源,go的安全团队进行分析和评估,把确认有效的放在go漏洞数据库,然后govulncheck会基于这个漏洞数据库进行扫描
这意味着,govulncheck要经常更新漏洞数据库
关于数据库信息
Go漏洞数据库地址https://vuln.go.dev,该数据库提供了关于公共Go模块中已知漏洞的详尽信息,开发者可以在pkg.go.dev/vuln上浏览数据库中的条目
为了提高性能并确保长期的可扩展性。官方更新数据库API。同时,提供了一个实验性工具来生成您自己的漏洞数据库索引,位于golang.org/x/vulndb/cmd/indexdb
关于使用
第一步:安装
go install golang.org/x/vuln/cmd/govulncheck@latest
这里的go版本要跟项目的go版本对应
第二步:增加Path地址
export PATH=$PATH:$GOPATH/bin
第三步:在项目目录下使用:
govulncheck ./...
需要在go.mod同级目录
参数设置:
govulncheck -h
这里主要用到的是
-mode选择二进制文件还是源代码
-json 输出的产物格式
关于集成
1.在Visual Studio Code集成:
参考:https://go.dev/doc/tutorial/govulncheck-ide
2.在CI/CD集成:
参考
2.1.https://semaphoreci.com/blog/govulncheck
2.2.https://github.com/marketplace/actions/golang-govulncheck-action
关于注意的点:
- 二进制文件必须使用1.18或更高版本
- 二进制文件扫描没有调用图
- 在哪编译,在哪扫描,不同平台的扫描结果不同
- 工程使用哪个go版本,就用对应go版本的govulncheck
- 在函数指针和接口(interface)调用的分析、反射调用的分析比较保守,可能会出现误报
6.参考https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck
里面的Limitations
参考资料:
1.https://www.cnblogs.com/lianshuiwuyi/p/17602778.html
2.https://semaphoreci.com/blog/govulncheck
3.https://blog.csdn.net/DisMisPres/article/details/132018530
4.https://zhuanlan.zhihu.com/p/563369267