mcpField
G
go-dependency-audit

go-dependency-audit

github.com/eduardo-sl安全8395 次安装2 周前更新
代码仓库

关于 go-dependency-audit

go-dependency-audit 是供 Go 开发者评估依赖风险和模块规范的技能,涵盖漏洞扫描、版本与校验和检查、依赖评估及审计报告。

主要功能

  1. 01使用 govulncheck、Nancy 和 Trivy 扫描依赖
  2. 02检查 go.mod 规范和模块校验和
  3. 03评估维护情况、许可证、体积和 API 稳定性
  4. 04查看版本及传递依赖关系图
  5. 05生成结构化依赖审计报告

适用场景

  1. 01添加依赖前检查 Go 项目
  2. 02查找直接和传递模块中的已知漏洞
  3. 03发布前审查项目依赖
  4. 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
UUIDgithub.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