用途
go-dependency-audit 用于审计 Go 模块依赖,核心目标是发现过时包、已知漏洞、go.mod 卫生问题、未使用或冗余依赖,并评估依赖质量。它强调“每个依赖都是你不控制但需要负责的代码”,主张严格审计。
主要能力
1. 漏洞扫描
- 使用官方工具 govulncheck:
- 安装:
go install golang.org/x/vuln/cmd/govulncheck@latest - 扫描项目:
govulncheck ./... - 扫描二进制:
govulncheck -mode=binary ./cmd/api-server - 说明:govulncheck 对照 Go 漏洞数据库,只报告实际影响代码路径的漏洞,而非从未调用的传递依赖。建议在 CI 中运行。
- 安装:
- 其他扫描工具:
- Nancy(Sonatype OSS Index):
go list -json -deps ./... | nancy sleuth - Trivy(容器 + 依赖):
trivy fs --scanners vuln .
- Nancy(Sonatype OSS Index):
2. go.mod 卫生
- 检查未使用依赖:
go mod tidygit diff go.mod go.sum(有变化说明依赖已过时)- 每次提交前必须运行 go mod tidy,CI 中可加:
go mod tidy后git diff --exit-code go.mod go.sum
- 提交代码中不应有 replace 指令:
- 坏例子:
replace github.com/foo/bar => ../local-bar - 可接受:monorepo 中使用 go.work 处理
- 例外:临时 replace 修复 bug,需注释并链接 issue,例如:
// TODO(#1234): remove after upstream merges fix后接replace github.com/foo/bar => github.com/myorg/bar v0.0.0-fix
- 坏例子:
- 校验校验和:
go mod verify,确认下载模块与预期校验和匹配,失败表示供应链篡改。
3. 依赖评估标准
添加任何依赖前评估:
- 维护:最后提交 < 6 个月?issue 响应活跃?
- 流行度:仅 stars/forks 无意义,生产项目中的使用更重要。
- 许可证:与项目兼容?优先 MIT/Apache/BSD。
- 大小:是否为一个函数引入 50 个传递依赖?
- 替代方案:能否用标准库在 < 50 行内完成?
- API 稳定性:是否 v1+?遵循 semver?频繁破坏性变更?
- 测试覆盖:项目是否有有意义的测试?
- 标准库问题:Go 标准库优秀,添加依赖前问“能否用 net/http、encoding/json、database/sql、text/template、crypto/*、os/exec 等解决?”如果答案是能且代码 < 100 行,自己写。
4. 模块版本审计
- 列出所有依赖及版本:
go list -m all - 检查可用更新:
go list -m -u all - 升级策略:
- 更新特定模块:
go get github.com/foo/bar@latest - 更新所有直接依赖(仅 minor/patch):
go get -u ./... - 更新所有依赖包括 major 版本(危险):
go get -u -t ./...
- 更新特定模块:
- 更新后始终运行完整测试:
go get github.com/foo/bar@v1.5.0、go mod tidy、go test -race ./...
5. 传递依赖分析
- 为什么某模块在依赖树中:
go mod why github.com/some/transitive-dep - 完整依赖图:
go mod graph - 可视化依赖图(需 modgraphviz):
go mod graph | modgraphviz | dot -Tpng -o deps.png - 注意:
- 🔴 有已知 CVE 的传递依赖
- 🔴 被遗弃的传递依赖(2 年以上无提交)
- 🟡 菱形依赖冲突(同一模块两个版本)
- 🟡 过大的传递树(一个日志库引入 gRPC)
6. Go 版本管理
- go.mod 中:
go 1.22表示最低 Go 版本要求。 - 规则:
- go 指令设为支持所用功能的最低版本。
- toolchain 指令(Go 1.21+)固定确切工具链版本。
- CI 中针对多个 Go 版本测试(至少当前和上一个)。
7. 推荐与避免
- 维护良好、生产验证的包:
- 日志:go.uber.org/zap、log/slog(标准库 1.21+)
- HTTP 路由:github.com/go-chi/chi、net/http(1.22+ 路由)
- 配置:github.com/caarlos0/env、github.com/spf13/viper
- 测试:github.com/stretchr/testify、标准库 testing
- 数据库:github.com/jackc/pgx、github.com/jmoiron/sqlx
- 验证:github.com/go-playground/validator
- UUID:github.com/google/uuid
- 错误:go.uber.org/multierr、标准库 errors(1.20+)
- 避免的模式:
- ❌ 接管 main() 的框架(Go 不是 Java Spring)
- ❌ 隐藏 SQL 的 ORM(优先 sqlx 或原生 database/sql)
- ❌ 你不理解的代码生成器
- ❌ 已 v0.x 超过 3 年的包
使用方式
该技能以指南形式提供命令和检查清单,可在开发流程或 CI 中执行。典型步骤包括:运行 govulncheck 扫描漏洞、执行 go mod tidy 并检查差异、使用 go mod verify 校验、通过 go list -m -u all 检查更新、用 go mod why 和 go mod graph 分析传递依赖,最后按提供的审计报告格式输出结果。
适用场景
- Go 项目提交前或 CI 中的依赖安全与健康检查。
- 评估是否引入新依赖。
- 升级依赖版本前后的审计。
- 排查传递依赖中的漏洞或冗余。
限制
资料未提供该技能的具体安装方式、运行环境要求、是否收费、价格、平台支持或效果保证。部分命令依赖外部工具(如 Nancy、Trivy、modgraphviz、dot),需自行安装。