govulncheck 是 Go 官方推荐的漏洞扫描工具,但默认不递归检查间接依赖,必须加 -deps 参数才能覆盖 70% 以上隐藏漏洞;配合 go.sum 提交、CI 中结构化输出与非零退出判断,才能真正落地安全管控。

go.mod 里依赖版本不等于安全,得靠工具主动查
Go 的 go.mod 只管版本号,不管这个版本有没有已知漏洞。比如 golang.org/x/crypto v0.17.0 有 CVE-2023-45833,但 go mod tidy 不会拦你——它只认语义版本,不认 CVE。真正要发现这类问题,必须引入外部扫描工具,且不能只跑一次。
govulncheck 是官方推荐,但默认不递归扫描间接依赖
Go 官方的 govulncheck 能对接 osv.dev 数据库,但它默认只检查直接 import 的包。而多数高危漏洞藏在间接依赖里(比如通过 github.com/gorilla/mux 引入的旧版 net/http 补丁缺失)。必须加 -deps 参数才生效:
govulncheck -deps ./...
常见错误是只跑 govulncheck ./...,结果漏掉 70% 以上漏洞。CI 中建议固定写成:
govulncheck -deps -format=json ./... > vuln-report.json- 配合
jq '.Results | length == 0'做非零退出判断 - 避免用
-v(verbose)模式输出到 stdout,CI 日志里难提取结构化结果
trivy scan --security-checks vuln 要配 go.sum 才准
trivy 对 Go 项目扫描时,默认行为是解析 go.mod + go.sum,但若 go.sum 缺失或未提交,它会 fallback 到模糊匹配(基于模块名和版本号查 CVE),误报率高、漏报多。真实生产环境必须确保:
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
立即学习“go语言免费学习笔记(深入)”;
-
go.sum已提交 Git,且 CI 中执行过go mod verify - 扫描命令显式指定语言:
trivy fs --security-checks vuln --scanners vuln --format json -o trivy-report.json . - 不要用
trivy repo扫本地目录——它会跳过go.sum校验,改用启发式匹配 - 若项目含 replace 或 indirect 依赖,trivy 0.45+ 版本才支持完整解析,旧版建议升级
CI 流水线里别让扫描“静默失败”
很多团队把 govulncheck 或 trivy 加进 CI,却没设失败阈值,导致漏洞报告出来但没人看。关键控制点是:
- 用
--ignore-policy或--severity显式过滤:例如trivy ... --severity CRITICAL,HIGH - 扫描结果必须生成文件(如
vuln-report.json),再由后续步骤读取并判断是否含"Vulnerabilities"字段 - 禁止用
|| true吞掉非零退出码——这是最常被忽略的配置陷阱 - 若用 GitLab CI,记得在
artifacts中保留报告,否则流水线结束后无法回溯
间接依赖的漏洞往往出现在你没 import 的地方,但 runtime 会加载;go.sum 不校验漏洞,只校验哈希;扫描工具不报错 ≠ 没问题,得看它到底扫了哪些依赖、用了哪份校验数据。

















