SuperAPI AI 工具集

go-dependency-audit

安全与审计

查看项目

更新于 10-15 13:58

技能介绍

用途

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 .

2. go.mod 卫生

  • 检查未使用依赖:
    • go mod tidy
    • git 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),需自行安装。