no42-org/blitsbom
GitHub: no42-org/blitsbom
一款零安装、纯浏览器的 SBOM 文件查看器,支持 CycloneDX 和 SPDX 格式解析、许可证分类可视化及 VEX 漏洞叠加分析。
Stars: 0 | Forks: 0
# blitsbom
一个零安装、纯浏览器的 [CycloneDX](https://cyclonedx.org/) SBOM 文件查看器。放入 `bom.json`,即可获得一个干净且可搜索的依赖项视图,还能将其作为 CSV 或 PDF 交给法务部门。
## 快速开始
在你自己的环境中运行 blitsbom 的最快方式——基于 Alpine 的镜像,约 50 MB,无运行时依赖。
### 从 GHCR 拉取已发布的镜像
```
# 稳定发布
docker run --rm -p 8080:80 ghcr.io/no42-org/blitsbom:latest
# 特定版本
docker run --rm -p 8080:80 ghcr.io/no42-org/blitsbom:0.1.0
# 来自 main 的前沿 build (release-candidate)
docker run --rm -p 8080:80 ghcr.io/no42-org/blitsbom:rc
```
然后打开 ,将你的 `bom.json` / `sbom.json` 拖放到页面上。
### 自行构建
```
make docker-build # build the local image
make docker-run # serve it on http://localhost:8080
```
不使用 Make 的等效命令:
```
docker build -t blitsbom:latest .
docker run --rm -p 8080:80 blitsbom:latest
```
该镜像是一个提供静态构建包的 nginx——无遥测,无外部调用,在隔离的防火墙后安全运行。
### 镜像标签
| 标签 | 来源 | 推送时间 |
|------------------------|-------------------------------|-----------------------------|
| `:latest` | 最新标记的发布版本 | 在 `vX.Y.Z` 标签上 |
| `:X.Y.Z`, `:X.Y` | 相同的发布版本,semver 固定 | 在 `vX.Y.Z` 标签上 |
| `:rc` | `main` 分支的顶端 | 每次推送到 `main` 时 |
| `:main-` | 特定的 main commit | 每次推送到 `main` 时 |
## 两种安装方式
### 1. 自托管 (放入任何静态服务器)
每个带标签的版本都会发布一个包含构建静态文件的 `dist.zip` 以及一个 `dist.zip.sha512` 校验和。
```
# 获取最新发布 artifact + checksum
gh release download --pattern 'dist.zip*'
# 验证完整性 (如果 bundle 被篡改,将以非零状态退出)
sha512sum -c dist.zip.sha512
# 解压到 webroot
unzip dist.zip -d /var/www/blitsbom
```
任何静态服务器都可以工作:nginx、Apache、S3 + CloudFront、Caddy、`python -m http.server`。blitsbom 使用相对资源路径,因此它可以在任何子目录中运行。
### 2. 隔离网络 (双击 `index.html`)
对于受监管或离线的环境:
```
unzip dist.zip
open dist/index.html # macOS
xdg-open dist/index.html # Linux
```
它直接从 `file://` URL 运行,无需服务器。构建包包含了它所需的一切——无 CDN,不获取字体,无外部资源。
## 支持的输入
| 格式 | 版本 | 状态 |
|--------|----------|--------|
| CycloneDX JSON | 1.4 / 1.5 / 1.6 | 已支持 |
| SPDX JSON | 2.x (2.2 / 2.3) | 已支持 |
| CycloneDX 1.0 – 1.3 | — | 拒绝并给出明确的错误提示 (如果需要请提交 issue) |
| CycloneDX XML | — | 尚未支持 — 提交 issue |
| SPDX 3.x | — | 尚未支持 — 提交 issue |
格式通过文档的顶级键 (`bomFormat: "CycloneDX"` 或 `spdxVersion: "SPDX-2.x"`) 自动检测;无需格式选择器。
### 许可证分类
甜甜圈图将每个组件的主要许可证分为六类之一,数据源自 **[自由软件基金会许可证列表](https://www.gnu.org/licenses/license-list.html)**:
| 类别 | 颜色 | 示例 |
|----------|-------|----------|
| 公有领域 | 浅绿色 | CC0-1.0, Unlicense, WTFPL |
| 宽松型 | 绿色 | Apache-2.0, MIT, BSD-2/3-Clause, ISC, Zlib |
| 弱传染型 | 黄色 | LGPL-2.1/3.0, MPL-2.0, EPL-2.0, CDDL-1.0 |
| 强传染型 | 橙色 | GPL-2.0/3.0, AGPL-3.0 |
| 专有 | 红色 | 未知许可证、自由格式名称、SPDX 表达式 |
| 未声明 | 灰色 | NOASSERTION, 缺失, 为空 |
点击甜甜圈图的某个部分(或图例行)可将表格过滤到该类别,然后深入查看该类别中的各个许可证。关于分类的争议将通过链接到该许可证的 FSF 页面来解决——请参阅 `src/license/classify.ts` 了解源码。
### 许可证表达式处理
CycloneDX 和 SPDX 都接受像 `(MIT OR Apache-2.0)` 这样的复合表达式作为许可证条目。**在 v1 版本中,blitsbom 会按原样显示表达式并将其分类为 `Proprietary`**(因为它们不是单个 SPDX id,无法可靠地归类)。单个 id 的许可证会按照您的预期正常工作。
### LicenseRef-* 解析 (SPDX)
SPDX 文档可以使用由文档的 `hasExtractedLicensingInfos` 块支持的 `LicenseRef-*` 标识符。blitsbom 通过将实际提取的文本与大约 13 种常见许可证(Apache-2.0, MIT, BSD-*, GPL-*, LGPL-*, AGPL-3.0, MPL-2.0, EPL-*, CDDL-1.0, ISC)的签名正则表达式进行匹配来解析这些标识符,并回退到 `seeAlsos` 中的规范许可证 URL 以及 LicenseRef 名称本身中编码的 id。任何无法识别的内容将保留为原样名称并归类为 Proprietary。
## 漏洞 (VEX)
加载 SBOM 后,你可以选择在其上方拖放一个 [CycloneDX VEX](https://cyclonedx.org/capabilities/vex/) 文件(或任何带有填充的 `vulnerabilities[]` 数组的 CycloneDX 文档),以在组件上叠加漏洞数据。**VEX 是纯粹附加的——当没有加载 VEX 时,仅 SBOM 的工作流程保持完全相同。**
从任何 SBOM 生成兼容的 VEX:
```
# Anchore Grype — 输入:任何 SBOM;输出:带有 vulnerabilities[] 的 CycloneDX
grype sbom:./bom.json -o cyclonedx-json > vex.json
# Aqua Trivy
trivy sbom ./bom.json --format cyclonedx --output vex.json
# Google OSV-Scanner
osv-scanner --sbom=./bom.json --format=cyclonedx > vex.json
```
通过摘要标题旁边的 **Load vulnerabilities (VEX)…** 按钮拖放文件。blitsbom 通过规范 purl(以 `bom-ref` 作为备选)将每个漏洞与组件连接,并展示:
- 第五个带有实时漏洞计数的摘要磁贴。
- 组件表格中按严重程度着色的徽章列——点击任何徽章可深入查看每个组件的 CVE 详情。
- 过滤栏中的严重程度切面 (`critical / high / medium / low / unknown / none`),经 URL 编码为 `?severity=…`。
- 摘要磁贴上方的来源信息(VEX 文件名 + 时间戳),以及当 VEX 条目的 `affects[].ref` 未解析到任何组件时出现的“N unmatched (N 个不匹配)”提示。
VEX `analysis.state` 会受到遵循:标记为 `not_affected`、`false_positive` 或 `resolved` 的条目默认被隐藏。当存在此类条目时,会出现一个“Show suppressed (N)”切换按钮以显示它们。
一切均在离线状态下进行——无网络调用,不会对 OSV.dev 或 NVD 进行在线查询。现有的 `purity-check` 构建守卫仍会强制执行此操作。
## 功能特性
- 拖放或选择 `bom.json` / `sbom.json`(CycloneDX 或 SPDX)
- 大型 SBOM 的读取进度指示器 (`Reading X.X MB / Y.Y MB` → `Parsing…`)
- 摘要标题:总组件数、不同许可证数、不同类型数、漏洞数
- 基于 FSF 分类的许可证**甜甜圈**图(宽松型 / 弱传染型 / 强传染型 / 公有领域 / 专有 / 未声明)
- 点击甜甜圈图的部分 → 将表格过滤到该类别,深入查看其中的单个许可证
- 可排序的组件表格,包含 name / version / license / scope / type / purl,针对大型 SBOM 分页(默认显示 500 行,带有 show-more)
- 跨 name、version、license、scope、type、group、publisher、description、purl 的自由文本搜索
- 点击切换过滤标签(类别、许可证、scope、类型、严重程度)
- 可选的 VEX 叠加层:拖放 CycloneDX VEX 文件以将 CVE 数据附加到组件,提供严重程度徽章、深入查看和严重程度过滤(参见上文的 漏洞 (VEX))
- 过滤状态编码在 URL 中——复制地址以共享视图 (`?category=permissive&license=Apache-2.0&severity=high`)
- 过滤视图的 CSV 导出 (RFC 4180,兼容 Excel)
## 开发者工作流
```
make install # npm install
make dev # vite dev server
make build # build static dist/
make test # vitest
make verify # lint + tests + network-purity check
make size-check # fail if gzipped JS exceeds 60 KB
make smoke # headless Chromium loading dist/index.html via file://
make dist-zip # build and zip dist/ as dist.zip for self-hosters
```
CI 调用 `make` 目标,从不直接调用底层的 npm scripts,从而保持开发者和 CI 命令的同步。
## 部署
- 推送到 `main` 会触发 `.github/workflows/docker.yml`,它会构建并推送 `ghcr.io/no42-org/blitsbom:rc`(以及 `:main-`)。
- 推送匹配 `v*` 的标签会触发 `.github/workflows/release.yml`(生成 `dist.zip` + `dist.zip.sha512` 并将其附加到 GitHub Release)以及 `.github/workflows/docker.yml`(将 `:latest`, `:X.Y.Z`, `:X.Y` 发布到 GHCR)。
所有第三方 Actions 都固定到不可变的 commit SHA,并由 Dependabot 保持最新。
有关完整的发布工作流,请参阅 **[RELEASING.md](./RELEASING.md)**——版本控制策略、切割发布、热修复和故障排除。
## 项目布局
```
src/
parse/ CycloneDX + SPDX parsers, format detection, LicenseRef resolution,
VEX merge + purl canonicalization
license/ FSF-sourced classification table
state/ Svelte store, filter combinator (incl. category facet), URL state
ui/ Svelte components (AppShell, DropZone, SummaryHeader,
LicenseDonut, LicenseDrilldown, ComponentsTable, ...)
export/ CSV writer
styles/ Tailwind v4 CSS entry (@theme static design tokens)
scripts/ size-check, purity-check, file-smoke, e2e
samples/ Real-world SBOMs used as test corpus (not bundled into dist/)
```
## 许可证
MIT — 见 [LICENSE](./LICENSE)。
标签:Alpine Linux, CycloneDX, DevSecOps, Docker, GHCR镜像, GPT, Nginx, NIDS, PDF导出, SBOM, SBOM分析, SBOM查看器, Svelte, WebSocket, 上游代理, 依赖分析, 内网部署, 前端, 安全合规, 安全防御评估, 容器化, 开源组件, 无追踪, 本地解析, 气隙隔离, 浏览器端, 漏洞管理, 硬件无关, 离线环境, 网络代理, 网络安全, 自动化攻击, 自托管, 请求拦截, 跌倒检测, 软件物料清单, 隐私保护, 零安装, 静态网页