TomTonic/extract-sbom
GitHub: TomTonic/extract-sbom
面向软件采购场景的沙箱化 SBOM 提取工具,能从各类不透明供应商交付物中递归解压并生成标准化 CycloneDX SBOM 和可审计报告,填补供应链「进料检验」环节的工具空白。
Stars: 1 | Forks: 0
# 提取 SBOM
extract-sbom 对软件交付物执行标准化的进料检验。
给定一个输入文件,它会生成:
- 一份整合的 CycloneDX SBOM
- 一份审计报告(人类可读的 Markdown、机器可读的 JSON,或两者兼有)
它会递归处理嵌套的容器和归档格式,应用安全
限制,记录提取/扫描决策,并通过
`extract-sbom:delivery-path` 元数据保持可追溯性。
具体的扫描策略,包括确定性和信任边界,
在 [SCAN_APPROACH.md](SCAN_APPROACH.md) 中进行了解释。
## 为什么存在这个项目
软件采购团队定期从外部供应商接收交付物 —— ZIP
归档文件、MSI 安装程序、安装可执行文件 —— 并且必须验证这些交付物
在被接受和部署之前没有已知的漏洞 (CVE)。
这相当于软件的进料检验:在供应链至关重要的
环境中,任何东西在检查之前都不会被部署。相关的风险不仅
存在于顶层包中,而且贯穿于整个软件供应链 ——
传递依赖项、捆绑库以及隐藏在嵌套
安装程序格式中的组件。
现有的 SBOM 工具很好地覆盖了供应链的开发和构建阶段,
但没有一个能解决已打包的、不透明的供应商交付物的检查问题:
- **[Syft](https://github.com/anchore/syft)** 从容器镜像、
源目录和简单的归档格式生成 SBOM。它不会递归解压
深层嵌套的归档文件或安装程序格式(MSI、CAB、InstallShield),不生成
可审计报告,也不为不受信任的输入提供沙箱。extract-sbom 在内部
使用 Syft 作为组件编目引擎,但单独的 Syft 无法处理
交付物检查工作流。
- **[cyclonedx-cli](https://github.com/CycloneDX/cyclonedx-cli)** 是一个 BOM
操作工具,用于转换、合并、比对、验证和签名现有的
SBOM 文档。它不具备从软件制品生成 SBOM 的能力,也没有
提取能力。
- **[microsoft/sbom-tool](https://github.com/microsoft/sbom-tool)** 从构建放置路径或源代码树生成 SPDX
SBOM。它专为软件*生产者*设计,以便在 CI/CD 期间描述其
自己的产品 —— 而不是供*消费者*对外部供应商提供的
不透明二进制文件或安装程序进行进料检验。
- **[jimmykarily/sbom-extractor](https://github.com/jimmykarily/sbom-extractor)** 提取
先前作为 OCI 证明附加到容器镜像的 SBOM。它
专门在容器注册表镜像上运行,无法检查本地
接收的文件。它也完全依赖于供应商已将 SBOM
附加到镜像 —— 无法进行独立验证。
extract-sbom 填补了这一空白,将供应商交付文件作为检查
单元:一个文件输入,一个整合的 CycloneDX SBOM 和一份可审计的报告输出。
### 功能对比
| 功能 | extract-sbom | Syft | cyclonedx-cli | microsoft/sbom-tool | jimmykarily/sbom-extractor |
|---|:---:|:---:|:---:|:---:|:---:|
| 专为进料检验设计 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 递归嵌套归档文件提取 | ✓ | ✗ | ✗ | ✗ | ✗ |
| MSI / CAB / InstallShield 支持 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 单个交付文件输入 → 整合 SBOM 输出 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 可审计的提取报告 (Markdown / JSON) | ✓ | ✗ | ✗ | ✗ | ✗ |
| SBOM 元数据中的交付路径可追溯性 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 针对不受信任供应商输入的沙箱执行 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 策略控制的提取(深度/大小限制) | ✓ | ✗ | ✗ | ✗ | ✗ |
| 确定/可复现的输出 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 跨打包生态系统的组件编目 | ✓ (通过 Syft) | ✓ | ✗ | ✓ | ✗ |
| CycloneDX 输出 | ✓ | ✓ | ✓ | ✗ | ~ |
| 独立于容器注册表 / OCI | ✓ | ✓ | ✓ | ✓ | ✗ |
| SBOM 操作(合并、比对、验证、签名) | ✗ | ✗ | ✓ | ✗ | ✗ |
## 它的作用
- 识别归档/容器格式(ZIP、TAR 变体、CAB、MSI、7z、RAR、InstallShield CAB)
- 在策略和资源限制下递归提取
- 检测加密的 ZIP 条目,并自动将这些归档重新路由至 7-Zip
- 对于由外部提取器处理的受密码保护格式,按顺序尝试配置的密码
- 在库模式下使用 Syft 进行组件编目
- 组装一个确定性的 CycloneDX 1.6 SBOM
- 生成英文或德文的可审计报告
## 加密归档文件与密码来源
对于加密归档文件,extract-sbom 支持从以下来源按顺序尝试密码:
- `--password` (可重复)
- `EXTRACT_SBOM_PASSWORDS` (逗号分隔)
- `--password-file` (每行一个密码,允许使用 `#` 注释)
密码尝试按来源优先级排序:
1. 命令行参数 (`--password`)
2. 环境变量 (`EXTRACT_SBOM_PASSWORDS`)
3. 密码文件 (`--password-file`)
在提取过程中,extract-sbom 首先尝试不使用密码,然后按
顺序尝试每个已配置的密码。密码绝对不会打印在日志或报告中。
## 可选的漏洞丰富化 (`--grype`)
如果启用了 `--grype`,extract-sbom 将针对生成的 SBOM 运行 Grype,
并在不改变 SBOM 结构或提取/扫描决策的情况下丰富审计报告。
- 摘要视图:受 grype 启发的漏洞表,包含 `Name`、已安装/已修复版本、
漏洞 ID、严重性(包括可用的 CVSS 评分)、EPSS、风险和 KEV。
- 详情视图:按包分组的出现索引,包含每次出现的漏洞状态
(`found`、`none`、`not-assessable`),包括类型、修复数据、CVSS 版本/评分/向量、
描述、EPSS 和可用的来源参考。
- 运行时诊断:Grype 版本/数据库元数据和显式的丰富状态
(`completed`、`completed-with-errors`、`unavailable`、`not-requested`)。
- 失败行为:如果缺少 Grype 或返回了无效/不可用的输出,SBOM 和报告
仍将生成;报告将记录丰富状态为不可用/不完整。
## 快速开始
安装预构建的发布二进制文件(参见 [INSTALL.md](INSTALL.md)) 或
从源代码构建(参见 [BUILD.md](BUILD.md))。
运行(在 Linux 上使用 `bwrap` 的沙箱模式):
```
mkdir -p out
extract-sbom \
--output-dir out \
sample-delivery.zip
```
运行(非沙箱模式,例如 macOS 或受信任的 CI):
```
mkdir -p out
extract-sbom \
--unsafe \
--output-dir out \
sample-delivery.zip
```
`out/` 中的典型输出(基本名称派生自输入文件):
- `sample-delivery.cdx.json`
- `sample-delivery.report.md` (或 `.report.json`,取决于 `--report`)
## 文档
- [INSTALL.md](INSTALL.md):安装和依赖故障排除
- [BUILD.md](BUILD.md):从源代码构建和发布工具
- [USAGE.md](USAGE.md):基于场景的用法、参数和输出
- [SCAN_APPROACH.md](SCAN_APPROACH.md):面向操作员的扫描工作原理及结果可信度说明
- [DESIGN.md](DESIGN.md):功能与安全设计
- [MODULE_GUIDE.md](MODULE_GUIDE.md):模块架构与决策
## CI 中的项目状态
核心 CI 目前检查构建、测试、竞态条件、覆盖率、代码检查,
外加用于模糊测试和发布候选验证的专用工作流。
标签:CycloneDX, DevSecOps, EVTX分析, JSON, Markdown, meg, SBOM提取, URL发现, WebSocket, 上游代理, 供应链审计, 依赖分析, 信任边界, 信息安全, 制品分析, 可追溯性, 安全合规, 安全检测, 对称加密, 日志审计, 网络代理, 自动化审计, 跌倒检测, 软件供应链安全, 软件物料清单, 远程方法调用, 递归解压