
Git diff для SBOM — сравнивайте документы CycloneDX, SPDX и Syft, обнаруживайте подделку и контролируйте CI.
# sbomlyze
**`git diff` для вашего SBOM.** Сравните два Software Bill of Materials и посмотрите, что изменилось между сборками, версиями и релизами.
sbomlyze сравнивает хеши компонентов, а не только строки версий. Когда злоумышленник подменяет пакет, не меняя его версию, sbomlyze это обнаруживает. Генераторы и сканеры уязвимостей этого не замечают.
[![CI][ci-img]][ci]
[![GitHub Marketplace][marketplace-img]][marketplace]
[![GitHub Release][release-img]][release]
[![Go Report Card][go-report-img]][go-report]
[![OpenSSF Scorecard][scorecard-img]][scorecard]
[![OpenSSF Best Practices][best-practices-img]][best-practices]
[![License: Apache-2.0][license-img]][license]
[![Downloads][download-img]][download]
[](https://github.com/rezmoss/sbomlyze-go-spdx-demo/pull/2)
Узнайте, чем этот сигнал отличается от diff манифеста или обычного diff компонентов, в разделе
[Manifest diff vs. SBOM diff vs. integrity drift](https://github.com/rezmoss/sbomlyze/blob/main/docs/manifest-vs-sbom-vs-integrity-drift.md).
> Генераторы создают SBOM, а сканеры находят CVE. sbomlyze сообщает, что изменилось между двумя SBOM и можно ли этому доверять.
> Запустите его после вашего генератора: `syft image:tag -o cyclonedx-json | sbomlyze - --compliance` анализирует и оценивает сгенерированный SBOM без временного файла. Сравните его с базовым состоянием, чтобы классифицировать дрейф и управлять вашим пайплайном.
## Быстрый старт с GitHub Action
Добавьте [SBOMlyze Diff из GitHub Marketplace][marketplace], чтобы сравнить зафиксированный в репозитории
или отдельно сгенерированный SBOM с его git-базой. Неизменяемый SHA ниже —
это опубликованный Action `v0.5.1`:```yaml
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- uses: rezmoss/sbomlyze@31503690611fda8ebba4ed2bd186eda000442594 # v0.5.1
with:
sbom-path: build/sbom.cdx.json
```
По умолчанию Action записывает Job Summary и может применять политику, сообщать
о дрейфе целостности, загружать SARIF или поддерживать единый комментарий к pull-request. См.
[полный справочник по Action](https://github.com/rezmoss/sbomlyze/blob/main/ACTION.md) для входных и выходных данных, разрешений
и рекомендаций по безопасности. См.
[репозиторий с живой демонстрацией](https://github.com/rezmoss/sbomlyze-action-demo)
для примера проходящего обновления зависимости и заблокированного изменения хеша при той же версии, с
публичными запусками workflow и доказательствами SARIF.
Для dogfood, специфичного для формата, используйте публичные примеры
[Go + SPDX](https://github.com/rezmoss/sbomlyze-go-spdx-demo),
[Node + CycloneDX](https://github.com/rezmoss/sbomlyze-node-cyclonedx-demo) или
[container](https://github.com/rezmoss/sbomlyze-container-demo). Каждый
содержит пять воспроизводимых сценариев проверки.
[10-минутное руководство по бете](https://github.com/rezmoss/sbomlyze/blob/main/BETA.md) собирает четыре сфокусированных вопроса об активации и качестве сигналов.
Сгенерированные SBOM не нужно коммитить: `baseline: workflow-artifact`
извлекает наиболее свежий подходящий артефакт из успешного запуска ветки по умолчанию. [Закреплённый сопутствующий workflow Syft](https://github.com/rezmoss/sbomlyze/blob/main/examples/workflows/syft-companion.yml)
показывает генерацию и публикацию baseline, тогда как SBOMlyze остаётся ответственным
за проверку и политику.
## Почему sbomlyze?
Многие инструменты генерируют SBOM. Немногие их сравнивают, и ещё меньше говорят вам, является ли изменение рутинным или красным флагом цепочки поставок. sbomlyze заполняет этот пробел.
| Возможность | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| **Diff** SBOM-to-SBOM | ✅ | базовый | ❌ | ❌ |
| Дрейф **целостности / подмены** (хеш изменился без версии) | ✅ | ❌ | ❌ | ❌ |
| Diff графа зависимостей + риск транзитивной глубины | ✅ | ❌ | ❌ | ❌ |
| Оценка соответствия **NTIA / CISA / BSI** | ✅ | ❌ | ✅ | ❌ |
| Конвертация форматов (Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | частично |
| Исследователи **TUI + Web UI** | ✅ | ❌ | ❌ | ❌ |
| Policy gate + SARIF / JUnit / Markdown / HTML / Patch | ✅ | частично | частично | частично |
## Возможности
- **Diffing SBOM**: сравнение двух SBOM и просмотр добавленных, удалённых и изменённых компонентов с первого взгляда
- **Классификация дрейфа**: различение дрейфа версий от **дрейфа целостности** (хеш изменился без изменения версии, что сигнализирует о подмене) и дрейфа метаданных
- **Оценка соответствия**: оценка любого SBOM по минимальным элементам **NTIA**, **CISA 2025** и **BSI TR-03183**
- **Diff графа зависимостей**: отслеживание транзитивных зависимостей и глубины цепочки поставок
- **Поддержка множества форматов**: Syft, CycloneDX, SPDX (JSON)
- **Конвертация форматов**: конвертация между форматами CycloneDX, SPDX и Syft
- **Надёжное сопоставление идентификаторов**: приоритет PURL → CPE → BOM-ref → namespace/name
- **Режим статистики**: анализ отдельных SBOM для метрик лицензий, зависимостей и целостности
- **Интерактивный режим TUI**: исследование SBOM с навигацией с клавиатуры и поиском
- **Режим Web UI**: браузерный исследователь SBOM с загрузкой drag-and-drop
- **Движок политик**: применение правил дрейфа, лицензий и оценки соответствия в CI-пайплайнах
- **GitHub Marketplace Action**: гейтинг pull-request по дрейфу SBOM с выводом Job Summary, SARIF и опциональным комментарием
- **Обнаружение дубликатов и коллизий**: поиск нескольких версий одного пакета и неоднозначных совпадений идентификаторов
- **Множество форматов вывода**: Text, JSON, SARIF, JUnit XML, Markdown, HTML, JSON Patch
- **Устойчивый парсинг**: продолжение при ошибках со структурированными предупреждениями
## Установка
### Homebrew (macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze
```
### Скрипт установки
Скрипт установки загружает подходящий бинарный файл для вашей ОС/архитектуры:```bash
# Install to ./bin
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh
# Install to /usr/local/bin (requires sudo)
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sudo sh -s -- -b /usr/local/bin
# Install specific version
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh -s -- -v 0.4.0
```
**Параметры установщика:**
| Параметр | Описание |
|--------|-------------|
| `-b <dir>` | Каталог установки (по умолчанию: `./bin`) |
| `-d` | Включить отладочный вывод |
| `-v <ver>` | Установить конкретную версию (по умолчанию: последняя) |
Установщик всегда проверяет контрольную сумму релиза. Если установлен совместимый GitHub CLI,
он также проверяет происхождение сборки релиза и завершается с ошибкой, если
эта проверка не проходит.
### Установка через Go```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest
```
### Из бинарного релиза
Скачайте последний бинарный файл со страницы [GitHub Releases](https://github.com/rezmoss/sbomlyze/releases).
Начиная с v0.3.7, архивы релизов публикуются с артефактными
аттестациями GitHub. Проверьте загрузку независимо с помощью:```bash
gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz \
--repo rezmoss/sbomlyze \
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml
```
Инструкции для неподписанных репозиториев apt, rpm и apk были удалены до тех пор, пока репозитории не будут поддерживать проверку подписей, встроенную в менеджер пакетов.
**Пользователям macOS:** Удалите флаг карантина после загрузки:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze
```
### Сборка из исходного кода```bash
git clone https://github.com/rezmoss/sbomlyze.git
cd sbomlyze
go build -o sbomlyze ./cmd/sbomlyze
```
## Быстрый старт```bash
# Compare two SBOMs (the headline use case)
sbomlyze before.json after.json
# Analyze a single SBOM
sbomlyze image.json
# Read an SBOM from standard input
syft image:tag -o cyclonedx-json | sbomlyze -
# Use standard input on either side of a diff
syft image:tag -o cyclonedx-json | sbomlyze baseline.json -
# Score an SBOM against NTIA / CISA / BSI minimum elements
sbomlyze image.json --compliance
# Interactive TUI explorer
sbomlyze image.json -i
# Web UI (opens browser)
sbomlyze -web
# Convert between SBOM formats
sbomlyze convert syft.json --to spdx
sbomlyze convert cdx.json --to syft -o output.json
# JSON output for CI integration
sbomlyze before.json after.json --json
# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif
# Markdown report for PR comments
sbomlyze before.json after.json --format markdown
# Apply policy checks
sbomlyze before.json after.json --policy policy.json
```
## Использование```
sbomlyze <sbom1|-> [sbom2|-] [options]
sbomlyze convert <sbom|-> --to <format> [-o output]
Modes:
Single file: sbomlyze <sbom> [--json] Show statistics
Interactive: sbomlyze <sbom> -i Interactive explorer
Convert: sbomlyze convert <sbom> --to <fmt> Convert SBOM format
Web server: sbomlyze -web [--port 8080] Web UI explorer
Two files: sbomlyze <sbom1> <sbom2> [...] Show diff
Use `-` in place of one SBOM path to read it from standard input.
Options:
-i, --interactive Interactive TUI explorer
-web, --web Start web UI server
--port <port> Web server port (default 8080)
--json Output in JSON format (shortcut for --format json)
--format <format> Output format: text, json, sarif, junit, markdown, html, patch
--compliance Show NTIA/CISA/BSI compliance scoring
--policy <file> Policy file for CI checks
--strict Fail on parse warnings
--tolerant Continue on parse warnings (default)
--no-pager Disable automatic paging of output
--to <format> Target format for convert: cyclonedx (cdx), spdx, syft
-o, --output <file> Output file for convert (default: stdout)
--version, -v Show version information
--help, -h Show this help message
```
## Команды
### Режим статистики (один файл)
Проанализируйте SBOM, чтобы получить информацию о компонентах, лицензиях и зависимостях.```bash
sbomlyze image.json
```
Вывод включает контекст сканирования, автоматически обнаруженные ключевые находки и статистику:```
Scan Context:
Tool: syft 1.40.1
Schema: 16.0.18
Scan Scope: all-layers
Source Type: image
Source: alpine:latest
Key Findings:
💻 OS/Distro: Alpine Linux v3.21
📦 Dominated by apk: 71 of 71 packages (100.0%)
📂 8,542 files tracked on filesystem
🔗 Relationships: 71 containment + 64 dependency
📜 License profile: 72% permissive, 20% copyleft
⚠️ Low hash coverage: 0.0% (71 of 71 missing)
🔍 Top catalogers: apkdb-cataloger (71)
📦 SBOM Statistics
==================
Total Components: 71
By Package Type:
apk 71
Licenses:
With license: 71
Without license: 0
Top Licenses:
MIT 17
BSD-3-Clause 8
GPL-2.0-only 8
Integrity:
With hashes: 0
Without hashes: 71
Dependencies:
Components with deps: 65
Total dep relations: 176
```
#### Ключевые выводы
sbomlyze автоматически формирует аналитику по вашему SBOM. Для анализа одного файла она включает:
| Вывод | Описание |
|---------|-------------|
| **Определение ОС/дистрибутива** | Определяет операционную систему или дистрибутив по метаданным SBOM |
| **Доминирующая экосистема** | Сообщает, когда один тип пакетов доминирует (>60% всех пакетов) |
| **Занимаемое место в файловой системе** | Количество отслеживаемых файлов в файловой системе |
| **Плотность связей** | Подсчёт связей вложенности и зависимостей |
| **Горячие точки расположения** | Основные каталоги, где обнаружены компоненты |
| **Профиль лицензионных рисков** | Разбивка процентных долей разрешительных/копилефт/неизвестных лицензий |
| **Предупреждения о качестве данных** | Оповещения при низком покрытии лицензий (<50%), хешей (<50%) или PURL (<80%) |
| **Предупреждения о дубликатах** | Помечает группы дублирующихся компонентов |
| **Разбивка по каталогизаторам** | Основные сканеры/каталогизаторы, обнаружившие компоненты (SBOM от Syft) |
#### Метрики покрытия
Режим статистики вычисляет проценты покрытия для оценки качества данных:
| Метрика | Описание |
|--------|-------------|
| **Покрытие PURL** | Процент компонентов с Package URL |
| **Покрытие CPE** | Процент компонентов с CPE (готовность к сканированию уязвимостей) |
| **Покрытие лицензий** | Процент компонентов с хотя бы одной лицензией |
| **Покрытие хешей** | Процент компонентов с хешами целостности |
#### Категоризация лицензий
Лицензии автоматически распределяются по категориям:
| Категория | Примеры |
|----------|----------|
| **Копилефт** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **Разрешительные** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **Общественное достояние** | Посвящения в общественное достояние |
| **Неизвестные** | Нераспознанные или отсутствующие лицензии |
### Режим конвертации
Конвертируйте SBOM между форматами CycloneDX, SPDX и Syft JSON. Формат входных данных определяется автоматически.```bash
# CycloneDX to SPDX
sbomlyze convert image.cdx.json --to spdx
# Syft to CycloneDX (cdx is an alias for cyclonedx)
sbomlyze convert syft-output.json --to cdx
# SPDX to Syft, writing to a file
sbomlyze convert spdx-output.json --to syft -o converted.json
```
#### Поддерживаемые целевые форматы
| Формат | Значение `--to` | Вывод |
|--------|-------------|--------|
| CycloneDX 1.5 | `cyclonedx` или `cdx` | CycloneDX JSON с метаданными, зависимостями и свойствами |
| SPDX 2.3 | `spdx` | SPDX JSON с пакетами, связями и внешними ссылками |
| Syft | `syft` | Syft JSON с артефактами, связями, источником и информацией о дистрибутиве |
#### Что сохраняется
При конвертации сохраняются имена компонентов, версии, PURL, CPE, лицензии, хеши, информация о поставщике и зависимости. Специфичные для формата поля (например, язык Syft, foundBy, locations) переносятся через свойства CycloneDX при конвертации в CDX.
### Режим сравнения (два файла)
Сравните два SBOM, чтобы увидеть, что изменилось между версиями.```bash
sbomlyze v1.0.json v2.0.json
```
#### Обзор различий
Diff начинается со сравнения метаданных бок о бок (имена файлов, размеры, информация об ОС, информация об инструменте, количество компонентов), за которым следуют сведения о контексте сканирования, когда они доступны.
#### Вывод```
📊 Drift Summary:
📦 Version drift: 58 components
⚠️ Integrity drift: 1 component (hash changed without version change!)
📝 Metadata drift: 2 components
🔑 Key Findings:
📈 Attack surface: +5 packages (7.0%), +120 files (3.2%)
🚨 2 version downgrades detected: openssl 3.1.4→3.0.2, curl 8.5.0→8.4.0
🔄 56 version upgrades (2 major, 12 minor, 42 patch) among 65 shared packages
⚠️ Integrity drift (1 total): 1 npm (review recommended)
❌ python ecosystem entirely removed (15 → 0 packages)
➕ New ecosystem: golang (8 packages)
✅ Core system packages stable: apk (71) unchanged
+ Added (2):
+ libgcrypt 1.10.3-r0
+ libgpg-error 1.49-r0
- Removed (3):
- libapk 3.0.3-r1
- libgcc 15.2.0-r2
- nghttp3 1.13.1-r0
~ Changed (58):
~ nginx
version: 1.29.4-r1 -> 1.27.3-r1
~ suspicious-pkg ⚠️ [INTEGRITY]
hash[SHA256]: abc123 -> def456
>> Added dependencies:
pkg:apk/alpine/libxslt: +[so:libgcrypt.so.20]
<< Removed dependencies:
pkg:apk/alpine/libcurl: -[so:libnghttp3.so.9]
🔗 New transitive dependencies (3):
+ pkg:npm/lodash (depth 2)
via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash]
+ pkg:npm/underscore (depth 3)
via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash pkg:npm/underscore]
📊 New deps by depth:
Depth 2: 1
Depth 3+ (risky): 2 ⚠️
```
#### Ключевые выводы в режиме diff
В режиме diff sbomlyze автоматически генерирует более подробную аналитику, сравнивая оба SBOM:
| Вывод | Описание |
|---------|-------------|
| **Несовпадение контекста сканирования** | Предупреждает, если версия схемы или область сканирования изменились между SBOM |
| **Дельта поверхности атаки** | Изменения количества пакетов, файлов и связей с процентами |
| **Исчезнувшие/новые экосистемы** | Типы пакетов, которые полностью появились или исчезли |
| **Миграция ОС/дистрибутива** | Обнаруживает изменения операционной системы между сканированиями |
| **Анализ изменения версий** | Подсчитывает обновления и понижения версий, классифицирует изменения как major/minor/patch |
| **Понижения версий** | Помечает понижения версий как сигнал безопасности с деталями компонентов |
| **Контекст дрейфа целостности** | Разбивает дрейф целостности по типам пакетов с рекомендациями по рискам |
| **Доминирующие шаблоны путей** | Концентрированные изменения по типу и пути в файловой системе |
| **Горячие точки удаления/добавления** | Основные каталоги, затронутые изменениями |
| **Стабильные типы** | Типы пакетов с идентичным количеством (неизменное ядро) |
| **Сдвиги категорий лицензий** | Изменения в балансе copyleft/permissive |
| **Пробелы каталогизаторов** | Сканеры, которые нашли пакеты в Before, но ни одного в After |
#### Образцы пакетов по типу
Добавленные и удалённые компоненты группируются по типу пакета с примерами списков, что позволяет легко увидеть, что изменилось в каждой экосистеме.
## Оценка соответствия
Оцените любой SBOM по трём основным фреймворкам минимальных элементов, чтобы ответить на вопрос, который постоянно задают аудиторы и команды закупок: **«Достаточно ли полон этот SBOM?»**```bash
# Score a single SBOM
sbomlyze image.json --compliance
# Score alongside a diff
sbomlyze before.json after.json --compliance
# As JSON for CI
sbomlyze image.json --compliance --json
```
### Оценённые фреймворки
| Фреймворк | Проверки | Примечательные требования |
|-----------|--------|----------------------|
| **NTIA Minimum Elements** (2021) | 7 | name, version, supplier, unique IDs (PURL/CPE), dependency relationships, SBOM author, timestamp |
| **CISA 2025 Minimum Elements** (черновик, август 2025) | 10 | добавляет software producer, license info, **component hash** и tool name поверх NTIA |
| **BSI TR-03183-2** (v2.1.0, 2025) | 9 | требует component creator contact, **SHA-512 hash**, лицензии в формате SPDX и SBOM creator contact |
### Представление оценки
Каждый фреймворк сообщает процент (пройденные проверки / всего проверок) плюс общую оценку (среднее по фреймворкам), со статусными индикаторами:
| Индикатор | Оценка |
|-----------|-------|
| 🟢 | ≥ 90% |
| 🟡 | 70–89% |
| 🟠 | 50–69% |
| 🔴 | < 50% |
Вывод JSON (`--compliance --json`) включает полный отчёт с детализацией pass/fail по каждой проверке; формат HTML встраивает отчёт о соответствии в страницу отчёта.
### Ограничение соответствия в CI
Обеспечьте соблюдение порогов соответствия через [движок политик](#policy-engine). Установка любого порога запускает оценку соответствия без флага `--compliance`:```json
{
"min_ntia_score": 85,
"min_cisa_score": 70,
"min_bsi_score": 80,
"min_overall_compliance": 75
}
```
### 4.3.2.2.2. `--no-remote` — Отключение удалённого доступа
Отключает все функции удалённого доступа, включая:
- Удалённое подключение к базе данных
- Удалённые вызовы API
- Удалённую синхронизацию
- Удалённое выполнение команд
```bash
python3 CVE-2025-55182.py --no-remote
```
**Варианты использования:**
- Изолированные среды
- Тестирование безопасности
- Отладка
- Среды с ограниченным сетевым доступом
**Примечание:** При использовании этого флага все удалённые функции будут недоступны, что может повлиять на некоторые сценарии эксплуатации.
### 4.3.2.2.3. `--no-cache` — Отключение кэширования
Отключает все механизмы кэширования, включая:
- Кэш результатов
- Кэш сессий
- Кэш конфигурации
- Кэш временных файлов
```bash
python3 CVE-2025-55182.py --no-cache
```
**Варианты использования:**
- Тестирование с чистой средой
- Отладка проблем, связанных с кэшем
- Обеспечение актуальности данных
- Среды с ограниченным дисковым пространством
**Примечание:** Отключение кэширования может замедлить выполнение, но гарантирует получение свежих данных при каждом запуске.
### 4.3.2.2.4. `--no-color` — Отключение цветного вывода
Отключает цветной вывод в терминале, что полезно для:
- Перенаправления вывода в файлы
- Интеграции с CI/CD
- Сред с ограниченной поддержкой цветов
- Пользователей с нарушениями цветовосприятия
```bash
python3 CVE-2025-55182.py --no-color
```
**Варианты использования:**
- Автоматизированные сценарии
- Логирование
- Интеграция с системами мониторинга
- Совместимость с различными терминалами
**Примечание:** При использовании этого флага весь вывод будет в виде простого текста без ANSI-escape-последовательностей.
### 4.3.2.2.5. `--no-banner` — Отключение баннера
Отключает отображение баннера при запуске инструмента.
```bash
python3 CVE-2025-55182.py --no-banner
```
**Варианты использования:**
- Автоматизированные сценарии
- Интеграция с CI/CD
- Минимизация вывода
- Парсинг результатов
**Примечание:** Баннер содержит информацию о версии и авторе инструмента. При отключении баннера эта информация не будет отображаться.
### 4.3.2.2.6. `--no-check` — Отключение проверок
Отключает различные проверки, выполняемые инструментом, включая:
- Проверку версии
- Проверку зависимостей
- Проверку конфигурации
- Проверку сетевого подключения
```bash
python3 CVE-2025-55182.py --no-check
```
**Варианты использования:**
- Ускорение запуска
- Обход проверок в ограниченных средах
- Отладка
- Тестирование
**Примечание:** Отключение проверок может привести к неожиданному поведению, если среда не соответствует требованиям инструмента.
### 4.3.2.2.7. `--no-update` — Отключение проверки обновлений
Отключает автоматическую проверку обновлений инструмента.
```bash
python3 CVE-2025-55182.py --no-update
```
**Варианты использования:**
- Среды без доступа к интернету
- Автоматизированные сценарии
- Предотвращение нежелательных обновлений
- Контроль версий
**Примечание:** При использовании этого флага инструмент не будет проверять наличие новых версий, что может привести к использованию устаревшей версии.
### 4.3.2.2.8. `--no-logo` — Отключение логотипа
Отключает отображение логотипа инструмента.
```bash
python3 CVE-2025-55182.py --no-logo
```
**Варианты использования:**
- Минимизация вывода
- Автоматизированные сценарии
- Интеграция с CI/CD
- Парсинг результатов
**Примечание:** Логотип отображается только при запуске инструмента и не влияет на функциональность.
---
[Read more](https://github.com/rezmoss/sbomlyze)