关于 go-dependency-audit
go-dependency-audit 是供 Go 开发者评估依赖风险和模块规范的技能,涵盖漏洞扫描、版本与校验和检查、依赖评估及审计报告。
主要功能
- 01使用 govulncheck、Nancy 和 Trivy 扫描依赖
- 02检查 go.mod 规范和模块校验和
- 03评估维护情况、许可证、体积和 API 稳定性
- 04查看版本及传递依赖关系图
- 05生成结构化依赖审计报告
适用场景
- 01添加依赖前检查 Go 项目
- 02查找直接和传递模块中的已知漏洞
- 03发布前审查项目依赖
- 04评估拟议的模块更新
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ eduardo-sl/ go-agent-skills --skill go-dependency-audit安装后在 Claude Code 中输入/go-dependency-audit确认已加载。
详细介绍
Go 依赖项审计
你添加的每个依赖项,都是你无法掌控、却需要为之负责的代码。 务必严格审计。
1. 漏洞扫描
govulncheck(官方 Go 工具):
# Install
go install golang.org/x/vuln/cmd/govulncheck@latest
# Scan project
govulncheck ./...
# Scan binary
govulncheck -mode=binary ./cmd/api-server
govulncheck 会检查 Go 漏洞数据库,并且只报告实际影响代码路径的漏洞,而不只是那些你从未调用过的传递依赖项。
在 CI 中运行。绝无例外。
其他扫描:
# Nancy (Sonatype OSS Index)
go list -json -deps ./... | nancy sleuth
# Trivy (container + deps)
trivy fs --scanners vuln .
2. go.mod 卫生
检查未使用的依赖项:
go mod tidy
git diff go.mod go.sum # any changes = deps were stale
每次提交前都必须运行 go mod tidy。将其添加到 CI:
go mod tidy
git diff --exit-code go.mod go.sum
不要在已提交代码中使用 replace 指令:
// ❌ Bad — committed replace directive
replace github.com/foo/bar => ../local-bar
// ✅ Acceptable — in monorepos with workspace
// go.work handles this instead
例外:为修复 Bug 临时使用 replace,并附上注释和关联的问题链接:
// 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 个月内?是否积极响应问题? |
| 受欢迎程度 | 星标数和分支数本身毫无意义。关键在于它是否用于生产项目。 |
| 许可证 | 是否与项目兼容?优先选择 MIT/Apache/BSD。 |
| 大小 | 是否为了一个函数就引入 50 个传递依赖项? |
| 替代方案 | 能否用标准库在 50 行以内实现? |
| API 稳定性 | 是否已达到 v1+?是否遵循语义化版本?是否频繁发生破坏性变更? |
| 测试覆盖率 | 项目是否有有意义的测试? |
标准库问题:
Go 标准库非常出色。添加依赖项之前,请先问:
“我能否使用 net/http、encoding/json、database/sql、
text/template、crypto/*、os/exec 等解决这个问题?”
如果可以,且代码少于 100 行,就自己编写。
4. 模块版本审计
列出所有依赖项及其版本:
go list -m all
检查是否有可用更新:
go list -m -u all # shows available updates
升级策略:
# Update specific module
go get github.com/foo/bar@latest
# Update all direct deps (minor/patch only)
go get -u ./...
# Update all deps including major versions (dangerous)
go get -u -t ./...
更新后务必运行完整测试套件:
go get github.com/foo/[email protected]
go mod tidy
go test -race ./...
5. 传递依赖项分析
# Why is this module in my dependency tree?
go mod why github.com/some/transitive-dep
# Full dependency graph
go mod graph
# Visual dependency graph (with modgraphviz)
go mod graph | modgraphviz | dot -Tpng -o deps.png
留意:
- 🔴 存在已知 CVE 的传递依赖项
- 🔴 已弃用的传递依赖项(2 年以上没有提交)
- 🟡 菱形依赖冲突(同一模块有两个版本)
- 🟡 过于庞大的传递依赖树(例如日志库引入 gRPC)
6. Go 版本管理
// go.mod
module github.com/myorg/myproject
go 1.22 // minimum Go version required
规则:
- 将
go指令设为支持所用功能的最低版本。 toolchain指令(Go 1.21+)会固定确切的工具链版本。- 在 CI 中针对多个 Go 版本进行测试(至少包括当前版本和前一个版本)。
7. 推荐与避免使用
维护良好、经过生产环境验证的软件包:
| 领域 | 软件包 |
|---|---|
| 日志记录 | go.uber.org/zap、log/slog(stdlib 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阶段 3 年以上的软件包
审计输出格式
## Dependency Audit Report
**Module:** github.com/myorg/myproject
**Go version:** 1.22
**Direct deps:** N | **Indirect deps:** M
### 🔴 Vulnerabilities
- CVE-XXXX-YYYY in github.com/foo/[email protected] — upgrade to v1.2.5
### 🟡 Outdated Dependencies
- github.com/foo/bar v1.2.3 → v1.5.0 available (minor)
### 🟢 Observations
- go.mod is clean, no replace directives
- All deps actively maintained
评论
支持 Markdown