likes
comments
collection
share

Go 官方新玩具:漏洞管理和扫描,看看自己项目有没有坑?

作者站长头像
站长
· 阅读数 12

大家好,我是煎鱼。

业务系统的安全问题一直是各企业的 “头号” 问题(被发现时)。不知道有多少读者朋友们经历了刚刚结束的 HW 行动。

最近发现有厂商已经可以对 Go 开始做检测了,这又是一大进步。

这不,最近发现 Go 官方自己推出了新的工具,作用是漏洞管理,告诉你已报告的漏洞,并告知你应该如何升级到什么版本。

Go 官方新玩具:漏洞管理和扫描,看看自己项目有没有坑?

今天这篇文章就是分享这个安全工具。前置的版本要求是:Go >= 1.18。

govulncheck 是什么

Go 安全团队在 2022 年 9 月,正式推出了 govulncheck 工具,可以根据背后的 Go 漏洞数据库去分析 Go 代码,对已知的问题发出警告,提醒开发者进行修复。

以下是 govulncheck 的架构图:

Go 官方新玩具:漏洞管理和扫描,看看自己项目有没有坑?

Go 漏洞管理由以下几个部分组成:

  • 数据源来自各个来源,例如:National Vulnerability Database (NVD)、GitHub Advisory Database,以及直接从 Go 软件包维护者处收集。
  • 漏洞数据库会基于上述第一点来做数据录入,所有的报告均由 Go Security 团队审核和整理。报告采用开源漏洞(OSV)格式,可通过 API 访问。
  • pkg.go.dev 与 govulncheck 集成,让开发人员能发现项目中的漏洞。

最简 Demo

准备有缺陷的项目

根据 Go 官方的示例,我们需要模拟一个例子来验证安全功能。创建一个 Go 项目 vuln-tutorial,写入如下代码:

import (
	...
	"golang.org/x/text/language"
)

func main() {
	for _, arg := range os.Args[1:] {
		tag, err := language.Parse(arg)
		if err != nil {
			fmt.Printf("%s: error: %v\n", arg, err)
		} else if tag == language.Und {
			fmt.Printf("%s: undefined\n", arg)
		} else {
			fmt.Printf("%s: tag %s\n", arg, tag)
		}
	}
}

拉取相关依赖:

$ go mod tidy 
go: finding module for package golang.org/x/text/language
go: downloading golang.org/x/text v0.13.0
go: found golang.org/x/text/language in golang.org/x/text v0.13.0

将 golang.org/x/text 版本降级至 v0.3.5。这个版本存在已知的问题:

$ go get golang.org/x/text@v0.3.5
go: downloading golang.org/x/text v0.3.5
go: downgraded golang.org/x/text v0.13.0 => v0.3.5

快速运行 govulncheck

安装 govulncheck:

$ go install golang.org/x/vuln/cmd/govulncheck@latest
go: downloading golang.org/x/vuln v1.0.1
go: downloading golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846
go: downloading golang.org/x/sys v0.11.0

对比一下,查看是否正常:

$ govulncheck -version
Go: go1.20.5
Scanner: govulncheck@v1.0.1
DB: https://vuln.go.dev
DB updated: 2023-09-13 19:45:03 +0000 UTC

No vulnerabilities found.

Share feedback at https://go.dev/s/govulncheck-feedback.

一切就绪,接下来正式开始。

我们回到上一节创建的 vuln-tutorial 项目,在根目录执行如下命令:

➜  vuln-tutorial govulncheck ./...
Scanning your code and 46 packages across 1 dependent module for known vulnerabilities...

Vulnerability #1: GO-2021-0113
    Out-of-bounds read in golang.org/x/text/language
  More info: https://pkg.go.dev/vuln/GO-2021-0113
  Module: golang.org/x/text
    Found in: golang.org/x/text@v0.3.5
    Fixed in: golang.org/x/text@v0.3.7
    Example traces found:
      #1: main.go:12:29: vuln.main calls language.Parse

=== Informational ===

Found 1 vulnerability in packages that you import, but there are no call
stacks leading to the use of this vulnerability. You may not need to
take any action. See https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck
for details.

Vulnerability #1: GO-2022-1059
    Denial of service via crafted Accept-Language header in
    golang.org/x/text/language
  More info: https://pkg.go.dev/vuln/GO-2022-1059
  Module: golang.org/x/text
    Found in: golang.org/x/text@v0.3.5
    Fixed in: golang.org/x/text@v0.3.8

Your code is affected by 1 vulnerability from 1 module.

Share feedback at https://go.dev/s/govulncheck-feedback.

整个输出信息分两大块。

第一块区域是 Vulnerability(漏洞),上述例子的扫描结果是发现了漏洞 #GO-2021-0113,告知了具体的原因、触发函数、发现的版本和修复的版本(方式):

Vulnerability #1: GO-2021-0113
    Out-of-bounds read in golang.org/x/text/language
  More info: https://pkg.go.dev/vuln/GO-2021-0113
  Module: golang.org/x/text
    Found in: golang.org/x/text@v0.3.5
    Fixed in: golang.org/x/text@v0.3.7
    Example traces found:
      #1: main.go:12:29: vuln.main calls language.Parse

第二块区域是 Informational(信息),可以理解为进一步的修复建议。上述例子的建议是基于漏洞 #GO-2022-1059,建议升级更新的版本:

Vulnerability #1: GO-2022-1059
    Denial of service via crafted Accept-Language header in
    golang.org/x/text/language
  More info: https://pkg.go.dev/vuln/GO-2022-1059
  Module: golang.org/x/text
    Found in: golang.org/x/text@v0.3.5
    Fixed in: golang.org/x/text@v0.3.8

当然,这部分是建议修复。因为不存在实际涉及到此漏洞的调用堆栈内容。可能仅是该包的漏洞进行了展示。

最后部分在开头和结尾对本次扫描结果的统计输出和代码行数的描述性输出了。告诉你都扫描和识别了多少内容。

govulncheck 作者是谁

这是一个我比较感兴趣的问题。

因为你看,感觉这个 govulncheck。好像 rsc 也没有出来站台过,Go 核心团队里似乎也没人发过声。但就是出现了。

好在 govulncheck 是 “开源” 的(只是个镜像仓库),项目地址:golang/vuln。我们可以看到一些蛛丝马迹:

Go 官方新玩具:漏洞管理和扫描,看看自己项目有没有坑?

目前 Go 是有一个安全团队,由 @Julie Qiu 带队。她的个人 About:

Go 官方新玩具:漏洞管理和扫描,看看自己项目有没有坑?

相当于是个小组,大概 2~5 个有阶段性大量提交代码。也承担 pkg.go.dev 的相关开发。参与的成员都是 Google 公司的人。与核心团队有职责上的区分。

(Google 为 Go 输送人才...)

总结

Go 近年来感觉加大了对周边生态组件的一些小建设,虽然达不到齐全。但起码有了。本次 Go 安全工具 govulncheck 就是一个很好的开始。

对日常应用程序有安全要求的小伙伴们,也可以将 govulncheck 加入 CI/CD 流程中,自动的扫描识别,按时升级。可以避免一些已知的漏洞风险。

文章持续更新,可以微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blo… 已收录,学习 Go 语言可以看 Go 学习地图和路线,欢迎 Star 催更。

Go 图书系列

推荐阅读