Metbcy/bomdrift

GitHub: Metbcy/bomdrift

通过对比两个 SBOM 的差异,自动标注新增和变更依赖中的 CVE、拼写仿冒、维护者异常等供应链风险信号的命令行工具。

Stars: 1 | Forks: 0

# bomdrift [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/3ec8e97c85091859.svg)](https://github.com/Metbcy/bomdrift/actions/workflows/ci.yml) [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](./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), 教学环境, 数字签名, 硬件无关, 社工攻击防御, 维护者信任分析, 自动笔记, 跌倒检测, 软件物料清单, 通知系统