go.sum必须提交至Git,它是依赖完整性校验的唯一依据;不提交会导致CI或新成员构建时出现checksum mismatch或静默加载被篡改依赖,且严禁手动编辑,须由go mod tidy等工具自动更新。

go.sum 必须提交且禁止忽略
不提交 go.sum,防篡改就从第一步失效。它不是可选文件,而是每次构建时校验依赖完整性的唯一依据。Git 仓库里漏掉它,CI 和新同事拉代码后执行 go build 会重新生成一份哈希,和你本地的不一致——结果就是 checksum mismatch 报错,或更糟:静默接受被污染的依赖。
常见错误包括:
- 把 go.sum 加进 .gitignore
- 提交前手动删掉新增行(以为“只是哈希变了”)
- CI 流水线用 go mod tidy -v 后没 git add 就直接构建
正确做法:
- 初始化项目后立即 git add go.mod go.sum
- 每次 go get 或 go mod tidy 后,检查 go.sum 变更是否合理(比如只增不删、新增模块有可信来源)
- 在 CI 中加一步:go mod verify,失败即中断,不靠人眼判断
启用 GOPROXY + GOSUMDB 强制校验链
仅靠本地 go.sum 不够——它只保证“和上次一样”,不保证“上次就是干净的”。必须让 Go 工具链联网比对全球公开校验和数据库(sum.golang.org),否则中间人劫持或私有代理投毒无法识别。
关键配置项必须显式设为安全值:
- GOPROXY=https://proxy.golang.org,direct(避免 fallback 到不可信源)
- GOSUMDB=sum.golang.org(禁用 off 或自建不可信 sumdb)
- GOFLAGS=-mod=readonly(防止 go build 自动改 go.mod 或 go.sum)
验证是否生效:
- 运行 go env GOPROXY GOSUMDB GOFLAGS,确认输出符合预期
- 故意改一个 go.sum 行末尾字符,再执行 go build —— 应报错并提示 “mismatched checksum” 且指向 sum.golang.org 的校验失败信息
vendor 目录不是可选,而是生产环境必需
远程模块仓库下线、网络分区、或上游作者删库,都会让 go mod download 失败。vendor 不是“为了离线”,而是切断构建对外部源的 runtime 依赖,把防篡改控制权收回到代码仓库内。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
操作要点:
- 执行 go mod vendor 后,vendor/ 必须完整提交(含所有子目录和 modules.txt)
- 构建时强制使用 go build -mod=vendor,否则 Go 仍可能绕过 vendor 去拉远程包
- CI 中加检查:git status --porcelain vendor/ 非空则报错——说明有人漏提交 vendor 更新
注意副作用:
- vendor 体积大,但这是换取确定性的代价
- 若用 IDE(如 Goland),需在设置中启用 “Use vendored dependencies” 选项,否则代码跳转会失效
依赖扫描不能只靠 go mod graph
go mod graph 只显示导入路径关系,完全看不出哪些包实际加载了恶意逻辑。真正要防的是潜伏在间接依赖里的 30+ 类型恶意包(如窃取环境变量、上报日志、注入 goroutine)。
立即学习“go语言免费学习笔记(深入)”;
必须组合三类工具:
- govulncheck:官方漏洞扫描,能发现已知 CVE 关联的模块
- golang.org/x/tools/cmd/govulncheck 需搭配 GOVULNCHECK_TOKEN 访问数据库
- go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' ./...:列出所有非标准库依赖,人工审计高风险路径(如 github.com/xxx/xxx 无 star、无更新、作者名可疑)
- 第三方工具如 deps.dev 或 osv.dev API 批量查证模块历史问题
最容易被跳过的动作:
- 每季度运行一次 govulncheck ./... 并存档报告
- 对 // indirect 标记的模块,逐个查其 go.mod 是否含可疑 replace 或不安全的 replace 规则
真正的防篡改不靠单点技术,而靠 go.sum 校验、GOSUMDB 联网比对、vendor 锁死源码、以及定期人工+自动扫描的四层咬合。少一层,攻击者就能从供应链最薄弱处切入。

















