bact/pitloom

GitHub: bact/pitloom

专为 Python 和 AI/ML 项目设计的 SPDX 3 标准自动化 SBOM 生成工具,支持从多种模型格式提取元数据并集成到构建流程中。

Stars: 0 | Forks: 0

# Pitloom [![PyPI - Version](https://img.shields.io/pypi/v/pitloom)](https://pypi.org/project/pitloom/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19246283.svg)](https://doi.org/10.5281/zenodo.19246283) ![The Pippin Pitloom](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e827bb7f15205634.png) 自动化的透明度,从根本上编织而成。 **开发中** -- **不可用于生产环境** ## 概述 **Pitloom** 自动为 Python 项目生成符合 SPDX 3 标准的 SBOM, 记录软件系统的构成和来源。 通过直接从 Python 包和 AI 模型(GGUF, ONNX, PyTorch, Safetensors)读取元数据,它创建标准化的 SPDX 3 JSON 工件。 它还提供原生的 Hatchling 集成,允许用户挂钩到构建过程以自动生成 SBOM。 ## 功能特性 - **SPDX 3 支持**: 以 SPDX 3 JSON-LD 格式生成 SBOM - **Hatchling 集成**: 使用 Hatchling 从 Python 项目中提取元数据 - **依赖追踪**: 自动将项目依赖包含在 SBOM 中 - **AI/ML 模型元数据**: 从模型文件(GGUF, ONNX, PyTorch, Safetensors)提取元数据 用于 SPDX AI 配置文件 - **元数据来源**: 追踪每个元数据字段的来源,以实现透明度和可审计性 - **符合标准**: 遵循 SPDX 3 规范和现代 Python 打包标准 ## 安装说明 使用 pip 安装 Pitloom: ``` pip install pitloom ``` 用于开发(lint + test),使用 pip >= 25: ``` pip install --group dev -e . ``` 或者使用 uv: ``` uv sync --group dev ``` ### 可选模型格式支持 安装扩展以启用从模型文件提取元数据的功能: ``` pip install -e ".[fasttext]" # fastText models pip install -e ".[gguf]" # GGUF models pip install -e ".[onnx]" # ONNX models pip install -e ".[safetensors]" # Safetensors models pip install -e ".[aimodel]" # all of the above ``` ## 使用方法 ### 命令行 为当前目录中的 Python 项目生成 SBOM: ``` loom . ``` 指定输出文件: ``` loom /path/to/project -o sbom.spdx3.json ``` 显示帮助: ``` loom -h ``` ### Python API SBOM 生成器可以通过编程方式使用: ``` from pathlib import Path from pitloom.core.creation import CreationMetadata from pitloom.assemble import generate_sbom # 为项目生成 SBOM generate_sbom( project_dir=Path("/path/to/project"), output_path=Path("sbom.spdx3.json"), creation_info=CreationMetadata( creator_name="Your Name", creator_email="your@example.com", ), pretty=False, ) ``` ### Hatchling 构建钩子 Pitloom 可以通过充当 Hatchling 构建钩子,自动将 SBOM 嵌入到您构建的每个 wheel 中 SBOM 位于 wheel 内部的 `.dist-info/sboms/sbom.spdx3.json`,遵循 [PEP 770](https://peps.python.org/pep-0770/)。 #### 将 Pitloom 添加到您的构建要求中 将 `loom` 添加到项目的构建要求中: ``` [build-system] requires = ["hatchling", "pitloom"] build-backend = "hatchling.build" ``` #### 注册钩子 通过向您的 `pyproject.toml` 添加部分来启用钩子: ``` [tool.hatch.build.hooks.pitloom] # 所有字段均为可选。显示的是默认值。 enabled = true sbom-basename = "package-name" # name part only (no extension); default "sbom" creator-name = "SBOM Creator" # defaults to "Pitloom" creator-email = "mail@example.com" # defaults to None creation-datetime = "2026-04-01T00:00:00Z" # Date and time in ISO 8601 UTC format fragments = [] # extra SPDX fragment paths (relative to project root) ``` 完整的 SBOM 文件名为 `{sbom-basename}.spdx3.json` — 例如,默认设置 生成 `sbom.spdx3.json`。设置 `sbom-basename = "mypackage-1.0"` 将 生成 `mypackage-1.0.spdx3.json`。 就是这样。运行 `hatch build` 或 `python -m build` 现在将自动生成并 嵌入 SBOM — 无需额外命令。 #### 合并 AI/ML 片段 对于 AI 驱动的软件,您可以使用 `pitloom.bom` 在训练期间追踪模型和数据集的来源, 然后将这些片段包含在 wheel SBOM 中: ``` [tool.hatch.build.hooks.pitloom] fragments = [ "fragments/train_run.spdx3.json", "fragments/eval_run.spdx3.json", ] ``` 在 `[tool.hatch.build.hooks.pitloom]` 下列出的片段将与 已在 `[tool.pitloom]` 下列出的任何片段合并在一起。 #### 生成的 wheel 结构 ``` mypackage-1.0-py3-none-any.whl └── mypackage-1.0.dist-info/ └── sboms/ └── sbom.spdx3.json ← PEP 770 ``` ### Python 追踪装饰器 开发人员可以轻松地注解脚本或 Jupyter notebook,以生成外部 SBOM 片段, Pitloom 将在构建过程中合并这些片段: ``` from pitloom import bom # 作为函数装饰器使用... @bom.track(output_file="fragments/sentiment_model.json") def train_model(): bom.set_model("sentiment-clf") bom.add_dataset("imdb-reviews", dataset_type="text") # ... training logic ... # ...或作为上下文管理器使用 with bom.track(output_file="fragments/sentiment_model.json"): bom.set_model("sentiment-clf") bom.add_dataset("imdb-reviews", dataset_type="text") ``` ## 示例 为 sentimentdemo 项目生成 SBOM: ``` # 克隆 sentimentdemo 仓库 git clone https://github.com/bact/sentimentdemo.git # 生成 SBOM loom sentimentdemo ``` 生成的 SBOM 将包括: - 项目元数据(名称、版本、描述) - 带有版本约束的项目依赖 - 组件之间的 SPDX 关系 - 创建者和创建时间戳信息 - **元数据来源**追踪以实现透明度 ## 元数据来源 Pitloom 使用 SPDX 3 的 `comment` 属性在 SBOM 中追踪每个元数据字段的来源。这有助于回答如下问题: ### 来源示例 对于从各种来源提取元数据的包: ``` { "type": "software_Package", "name": "mypackage", "software_packageVersion": "1.2.3", "comment": "Metadata provenance: name: Source: pyproject.toml | Field: project.name; version: Source: src/mypackage/__about__.py | Method: dynamic_extraction; dependencies: Source: pyproject.toml | Field: project.dependencies" } ``` 来源信息显示: - **包名称**:从 `pyproject.toml` → `project.name` 提取 - **版本**:从 `src/mypackage/__about__.py` 动态提取 - **依赖**:在 `pyproject.toml` → `project.dependencies` 中列出 这种透明度对于以下方面至关重要: - **可审计性**:了解 SBOM 数据的来源 - **信任**:验证元数据的准确性 - **机器消费**:自动化工具可以解析来源 - **人工审查**:手动检查数据源 ## 项目结构 ``` pitloom/ ├── docs/ │ ├── design/ │ │ ├── architecture-overview.md │ │ ├── format-neutral-representation.md │ │ └── metadata-provenance.md │ └── implementation/ │ ├── demo.md │ ├── demo-provenance.md │ └── summary.md ├── src/ │ └── pitloom/ │ ├── assemble/ │ │ ├── spdx3/ # SPDX 3 specific (future: spdx23, cyclonedx) │ │ │ ├── document.py # SPDX 3 document assembly — build(DocumentModel) │ │ │ ├── deps.py # Dependency element assembly │ │ │ ├── ai.py # AI model element assembly │ │ │ └── fragments.py # Fragment merging │ │ └── __init__.py # generate_sbom() orchestrator │ ├── core/ │ │ ├── ai_metadata.py # Format-neutral AI model metadata │ │ ├── config.py # [tool.pitloom] settings (PitloomConfig) │ │ ├── creation.py # SBOM creation metadata (CreationMetadata) │ │ ├── document.py # Format-neutral document model (DocumentModel) │ │ ├── models.py # SPDX ID generation utilities │ │ └── project.py # Python project metadata (ProjectMetadata) │ ├── export/ │ │ └── spdx3_json.py # SPDX 3 JSON-LD serialiser │ ├── extract/ │ │ ├── ai_model.py # AI model file extractor (GGUF, ONNX, Safetensors) │ │ └── pyproject.py # pyproject.toml extractor │ ├── plugins/ │ │ ├── __init__.py │ │ └── hatch.py # Hatchling build hook (PEP 770) │ ├── __about__.py │ ├── __init__.py │ ├── __main__.py # CLI entry point │ └── bom.py # ML tracking SDK ├── tests/ │ ├── fixtures/ │ │ └── sampleproject/ # minimal wheel-build fixture │ ├── test_ai_model_extractor.py │ ├── test_bom.py │ ├── test_generator.py │ ├── test_hatch_hook.py │ ├── test_metadata.py │ ├── test_models.py │ ├── test_provenance.py │ └── test_spdx3_compliance.py ├── LICENSE ├── README.md └── pyproject.toml ``` ## 开发 ### 运行测试 ``` pytest ``` ### 运行 linter ``` ruff check src/ tests/ ``` ### 构建包 ``` pip install build python -m build ``` ## 路线图 - [x] 基础 SPDX 3.0 SBOM 生成 - [x] Hatchling 元数据提取 - [x] 依赖追踪 - [ ] 支持 setuptools - [x] 格式中立的内部表示(`DocumentModel` — 参见 [设计文档](docs/design/format-neutral-representation.md)) - [ ] 构建日志提取(用于编译型依赖) - [x] AI/ML 包配置文件 - [x] PEP 770 支持(通过 `build_data["sbom_files"]` 实现 .dist-info/sboms) - [ ] PEP 740 证明支持 - [ ] Rust 后端性能优化 ## 参考 - [SPDX 3.0 规范](https://spdx.dev/wp-content/uploads/sites/31/2024/12/SPDX-3.0.1-1.pdf) - [PEP 770 – Python 包中的 SBOM 元数据](https://peps.python.org/pep-0770/) - [设计文档](docs/design/architecture-overview.md) ## 许可证 - 源代码:Apache License 2.0。 - 文档:Creative Commons Attribution 4.0 International。 - 测试固件 AI 模型: 单个文件根据 Apache-2.0, CC0-1.0 或 MIT 授权。 详见 [tests/fixtures/README.md](tests/fixtures/README.md)。 请注意,这些仅在源代码仓库中可用, 不包含在分发包中。 ## 名称 一个[坑机](https://en.wikipedia.org/wiki/Loom#Treadle_loom) 是一种传统的手工织机,建在地面的坑中, 用于容纳其内部机构和织布者的双腿。 这种“接地”的设计在织造过程中提供了稳定性和精度。 我们用织机作为工具功能的隐喻: 它将散落的元数据线编织成紧密结合的 SBOM, 为软件构建创建了一张透明、结构化的“织物”。
标签:AI 模型安全, DevSecOps, fastText, GGUF, Hatchling 构建钩子, JSON-LD, ONNX, Python 包管理, Python 安全工具, PyTorch, Safetensors, SBOM 生成, SPDX 3, 上游代理, 元数据提取, 合规性自动化, 工件溯源, 文档安全, 机器学习运维, 跌倒检测, 软件物料清单, 进程保护, 逆向工具, 透明度日志