上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 的使用方法,govulncheck 强大功能的背后,离不开 Go 漏洞数据库(Go vulnerability database)的支持,接下来详细讲解下 Go 漏洞数据库相关的知识。
在当今数字化的世界中,软件安全是至关重要的。随着 Golang 在开发领域的日益流行,Go 项目的安全性也越来越重要。为了帮助开发者及时发现和解决与 Golang 相关的安全漏洞,Go 漏洞数据库应运而生。
Go 漏洞数据库(Go vulnerability database),访问地址是 https://vuln.go.dev 或者 https://pkg.go.dev/vuln,是一个存储 Golang 安全漏洞信息的数据库,由 Golang 官方维护。漏洞信息数据来自现有的源,例如 cve、ghsa 和 Go 包维护者直接提交的漏洞报告等,这些信息随后由 Go 安全团队审核并添加到数据库中。
该数据库支持多数据源访问,提供访问漏洞数据源的接口和默认实现。漏洞项使用 OSV(Open Source Vulnerability format)格式存储和传输。开发人员可以基于 module 的路径或者 ID 从漏洞数据库中查找是否存在已知漏洞。
Go 漏洞数据库提供基于 HTTP 协议,请求方式为 GET 的一系列接口,每个接口都是返回 JSON 类型的数据。
示例如下:
$ curl https://vuln.go.dev/index/db.json
{"modified":"2023-08-23T14:38:50Z"}
示例如下:
$ curl https://vuln.go.dev/index/modules.json
[ {
// The module path.
"path": string,
// The vulnerabilities that affect this module.
"vulns":
[ {
// The vulnerability ID.
"id": string,
// The latest time the vulnerability should be considered
// to have been modified, as an RFC3339-formatted UTC
// timestamp ending in "Z".
"modified": string,
// (Optional) The module version (in SemVer 2.0.0 format)
// that contains the latest fix for the vulnerability.
// If unknown or unavailable, this should be omitted.
"fixed": string,
} ]
} ]
示例如下:
$ curl https://vuln.go.dev/index/vulns.json
[ {
// The vulnerability ID.
"id": string,
// The latest time the vulnerability should be considered
// to have been modified, as an RFC3339-formatted UTC
// timestamp ending in "Z".
"modified": string,
// A list of IDs of the same vulnerability in other databases.
"aliases": [ string ]
} ]
示例如下:
$ curl https://vuln.go.dev/ID/GO-2023-2003.json
{
"schema_version": "1.3.1",
"id": "GO-2023-2003",
"modified": "2023-08-10T22:06:06Z",
"published": "2023-08-10T22:06:06Z",
"aliases": [
"GHSA-8c37-7qx3-4c4p"
],
"summary": "Blst fails to perform group signature validation",
"details": "When complemented with a check for infinity, blst skips performing a signature group-check. Formally speaking, infinity is the identity element of the elliptic curve group and as such it is a member of the group, so the group-check should be performed. The fix performs the check even in the presence of infinity.",
"affected": [
{
"package": {
"name": "github.com/supranational/blst",
"ecosystem": "Go"
},
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0.3.0"
},
{
"fixed": "0.3.11"
}
]
}
],
"ecosystem_specific": {
"imports": [
{
"path": "github.com/supranational/blst/bindings/go",
"symbols": [
"P1Affine.SigValidate",
"P2Affine.SigValidate"
]
}
]
}
}
],
"references": [
{
"type": "FIX",
"url": "https://github.com/supranational/blst/commit/fb91221c91c82f65bfc7f243256308977a06d48b"
},
{
"type": "WEB",
"url": "https://github.com/supranational/blst/releases/tag/v0.3.11"
}
],
"credits": [
{
"name": "Yunjong Jeong (@blukat29)"
}
],
"database_specific": {
"url": "https://pkg.go.dev/vuln/GO-2023-2003"
}
}
govulncheck 使用的漏洞数据地址是 https://vuln.go.dev,可以使用 -db 参数指定漏洞数据库,支持 http://、https:// 和 file:// 协议。指定的漏洞数据库必须实现上面讲解的几个 API。govulncheck 命令在从 http 源读取时使用 “.json.gz” 端点,而从文件源读取时,使用 “json”端点。