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

大家好,我是煎鱼。

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

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

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

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

govulncheck 是什么

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

以下是 govulncheck 的架构图:

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

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

最简 Demo

准备有缺陷的项目

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

go 复制代码
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)
		}
	}
}

拉取相关依赖:

vbnet 复制代码
$ 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。这个版本存在已知的问题:

vbnet 复制代码
$ 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 复制代码
$ 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

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

yaml 复制代码
$ 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 项目,在根目录执行如下命令:

vbnet 复制代码
➜  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,告知了具体的原因、触发函数、发现的版本和修复的版本(方式):

bash 复制代码
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,建议升级更新的版本:

bash 复制代码
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 是有一个安全团队,由 @Julie Qiu 带队。她的个人 About:

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

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

总结

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

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

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

Go 图书系列

推荐阅读

相关推荐
研究司马懿6 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大20 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘1 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤1 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo