future-architect/uzomuzo-oss
GitHub: future-architect/uzomuzo-oss
一款开源依赖生命周期治理 CLI,通过多信号决策树检测传统 SCA 工具遗漏的已废弃、停滞和事实停更的依赖包。
Stars: 16 | Forks: 1
# Uzomuzo
[](https://github.com/future-architect/uzomuzo-oss/actions/workflows/ci.yml) [](https://goreportcard.com/report/github.com/future-architect/uzomuzo-oss) [](https://pkg.go.dev/github.com/future-architect/uzomuzo-oss) [](https://github.com/future-architect/uzomuzo-oss/releases/latest) [](LICENSE)
**针对 OSS 供应链的前瞻性生命周期治理。** 能够检测被传统 SCA 工具报告为“0 个漏洞 — 安全”的已被废弃、停滞和实际死亡的依赖项。

## 问题所在:CVE 盲区
标准的 SCA 工具(Trivy、Syft、Snyk)擅长标记已知的 CVE。但它们无法回答:**这个软件包还在维护吗?**
一个今天拥有零个 CVE 的软件包可能已经被废弃多年——没有人在关注新的漏洞,没有人会去修补它们,也没有人会回复安全报告。这些正是供应链攻击的完美目标(xz-utils 2024、event-stream 2018)。
### SCA 遗漏了什么 — EOL-Effective
```
📦 Package: pkg:npm/dicer@0.3.0
⚖️ Result: 🛑 EOL-Effective
💭 Reason: Scorecard data incomplete; open advisories (1) and no human commits > 2 yrs
📦 Latest Stable Release: 0.3.1 (2021-12-19)
↳ Stable Advisories: 1
• [GHSA] GHSA-wm7h-9275-46v2
💻 Latest Commit: 2023-07-15
```
没有官方的弃用声明,也没有归档的代码仓库 —— 然而 `dicer` 存在一个未修补的 ReDoS 漏洞,并且已经超过两年没有任何人工提交。SCA 工具仅仅报告“1 个 CVE”然后就会忽略它。uzomuzo 将未修补的 advisory 加上缺乏维护这种组合识别为 **事实上的生命周期终结**。该软件包位于 Express 的依赖链中(通过 busboy → multer),这意味着数以百万计的应用程序正悄无声息地依赖于废弃的代码。
### 真实扫描示例:OWASP Juice Shop
```
trivy image --format cyclonedx bkimminich/juice-shop:v14.5.1 \
| jq -r '.components[].purl // empty' \
| ./uzomuzo analyze --only-eol
```
```
🏷️ LABEL SUMMARY (1,540 evaluated packages):
🟢 Active: 630 (40.9%)
🔵 Legacy-Safe: 556 (36.1%)
⚪ Stalled: 263 (17.1%)
🔴 EOL-Confirmed: 88 (5.7%)
🛑 EOL-Effective: 3 (0.2%)
```
**59% 的依赖项存在 SCA 工具无法察觉的生命周期隐患。** 请参阅[完整扫描结果](docs/assets/juice-shop-eol-result.txt)。
## 安装说明
### 预编译二进制文件(推荐)
从 [GitHub Releases](https://github.com/future-architect/uzomuzo-oss/releases) 下载最新版本。
### Go install
```
go install github.com/future-architect/uzomuzo-oss@latest
```
### 从源码构建
```
git clone https://github.com/future-architect/uzomuzo-oss.git
cd uzomuzo-oss
go build -o uzomuzo main.go
```
## 快速入门
```
export GITHUB_TOKEN=ghp_... # optional; enables commit history and Scorecard
```
```
# 单一 package
uzomuzo analyze pkg:npm/express@4.18.2
# GitHub repository
uzomuzo analyze https://github.com/expressjs/express
# 审计所有项目依赖 (对 CI 友好)
trivy fs . --format cyclonedx | uzomuzo audit --sbom -
uzomuzo audit # auto-detect go.mod in cwd
uzomuzo audit --format json # JSON output for CI integration
# 从 Trivy SBOM 批量处理 (详细的逐个 package 分析)
trivy image --format cyclonedx bkimminich/juice-shop:v14.5.1 \
| jq -r '.components[].purl // empty' \
| uzomuzo analyze --only-eol
# 文件输入 (每行一个 PURL)
uzomuzo analyze --file input_purls.txt --sample 500
```
请参阅[用法](docs/usage.md)获取完整的 CLI 参考,以及[集成示例](docs/integration-examples.md)了解 Trivy、Syft 和 Go module 工作流。
## 生命周期分类
uzomuzo 使用多信号决策树(OpenSSF Scorecard、近期人工提交、发布活动、注册表 EOL 标志以及未修补的 advisory 数量)将每个软件包分类为七种生命周期状态之一:
| 标签 | 含义 | 操作 |
| --- | --- | --- |
| **Active** | 近期有人工提交 + 发布 + 健康的维护评分 | 无需采取行动 |
| **Legacy-Safe** | 无近期活动,但零漏洞 — 冻结且稳定 | 接受风险或固定版本 |
| **Stalled** | 维护正在衰退:评分低或提交已停止 | 持续监控;计划迁移 |
| **EOL-Confirmed** | 代码仓库已归档/禁用,或注册表明确标记为 EOL | 立即迁移 |
| **EOL-Effective** | 无官方 EOL 声明,但超过 2 年无人提交且存在未修补漏洞 | 迁移;视作 EOL 处理 |
| **EOL-Scheduled** | 已宣布未来的 EOL 日期(尚未到达) | 在 EOL 日期前计划迁移 |
| **Review Needed** | 缺乏足够的数据进行自动分类 | 需人工调查 |
## uzomuzo 的独特之处
| 功能 | Trivy / Syft | OpenSSF Scorecard | endoflife.date | **uzomuzo** |
| --- | --- | --- | --- | --- |
| 已知漏洞扫描 | 是 | 部分 | 否 | 否(使用 Scorecard) |
| 单仓库健康度评分 | 否 | 是(17 项检查) | 否 | 是(通过 Scorecard) |
| **依赖树生命周期评估** | 否 | 否 | 否 | **是** |
| **长尾 EOL 检测** | 否 | 否 | 约 400 个项目 | **启发式 + 目录** |
| **Bot 与人工提交过滤** | 否 | 否 | 不适用 | **是** |
| 生命周期分类粒度 | 不适用 | 不适用 | 二元(EOL/否) | **7 种可操作状态** |
| 批量处理规模 | 不适用 | 1 个仓库/运行 | 不适用 | **5,000+ PURLs/运行** |
### 技术创新点
| 创新点 | 为何重要 |
| --- | --- |
| **人工与 Bot 提交分离** | 仅包含 Dependabot/Renovate 提交的代码仓库会伪装成仍在维护的状态。uzomuzo 过滤掉自动化提交以揭示真实的人类活动。 |
| **7 状态生命周期模型** | 非黑即白的“是否 EOL”是不够的。每种状态都对应一个具体的补救措施。 |
| **感知生态系统的交付模型** | Go 模块通过 VCS 直连交付;npm 通过注册表发布交付。同样是“有提交无发布”的信号,在不同的生态系统中代表着不同的含义。 |
| **证据链** | 每个标签都包含原因字符串和决策追踪,以便安全团队可以审计*为什么*某个软件包被标记。 |
| **渐进式精度** | 在没有 GitHub token 的情况下也能工作(仅使用 deps.dev);添加 token 后可解锁提交历史和 Scorecard 以进行高精度评估。 |
## 支持的生态系统
npm / PyPI / Maven / Cargo / Go modules / NuGet / RubyGems / Packagist
## 功能特性
- **多生态系统支持**:支持 8 个生态系统,完全兼容 PURL (Package URL) 规范
- **OpenSSF Scorecard 集成**:自动化的安全成熟度指标
- **并行优化的批处理**:通过并发 API 编排实现 5,000+ PURLs/运行
- **Audit 子命令**:从 CycloneDX SBOM 或 go.mod 进行批量依赖健康检查,并带有 CI 退出代码门控
- **灵活的输入方式**:直接输入 PURL / GitHub URL / 文件列表 / 混合输入 / stdin 管道
- **CSV / CLI 报告**:全面输出指标、许可证和生命周期状态
- **可通过 AnalysisEnricher 钩子扩展**:无需修改核心即可注入自定义的 EOL 目录逻辑 — [详情](docs/library-usage.md)
- **可用作 Go 嵌入库**:提供 `pkg/uzomuzo/` 外观层用于 SaaS 集成 — [详情](docs/library-usage.md)
## 架构
```
Interfaces → Application → Domain ← Infrastructure
```
- **Domain**:纯业务逻辑 — 生命周期决策树、生态系统模型、实体定义(无外部依赖)
- **Application**:用例编排,使用 `AnalysisEnricher` 钩子模式实现可插拔的 EOL 目录
- **Infrastructure**:外部 API(deps.dev、GitHub GraphQL、Scorecard)/ 并行处理 / I/O
- **Interfaces**:CLI 入口点 / 输入验证(无并发逻辑)
请参阅[数据流](docs/data-flow.md)了解 API 集成图和双路径评估架构。
## 文档
| 文档 | 概述 |
| --- | --- |
| [用法](docs/usage.md) | CLI 命令、批处理、过滤器、配置、日志 |
| [数据流](docs/data-flow.md) | API 集成图、双路径评估架构 |
| [集成示例](docs/integration-examples.md) | Trivy/SBOM 集成、容器扫描、依赖追踪 |
| [全景对比](docs/landscape.md) | 问题空间、工具对比、互补使用 |
| [库用法](docs/library-usage.md) | Go 库 API、Evaluator、Analysis 类型 |
| [PURL 身份模型](docs/purl-identity-model.md) | OriginalPURL / EffectivePURL / CanonicalKey 三层设计 |
| [许可证解析](docs/license-resolution.md) | ResolvedLicense / 规范化 / 回退 / 提升 |
| [开发指南](docs/development.md) | SPDX 更新、测试、性能、故障排除 |
## 为什么叫 "Uzomuzo"?
发音为 **oo-zoh-moo-zoh** — 源自日语的 *uzōmuzō* (有象無象)。
在日本的佛教哲学中,*uzō* (有象) 意为“有形之物”,而 *muzō* (無象) 意为“无形之物”。两者结合在一起,*uzōmuzō* 最初被用来描述“宇宙万物——有形的与无形的”。
现代软件供应链正是如此:一个由可见(直接)和不可见(传递)依赖组成的庞大宇宙。**uzomuzo** 照亮了这种复杂性 —— 映射依赖树中的每一个元素,为混沌带来清晰的秩序。
## 关于
由 kotakanbe 开发,他是 [Vuls](https://github.com/future-architect/vuls) 的创建者 —— 这是一个拥有 12,000 多个 GitHub 星标的开源漏洞扫描器。uzomuzo 将这一使命从被动漏洞扫描延伸到了**前瞻性的供应链生命周期治理**。
## 赞助
如果您觉得 uzomuzo 有用,请考虑[赞助维护者](https://github.com/sponsors/kotakanbe)。
[](https://github.com/sponsors/kotakanbe)
## 许可证
Apache License 2.0 — 详见 [LICENSE](LICENSE)。
示例输出 — 所有生命周期状态
### Active — `express` (193K 个依赖项) ``` 📦 Package: pkg:npm/express@4.22.1 ⚖️ Result: 🟢 Active 💭 Reason: Recent stable package version published with recent human commits; maintenance score ≥ 3 📊 GitHub Info: Normal (⭐ 68954 stars) 👥 Dependents: 192926 🏆 Overall Score: 8.3/10 🔧 Maintained: 10.0/10 📦 Latest Stable Release: 5.2.1 (2025-12-01) 💻 Latest Commit: 2026-03-01 ``` ### Legacy-Safe — `function-bind` (100 万+ 个依赖项) ``` 📦 Package: pkg:npm/function-bind@1.1.2 ⚖️ Result: 🔵 Legacy-Safe 💭 Reason: No known advisories; no human commits for > 2 yrs 👥 Dependents: 1061436 🏆 Overall Score: 4.5/10 🔧 Maintained: 0.0/10 📦 Latest Stable Release: 1.1.2 (2023-10-12) ↳ Stable Advisories: 0 💻 Latest Commit: 2023-10-12 ``` Scorecard 显示 Maintained 0.0 —— 但该包没有任何 advisory,并且完美地做好了一件事。uzomuzo 将其归类为 **冻结且安全**。 ### Stalled — `grunt` (12K 星) ``` 📦 Package: pkg:npm/grunt@1.6.1 ⚖️ Result: ⚪ Stalled 💭 Reason: Recent human commits, no recent package publishing, maintenance score < 3 📊 GitHub Info: Normal (⭐ 12253 stars) 🏆 Overall Score: 4.0/10 🔧 Maintained: 0.0/10 📦 Latest Stable Release: 1.6.1 (2023-01-31) 💻 Latest Commit: 2025-11-05 ``` 偶尔仍有提交,但自 2023 年以来没有任何 npm 发布。没死,也不活跃 —— 明显在衰退。 ### EOL-Confirmed — `inflight` (556K 个依赖项) ``` 📦 Package: pkg:npm/inflight@1.0.6 ⚖️ Result: 🔴 EOL-Confirmed 💭 Reason: Repository is archived or disabled on GitHub 📚 EOL Evidence: • [npmjs] Stable version is deprecated in npm registry. Message: This module is not supported, and leaks memory. Do not use it. 🔁 Successor: lru-cache 📊 GitHub Info: 📦 Archived (⭐ 76 stars) 👥 Dependents: 556304 📦 Latest Stable Release: 1.0.6 (2016-10-13) [DEPRECATED] ``` 556K 个依赖项。GitHub 已归档,npm 已弃用。最后发布于 2016 年。**立即迁移。** ### EOL-Effective — `dicer` (busboy → multer → express) ``` 📦 Package: pkg:npm/dicer@0.3.0 ⚖️ Result: 🛑 EOL-Effective 💭 Reason: Scorecard data incomplete; open advisories (1) and no human commits > 2 yrs 📊 GitHub Info: Normal (⭐ 188 stars) 👥 Dependents: 4689 🏆 Overall Score: 2.8/10 🔧 Maintained: 0.0/10 📦 Latest Stable Release: 0.3.1 (2021-12-19) ↳ Stable Advisories: 1 • [GHSA] GHSA-wm7h-9275-46v2 💻 Latest Commit: 2023-07-15 ``` 没有弃用声明,没有归档 —— 但存在未修补的 ReDoS + 零维护。**SCA 的盲区。**标签:CVE盲点, DevSecOps, EOL检测, event-stream, EVTX分析, Go语言, GPT, SCA工具, xz-utils, 上游代理, 供应链攻击防御, 依赖项检测, 停止维护依赖, 威胁情报, 安全合规, 废弃依赖, 开发者工具, 开源软件治理, 日志审计, 漏洞管理, 生命周期管理, 程序破解, 网络代理, 软件供应链安全, 远程方法调用