Metbcy/bomdrift
GitHub: Metbcy/bomdrift
通过对比两个 SBOM 的差异,自动标注新增和变更依赖中的 CVE、拼写仿冒、维护者异常等供应链风险信号的命令行工具。
Stars: 1 | Forks: 0
# bomdrift
[](https://github.com/Metbcy/bomdrift/actions/workflows/ci.yml)
[](./LICENSE)
## 为什么?
关于 pull request 上最具可操作性的供应链问题是:
——而不是*“我的 SBOM 里有什么?”*。有很多工具可以回答第二个问题。**bomdrift 回答的是第一个问题。**
bomdrift 能够揭示的近期安全事件:
- **axios npm 入侵 (2026年3月31日)** — 维护者遭到社会工程攻击(伪造的 Slack/Teams 通话,朝鲜黑客组织 UNC1069),导致 `axios@1.14.1` + `axios@0.30.4` 携带了恶意的运行时依赖 `plain-crypto-js@4.2.1`,并在 Windows/macOS/Linux 上释放了 WAVESHAPER.V2 RAT。bomdrift 的三个信号在差异对比中被触发:一个**全新的传递依赖**且带有来自 OSV.dev 的 **CVE** (`MAL-2026-2306`),一个**拼写仿冒** (`plain-crypto-js` 与合法的 `crypto-js` 相似度为 0.95),以及针对升级的 `axios@1.14.1` 本身存在的 CVE。
- **Shai-Hulud 蠕虫 (npm, 2025年11月)** — 超过 700 个软件包被自我复制的蠕虫入侵。在合并前审查新增的传递依赖和版本升级是唯一的防线。
- **xz-utils 后门 (CVE-2024-3094, 2024年3月)** — 历时 2.6 年的社会工程攻击活动,最终在 5.6.0/5.6.1 版本中植入了后门。名为 "Jia Tan" 的维护者的第一次提交距离发布时间很近——这正是 bomdrift 实现的维护者活跃时间启发式检测逻辑。
- **持续的 PyPI 拼写仿冒活动 (2024–2026)** — 数百个恶意软件包通过单字符替换进行伪装。通过与排名前 N 的软件库进行 Jaro-Winkler 相似度比对,可以可靠地捕获这些恶意包。
## 安装
### 作为 GitHub Action
```
# .github/workflows/sbom-diff.yml
name: SBOM diff
on: pull_request
permissions:
contents: read
pull-requests: write # to upsert the diff comment
jobs:
diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anchore/sbom-action@v0
with: { path: ., output-file: after.json }
- uses: actions/checkout@v4
with: { ref: ${{ github.event.pull_request.base.ref }}, path: base }
- uses: anchore/sbom-action@v0
with: { path: base, output-file: before.json }
- uses: Metbcy/bomdrift@v1
with:
before-sbom: before.json
after-sbom: after.json
```
### 作为二进制文件 (本地 / CI)
从 [发布页面](https://github.com/Metbcy/bomdrift/releases/latest) 下载适用于您平台的已签名发布存档,并使用 cosign 进行验证——请参阅下面的[发布签名](#release-signing)。
```
# Linux x86_64 示例
curl -sSL -o bomdrift.tar.gz https://github.com/Metbcy/bomdrift/releases/latest/download/bomdrift-v0.1.0-x86_64-unknown-linux-gnu.tar.gz
tar -xzf bomdrift.tar.gz
./bomdrift-v0.1.0-x86_64-unknown-linux-gnu/bomdrift --version
```
### 从源码构建
```
cargo install --locked --git https://github.com/Metbcy/bomdrift --tag v0.1.0 bomdrift
```
## 用法
```
# Diff 两个 SBOM(自动检测 CycloneDX / SPDX / Syft)
bomdrift diff before.json after.json
# Offline 模式(不进行 OSV / 不调用 GitHub-API maintainer-age 查询)
bomdrift diff before.json after.json --no-osv --no-maintainer-age
# 面向 downstream 工具的机器可读 JSON
bomdrift diff before.json after.json --output json
# 刷新内置的 npm popular-package 列表(由 typosquat enricher 使用)
bomdrift refresh-typosquat --ecosystem npm
```
无论检测结果如何,`bomdrift diff` 在成功时均会以代码 0 退出。当标准输出被管道传输或重定向时(即 PR 评论路径),它默认输出 Markdown;当标准输出连接到 TTY 时,则输出 ANSI 彩色的终端内容。使用 `--output markdown|json|terminal` 可覆盖自动检测行为。
## 功能特性
- 通过统一的组件模型,将 **CycloneDX 1.5/1.6**、**SPDX 2.3** 和 **Syft** JSON SBOM 相互进行差异对比(支持任意组合)。
- 针对新增和升级的软件包,通过 `/v1/querybatch` 端点丰富 **OSV.dev CVE 数据**。
- 通过与排名前 1000 的 npm 包进行 Jaro-Winkler 相似度对比来标记潜在的**拼写仿冒**,并带有后缀包含增强规则,可捕获纯 JW 算法容易遗漏的 `plain-crypto-js` → `crypto-js` 模式。
- 标记**顶级 GitHub 维护者最近才加入项目**的依赖项(即 xz 式的接管信号)。遵守 `GITHUB_TOKEN` 限制,具备速率限制感知能力,当仓库贡献者超过 50 人时自动跳过。
- 标记单次差异对比中的**跨多个主要版本升级** (≥ 2 个主要版本) ——这通常与接管互换和命名空间重用有关。
- 输出格式:终端(彩色输出,支持 TTY 感知)、Markdown(用于 PR 评论)、JSON。SARIF 计划在 v0.2 版本中提供。
- 以单个 Rust 二进制文件**以及**复合 GitHub Action 的形式发布——无需 Docker。
- 发布版本使用 [cosign 无密钥签名](https://docs.sigstore.dev/) —— 吃自己的供应链狗粮(践行所倡导的理念)。
## 发布签名
每个发布存档均通过 Sigstore (GitHub OIDC) 使用 cosign 无密钥签名进行签名。
```
cosign verify-blob \
--certificate-identity 'https://github.com/Metbcy/bomdrift/.github/workflows/release.yml@refs/tags/v0.1.0' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate bomdrift-v0.1.0-x86_64-unknown-linux-gnu.tar.gz.pem \
--signature bomdrift-v0.1.0-x86_64-unknown-linux-gnu.tar.gz.sig \
bomdrift-v0.1.0-x86_64-unknown-linux-gnu.tar.gz
```
当 runner 上可用 cosign 时,该 Action 会自动验证签名。
## 非目标
- **SBOM 生成。** 请使用 [Syft](https://github.com/anchore/syft) —— 它已经非常出色了。bomdrift 只负责消费 SBOM。
- **依赖树可视化。** [`cargo tree`](https://doc.rust-lang.org/cargo/commands/cargo-tree.html)、[`pnpm why`](https://pnpm.io/cli/why) 及相关工具已经做得很好了。
- **替代你的 SCA 扫描器。** OSV-scanner、Grype、Trivy 都拥有更丰富的漏洞数据库。bomdrift 的 CVE 丰富是*专注于变更的*:只针对此差异中新增的内容。
## 许可证
Apache-2.0 —— 请参阅 [LICENSE](./LICENSE)。
标签:CI/CD安全, Cloudflare, CVE, DevSecOps, DNS 解析, GitHub Actions, Llama, MITRE ATT&CK, npm安全, OSV, SBOM, Typosquat检测, Vercel, WebSocket, XZ后门, 上游代理, 代码合规, 代码审查, 传递依赖, 供应链攻击, 依赖分析, 依赖树分析, 冒名包, 包名混淆, 可视化界面, 安全基线, 搜索语句(dork), 教学环境, 数字签名, 硬件无关, 社工攻击防御, 维护者信任分析, 自动笔记, 跌倒检测, 软件物料清单, 通知系统