你正在使用的Go版本是(go version
)?
$ go version
1.17
这个问题在最新版本中是否重现?
是的
你做了什么?
- 为一个模块打上标签,例如
example.com/m@v0.1.0
。 - 在另一个模块中设置
GOPROXY=direct
、GOSUMDB=off
和go get example.com/m@v0.1.0
。这将下载版本到缓存中,而不通知proxy.golang.org
或sum.golang.org
,并将一个和添加到go.sum
。 - 更改一些内容并更新版本标签指向新的变化。
- 清除
GOPROXY
和GOSUMDB
。 - 运行
go mod verify
,观察不到安全错误。 - 用
go clean -modcache
清理模块缓存。 - 运行
go list all
或其他任何会下载修改后的版本的命令,观察到安全错误。
https://github.com/jayconrod/noverify 是一个示例仓库。github.com/jayconrod/noverify@v0.1.0
被修改,github.com/jayconrod/noverify/sum
是依赖模块。
你期望看到什么?
第一个 go mod verify
命令应该报告安全错误。对于构建列表中未与 GOPRIVATE
或 GONOSUMDB
(即每个公开可用的模块)匹配的每个模块(即每个公开可用的模块), go mod verify
应该检查下载模块的哈希值和 go.sum
中的哈希值与 GOSUMDB
中的校验和数据库进行比较,假设它没有被禁用。
在这种情况下,那个哈希值不会在校验和数据库中,查找应该导致 sum.golang.org
从其来源获取 example.com/m@v0.1.0
并返回修改后版本的和。 go mod verify
然后会报告安全错误,因为那个和将与依赖模块的 go.sum
中的原始和不匹配。如果 sum.golang.org
返回任何错误响应(最常见的是404或410)或不可用, go mod verify
也应该报告安全错误。
这对于确定当 go.sum
和模块缓存的内容与公开可用版本不匹配时非常重要。处于这种情况的人会看到他们的构建工作正常,但其他开发者和 CI 构建的构建会失败。 go mod verify
只检查 go.sum
是否与模块缓存的内容匹配。它只有在需要下载未缓存的内容时才会咨询校验和数据库。
你看到了什么?go mod verify
在第5步报告没有安全错误。
4条答案
按热度按时间e1xvtsh31#
https://golang.org/cl/345189提到了这个问题:
cmd/go/internal/modcmd: check hashes in go.sum against GOSUMDB
ccrfmcuu2#
这是1.18里程碑的内容;现在要转向1.19了吗?谢谢。
vltsax253#
这个问题标记为1.19版本。它只是在里程碑中不断推进。是否应该将其移动到Backlog?谢谢。
pzfprimi4#
是否有任何解决方法的说明,我们可以请求值并自行验证?
当我们今天看到冲突时,很高兴看到gosumdb会说什么
回答自己的问题:
(来自: https://github.com/goproxyio/goproxy.io/blob/master/content/docs/GOSUMDB-env.md )