Tatos23/sbom-generator
GitHub: Tatos23/sbom-generator
一款用于扫描Python和Java项目依赖、生成CycloneDX/SPDX格式SBOM并匹配OSV漏洞报告的命令行工具。
Stars: 1 | Forks: 0
# SBOM 生成器
一款命令行工具,用于扫描 Python 和 Java 项目,解析传递依赖,生成 CycloneDX 和 SPDX 格式的 SBOM,可视化依赖图,并生成 CVE 漏洞报告。这与美国第 14028 号行政令直接相关,该行政令要求销售给美国联邦政府的软件必须提供 SBOM。
## 前置条件
- [Docker Desktop](https://www.docker.com/products/docker-desktop/)(必须处于运行状态)
- [Git](https://git-scm.com/))(扫描 GitHub URL 时需要)
无需安装 Python 或 Java —— 一切均在 Docker 中运行。
## 快速开始
**1. 克隆仓库**
```
git clone https://github.com/GUC-CSEN1001-S26/project-team077.git
cd project-team077
```
**2. 创建所需的文件夹和环境文件**
```
# Windows PowerShell
mkdir projects, output
New-Item .env
# macOS / Linux
mkdir -p projects output && touch .env
```
**3. 构建 Docker 镜像(仅需一次)**
```
docker compose build
```
**4. 运行你的第一次扫描**
```
docker compose run --rm sbom-generator scan /projects/
```
## 项目结构
```
project-team077/
├── src/ ← Tool source code
├── projects/ ← Place local projects here to scan them
├── output/ ← All generated files are saved here
├── Dockerfile
├── docker-compose.yaml
├── requirements.txt
├── README.md ← This file (user guide)
└── ONBOARDING.md ← Developer architecture guide
```
要扫描本地项目,请将其复制或克隆到 `projects/` 文件夹中:
```
projects/
├── my-python-app/
│ └── requirements.txt
└── my-java-app/
└── pom.xml
```
## CLI 命令
### `scan` — 检测并列出所有依赖项
```
docker compose run --rm sbom-generator scan /projects/
```
选项:
```
--json Machine-readable JSON output
--search-depth INTEGER How deep to search for manifest files (default: 3)
```
示例:
```
docker compose run --rm sbom-generator scan /projects/my-python-app
docker compose run --rm sbom-generator scan /projects/my-python-app --search-depth 5
```
### `sbom` — 生成软件物料清单
```
# CycloneDX JSON(默认)
docker compose run --rm sbom-generator sbom /projects/ --format cyclonedx -o /output/bom.json
# CycloneDX XML
docker compose run --rm sbom-generator sbom /projects/ --format cyclonedx-xml -o /output/bom.xml
# SPDX 3.0 JSON-LD
docker compose run --rm sbom-generator sbom /projects/ --format spdx -o /output/bom.spdx.json
# SPDX 3.0 tag-value
docker compose run --rm sbom-generator sbom /projects/ --format spdx-tv -o /output/bom.spdx.tv
```
选项:
```
--format cyclonedx | cyclonedx-xml | spdx | spdx-tv (default: cyclonedx)
-o / --output Output file path
--no-scan-vulns Skip vulnerability scan (faster)
--no-validate Skip schema validation
--search-depth INTEGER Manifest search depth (default: 3)
```
生成的文件将保存到你本地的 `output/` 文件夹中。
### `graph` — 可视化依赖图
```
docker compose run --rm sbom-generator graph /projects/ -o /output/graph
```
自动在给定路径保存 `graph.png` 和 `graph.pdf`。
选项:
```
-o / --output Output path without extension (default: /output/graph)
--max-depth Limit visualization depth
--search-depth Manifest search depth (default: 3)
```
### `check` — 扫描 CVE 漏洞
```
docker compose run --rm sbom-generator check /projects/ -o /output/report.pdf
```
针对 OSV 漏洞数据库扫描**直接和传递依赖项**,并生成按严重程度(CRITICAL → HIGH → MEDIUM → LOW)排序的 PDF 报告。
选项:
```
-o / --output Output path for PDF report
--fail-on Exit with code 1 if vulnerabilities at or above this severity are found
Choices: critical | high | medium | low | none (default: none)
--json Output results as JSON instead of a table (useful in CI/CD)
--search-depth Manifest search depth (default: 3)
```
示例 — 在出现 HIGH 或 CRITICAL 时中断 CI pipeline:
```
docker compose run --rm sbom-generator check /projects/ --fail-on high -o /output/report.pdf
```
### `shell` — 交互模式
在单个 container 会话中运行多个命令:
```
docker compose run --rm -it sbom-generator shell
```
然后在内部执行:
```
sbom-gen> scan /projects/my-java-app
sbom-gen> sbom /projects/my-java-app --format cyclonedx -o /output/bom.json
sbom-gen> check /projects/my-java-app --fail-on high -o /output/report.pdf
sbom-gen> graph /projects/my-java-app -o /output/graph
sbom-gen> exit
```
## 扫描 GitHub 仓库
直接传入任何公开的 GitHub URL —— 该工具会自动克隆它,无需本地副本:
```
docker compose run --rm sbom-generator scan https://github.com/pallets/flask
docker compose run --rm sbom-generator sbom https://github.com/pallets/flask --format cyclonedx -o /output/bom.json
docker compose run --rm sbom-generator check https://github.com/spring-projects/spring-petclinic -o /output/report.pdf
docker compose run --rm sbom-generator graph https://github.com/apache/kafka -o /output/graph
```
## 输出文件
| 命令 | 输出文件 | 格式 |
|---|---|---|
| `sbom --format cyclonedx` | `bom.json` | CycloneDX 1.7 JSON |
| `sbom --format cyclonedx-xml` | `bom.xml` | CycloneDX 1.7 XML |
| `sbom --format spdx` | `bom.spdx.json` + `.ttl` + `.rdf` | SPDX 3.0 JSON-LD + RDF 导出 |
| `sbom --format spdx-tv` | `bom.spdx.tv` | SPDX 3.0 tag-value |
| `graph` | `graph.png` + `graph.pdf` | 依赖图 |
| `check` | `report.pdf` | CVE 漏洞报告 |
所有文件都会出现在你本地的 `output/` 目录中。
## 支持的生态系统
### Python
| 清单 / Lockfile | 处理方式 |
|---|---|
| `uv.lock` | 精确锁定的版本 + 完整依赖图 |
| `Pipfile.lock` | 精确锁定的版本 |
| `requirements.txt` | 通过 PyPI API 解析的版本约束 |
| `pyproject.toml` | `[project.dependencies]`、可选依赖、PEP 735 分组 |
| 无清单 | AST 导入扫描回退 |
### Java
| 清单 / Lockfile | 处理方式 |
|---|---|
| `pom.xml` | Maven — 解析 `${property}` 占位符,跳过 test/provided 作用域 |
| `build.gradle` / `build.gradle.kts` | Gradle — 优先使用 lockfile,回退到 regex 解析 |
| `lib/*.jar` | JAR 扫描 — 读取内嵌的 `pom.properties` |
| 无清单 | 通过 Maven Central 搜索推断 Java 导入 |
混合项目(一个仓库中同时包含 Python 和 Java)会被检测到并同时进行解析。
## 演示日准备
### 必需环境
在演示之前,请在你的 `projects/` 文件夹中准备**三个本地项目**:
| 环境 | 所需文件 | 展示内容 |
|---|---|---|
| 仅 Python | `requirements.txt` 或其他 Python 清单 | `scan`、`sbom`、`graph`、`check` |
| 仅 Java | `pom.xml` 或 `build.gradle` — **无 lock 文件** | `scan`、`sbom`、`graph`、`check` |
| Python + Java 混合 | 同一仓库中同时包含 Python 和 Java 清单 | 演示同时检测 |
**演示前:** 确保最新版本的代码已推送到 GitHub —— 助教们将在会议期间审查该仓库。
### 必需交付物
演示必须展示至少一个项目的这四个输出文件:
| # | 文件 | 如何生成 |
|---|---|---|
| 1 | `bom.json` — CycloneDX JSON | `sbom --format cyclonedx -o /output/bom.json` |
| 2 | `bom.xml` — CycloneDX XML | `sbom --format cyclonedx-xml -o /output/bom.xml` |
| 3 | `graph.pdf` — 依赖图 | `graph -o /output/graph` |
| 4 | `report.pdf` — CVE 漏洞报告 | `check -o /output/report.pdf` |
### 快速演示脚本
```
# 1. 扫描依赖项
docker compose run --rm sbom-generator scan /projects/
# 2. 生成 CycloneDX SBOM(JSON + XML — 两者均为必需)
docker compose run --rm sbom-generator sbom /projects/ --format cyclonedx -o /output/bom.json
docker compose run --rm sbom-generator sbom /projects/ --format cyclonedx-xml -o /output/bom.xml
# 3. 可视化依赖图(保存 graph.png + graph.pdf)
docker compose run --rm sbom-generator graph /projects/ -o /output/graph
# 4. 生成 CVE 漏洞报告
docker compose run --rm sbom-generator check /projects/ -o /output/report.pdf
```
## 基础需求之外
超越最低规范实现的功能:
| 功能 | 描述 |
|---|---|
| **SPDX 3.0 SBOM** | 完整的 SPDX 3.0 JSON-LD 输出,带有自动的 RDF(`.ttl`、`.rdf`)导出和 schema 验证 |
| **SPDX tag-value** | 人类可读的 SPDX 3.0 tag-value(`.spdx.tv`)格式 |
| **交互式 shell** | `shell` 命令 — 在一个 container 会话中运行多次扫描,无需重新启动 Docker |
| **GitHub URL 扫描** | 直接传入任何公开的 GitHub URL;工具会自动克隆它 |
| **无清单扫描** | 当不存在清单时,回退到 AST 导入扫描(Python)和 Maven Central 推断(Java) |
| **`--search-depth`** | 可配置的清单搜索深度,适用于深度嵌套的 monorepo |
| **混合生态系统检测** | 同时检测同一仓库中的 Python 和 Java |
| **CVSS 评分** | OSV 漏洞结果包含 CVSS 严重性评分,并按 CRITICAL → HIGH → MEDIUM → LOW 排序 |
| **CI/CD 集成** | `--fail-on` 标志在出现 high/critical 结果时以退出码 1 退出;`--json` 标志用于机器可读的输出 |
## 实用技巧
**屏蔽孤立的 container 警告:**
```
docker compose run --rm --remove-orphans sbom-generator scan /projects/
```
**更深入地搜索嵌套的清单**(例如深度 2 处的 `backend/requirements.txt`):
```
docker compose run --rm sbom-generator scan /projects/ --search-depth 5
```
**代码修改后重新构建镜像:**
```
docker compose build
```
## 团队贡献
| 成员 | 部分 | 职责 |
|---|---|---|
| **Abdelrahman Ewida** | §1–2 (Python 解析器), §4 | Python 解析器(uv.lock、Pipfile.lock、requirements.txt、pyproject.toml),通过 PyPI 解析版本约束;许可证检测与元数据扩充(下载 URL、主页、维护者、SHA-256 校验和、SPDX 映射、许可证标志) |
| **Abdullah Ahmed** | §1–2 (Python 解析器), §5B, §6 | Python 解析器(共享);SPDX 3.0 SBOM 生成(JSON-LD、tag-value、RDF 导出)、schema 验证;OSV 漏洞扫描器(与 Hana 共享)、CVSS 评分、PDF 漏洞报告 |
| **Hana Seif** | §1–2 (Java 解析器), §5A, §6 | Java 解析器(Maven pom.xml、Gradle、JAR 扫描、源码导入推断);CycloneDX 1.7 SBOM 生成(JSON + XML)、schema 验证;OSV 漏洞扫描器(与 Abdullah 共享) |
| **Farah Faisal** | §1–2 (Java 解析器), §3 | Java 解析器(共享);传递依赖解析(PyPI + Maven API)、依赖图构建、冲突与循环检测、NetworkX PNG + PDF 可视化 |
标签:Python, SBOM生成, WebSocket, 依赖分析, 无后门, 版权保护, 特权检测, 请求拦截, 逆向工具