前言
Go安全團(tuán)隊(duì)在2022.09.06發(fā)布了全新的漏洞檢測工具govulncheck
,可以幫助我們發(fā)現(xiàn)Go程序里的安全漏洞。
本文詳細(xì)介紹該工具目前的現(xiàn)狀以及接下來的功能規(guī)劃。
Go漏洞檢測系統(tǒng)架構(gòu)
上圖是Go安全團(tuán)隊(duì)對于Go代碼漏洞檢測的系統(tǒng)架構(gòu)圖。
- 第1步,漏洞采集。Go安全團(tuán)隊(duì)會采集眾多漏洞數(shù)據(jù)庫,包括公開的漏洞數(shù)據(jù)庫(例如National Vulnerability Database (NVD)和 GitHub Advisory Database)、社區(qū)反饋的Go package漏洞以及Go團(tuán)隊(duì)修復(fù)過的安全漏洞等。
- 第2步:更新Go的漏洞數(shù)據(jù)庫。對于第1步里收集到的安全漏洞,Go安全團(tuán)隊(duì)會出具評估報(bào)告,對報(bào)告的漏洞做評審,如果確認(rèn)是需要處理的會進(jìn)入到Go的漏洞數(shù)據(jù)庫里。這些漏洞存儲的按照 Open Source Vulnerability (OSV) format 格式進(jìn)行存儲,并且可以通過API獲取到。
- 第3步:工具集成。對于新的漏洞處理后,會相應(yīng)更新 pkg.go.dev 上的漏洞說明以及發(fā)布漏洞檢測工具 govulncheck的新版本。
govulncheck
可以分析掃描你的代碼倉庫,只展示那些真正影響到你程序執(zhí)行的漏洞。govulncheck
工具非??煽浚苌僬`報(bào),可以幫助你快速發(fā)現(xiàn)一些已知的安全漏洞。
Go漏洞數(shù)據(jù)庫
Go安全團(tuán)隊(duì)維護(hù)了一個(gè)漏洞數(shù)據(jù)庫,地址是https://vuln.go.dev,也就是上面第2步所說的漏洞數(shù)據(jù)庫。
- 如果你發(fā)現(xiàn)了新漏洞,可以通過這個(gè)安全漏洞鏈接報(bào)告漏洞。
- 如果你認(rèn)為已有的漏洞報(bào)告描述有問題,可以在這個(gè)鏈接進(jìn)行反饋。
Go的漏洞數(shù)據(jù)庫里包含的漏洞,可以在這個(gè)鏈接地址pkg.go.dev/vuln進(jìn)行查看。
govulncheck
全新的govulncheck 命令可以幫助你發(fā)現(xiàn)代碼里的安全漏洞。
安裝和使用方法如下:
$ go install golang.org/x/vuln/cmd/govulncheck@latest
$ govulncheck ./...
govulncheck
是一個(gè)獨(dú)立的工具,可能會頻繁更新和迭代。Go安全團(tuán)隊(duì)對于govulncheck
的長期計(jì)劃是把該工具集成到Go的發(fā)布版本里。
備注:
-
golang.org/x
下所有package的源碼獨(dú)立于Go源碼的主干分支,也不在Go的二進(jìn)制安裝包里。如果需要使用golang.org/x
下的package,可以使用go get
來安裝。govulncheck
工具就屬于這種情況。 -
golang.org/x/exp
下的所有package都屬于實(shí)驗(yàn)性質(zhì)或者被廢棄的package,不建議使用。
golang.org/x/vuln這個(gè)倉庫里包含有3個(gè)主要模塊:
-
vulncheck 包。為了方便把
govulncheck
的漏洞檢測功能集成給其它工具或服務(wù),vulncheck 里把govulncheck
的功能進(jìn)行了封裝,在vulncheck
這個(gè)package里提供了相應(yīng)的Go函數(shù),可以被直接調(diào)用。 -
govulncheck
命令。是命令行工具,對vulncheck
包里漏洞檢測功能做了封裝。 - client包。該package封裝了一個(gè)用于和Go漏洞數(shù)據(jù)庫交互的client。
集成
為了方便Go開發(fā)者更早和更好地了解到漏洞信息,Go團(tuán)隊(duì)把漏洞檢測也集成到了Go的工具鏈和服務(wù)里。
例如,大家可以在package.go.dev
網(wǎng)站的版本漏洞頁面查看到golang.org/text
這個(gè)package各個(gè)版本的安全漏洞情況。
Go的VS Code擴(kuò)展插件對于govulncheck
的支持也很快就可以發(fā)布。
總結(jié)
-
詳細(xì)的
govulncheck
命令使用說明參考:官方文檔。 -
目前
govulncheck
也有一些局限性,比如:- 掃描二進(jìn)制文件的安全漏洞時(shí),要求該二進(jìn)制文件必須是使用Go 1.18或者更高版本編譯的,不支持對低版本編譯的二進(jìn)制文件進(jìn)行安全漏洞掃描。
-
對于函數(shù)指針和接口(interface)調(diào)用的分析比較保守,在某些情況下可能導(dǎo)致誤報(bào)漏洞。
-
govulncheck
不能夠展示Go二進(jìn)制文件里掃描出來的安全漏洞的調(diào)用圖(call graph),這是因?yàn)镚o二進(jìn)制文件并不包含詳細(xì)的調(diào)用鏈信息。對于二進(jìn)制文件里的代碼也可能發(fā)生誤報(bào)。 -
只會報(bào)告
govulncheck
當(dāng)前執(zhí)行的Go編譯環(huán)境和配置(GOOS/GOARCH)下的漏洞。例如,- 假設(shè)一個(gè)漏洞如果只在Linux下才有,那在Windows下執(zhí)行
govulncheck
的時(shí)候就不會報(bào)告該漏洞。對于跨平臺開發(fā)的項(xiàng)目,比如Windows下開發(fā),實(shí)際部署在Linux上,那就可能導(dǎo)致開發(fā)環(huán)境下不能檢測出漏洞。 - 假設(shè)Go 1.18標(biāo)準(zhǔn)庫里才有的漏洞,如果當(dāng)前執(zhí)行
govulncheck
所在的編譯環(huán)境的Go版本是1.19,那也不會報(bào)告該漏洞。
- 假設(shè)一個(gè)漏洞如果只在Linux下才有,那在Windows下執(zhí)行
更多關(guān)于govulncheck
的限制,可以參考govulncheck limitations。
開源地址
文章和示例代碼開源在GitHub: Go語言初級、中級和高級教程。
公眾號:coding進(jìn)階。
個(gè)人網(wǎng)站:Jincheng’s Blog。文章來源:http://www.zghlxwxcb.cn/news/detail-620884.html
知乎:無忌。文章來源地址http://www.zghlxwxcb.cn/news/detail-620884.html
References
- https://go.dev/blog/vuln
- https://go.dev/security/vuln/
- https://go.dev/security/vuln/database
- https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck
到了這里,關(guān)于Go的全新漏洞檢測工具govulncheck來了的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!