`cmd/go: go mod verify`应该检查`go.sum`中的哈希值与`GOSUMDB`是否匹配,

ljsrvy3e  于 6个月前  发布在  Go
关注(0)|答案(4)|浏览(44)

你正在使用的Go版本是(go version)?

$ go version
1.17

这个问题在最新版本中是否重现?
是的

你做了什么?

  1. 为一个模块打上标签,例如 example.com/m@v0.1.0
  2. 在另一个模块中设置 GOPROXY=directGOSUMDB=offgo get example.com/m@v0.1.0 。这将下载版本到缓存中,而不通知 proxy.golang.orgsum.golang.org ,并将一个和添加到 go.sum
  3. 更改一些内容并更新版本标签指向新的变化。
  4. 清除 GOPROXYGOSUMDB
  5. 运行 go mod verify ,观察不到安全错误。
  6. go clean -modcache 清理模块缓存。
  7. 运行 go list all 或其他任何会下载修改后的版本的命令,观察到安全错误。
    https://github.com/jayconrod/noverify 是一个示例仓库。 github.com/jayconrod/noverify@v0.1.0 被修改, github.com/jayconrod/noverify/sum 是依赖模块。

你期望看到什么?
第一个 go mod verify 命令应该报告安全错误。对于构建列表中未与 GOPRIVATEGONOSUMDB (即每个公开可用的模块)匹配的每个模块(即每个公开可用的模块), 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步报告没有安全错误。

e1xvtsh3

e1xvtsh31#

https://golang.org/cl/345189提到了这个问题:cmd/go/internal/modcmd: check hashes in go.sum against GOSUMDB

ccrfmcuu

ccrfmcuu2#

这是1.18里程碑的内容;现在要转向1.19了吗?谢谢。

vltsax25

vltsax253#

这个问题标记为1.19版本。它只是在里程碑中不断推进。是否应该将其移动到Backlog?谢谢。

pzfprimi

pzfprimi4#

是否有任何解决方法的说明,我们可以请求值并自行验证?
当我们今天看到冲突时,很高兴看到gosumdb会说什么
回答自己的问题:

$ curl https://goproxy.io/sumdb/sum.golang.org/lookup/github.com/gorilla/mux@v1.7.1

(来自: https://github.com/goproxyio/goproxy.io/blob/master/content/docs/GOSUMDB-env.md )

相关问题