
Git diff per gli SBOM: confronta documenti CycloneDX, SPDX e Syft, rileva manomissioni e blocca la pipeline CI.
git diff per il tuo SBOM. Confronta due Software Bills of Materials e scopri cosa è cambiato tra build, versioni e release.
sbomlyze confronta gli hash dei componenti, non solo le stringhe di versione. Quando un attaccante sostituisce un pacchetto senza incrementarne la versione, sbomlyze lo segnala. I generatori e gli scanner di vulnerabilità non lo rilevano.
[![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] [![License: Apache-2.0][license-img]][license] [![Downloads][download-img]][download]
Scopri perché questo segnale è diverso da un manifest o da un diff di componenti ordinario in Diff dei manifest vs. diff degli SBOM vs. deriva di integrità.
I generatori creano gli SBOM e gli scanner trovano le CVE. sbomlyze ti dice cosa è cambiato tra due SBOM e se puoi fidartene. Eseguilo dopo il tuo generatore:
syft image:tag -o cyclonedx-json | sbomlyze - --complianceanalizza e valuta l'SBOM generato senza un file temporaneo. Confrontalo con una baseline per classificare la deriva e controllare la tua pipeline.
Aggiungi [SBOMlyze Diff da GitHub Marketplace][marketplace] per confrontare un SBOM
committato o generato separatamente con la sua baseline git. Lo SHA immutabile qui sotto è
l'Action v0.5.1 pubblicata:```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
The Action scrive un Job Summary per impostazione predefinita e può applicare policy, segnalare
derive di integrità, caricare SARIF o mantenere un singolo commento sulla pull request. Vedi
[il riferimento completo all'Action](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md) per input, output, permessi
e indicazioni di sicurezza. Vedi il
[repository di dimostrazione live](https://github.com/rezmoss/sbomlyze-action-demo)
per un aggiornamento di dipendenza superato e un blocco per modifica dell'hash a parità di versione, con
esecuzioni di workflow pubbliche e prove SARIF.
Per sperimentazioni specifiche per formato, usa gli esempi pubblici
[Go + SPDX](https://github.com/rezmoss/sbomlyze-go-spdx-demo),
[Node + CycloneDX](https://github.com/rezmoss/sbomlyze-node-cyclonedx-demo) o
[container](https://github.com/rezmoss/sbomlyze-container-demo). Ciascuno
contiene cinque scenari di revisione riproducibili. La
[guida beta da 10 minuti](https://github.com/rezmoss/sbomlyze/blob/HEAD/BETA.md) raccoglie quattro domande mirate su attivazione e
qualità dei segnali.
Gli SBOM generati non devono essere committati: `baseline: workflow-artifact`
recupera l'artefatto corrispondente più recente da un'esecuzione riuscita del branch predefinito.
Un [workflow complementare Syft con versione bloccata](https://github.com/rezmoss/sbomlyze/blob/HEAD/examples/workflows/syft-companion.yml)
mostra la generazione e la pubblicazione della baseline mentre SBOMlyze resta responsabile
di revisione e policy.
## Perché sbomlyze?
Molti strumenti generano SBOM. Pochi li confrontano, e ancora meno ti dicono se un cambiamento è di routine o un segnale d'allarme per la supply chain. sbomlyze colma questa lacuna.
| Funzionalità | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| **Diff** SBOM-to-SBOM | ✅ | base | ❌ | ❌ |
| Deriva **integrità / manomissione** (hash modificato senza cambio di versione) | ✅ | ❌ | ❌ | ❌ |
| Diff del grafo delle dipendenze + rischio di profondità transitiva | ✅ | ❌ | ❌ | ❌ |
| Punteggio conformità **NTIA / CISA / BSI** | ✅ | ❌ | ✅ | ❌ |
| Conversione di formato (Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | parziale |
| Esploratori **TUI + Web UI** | ✅ | ❌ | ❌ | ❌ |
| Policy gate + SARIF / JUnit / Markdown / HTML / Patch | ✅ | parziale | parziale | parziale |
## Funzionalità
- **Diff di SBOM**: Confronta due SBOM e osserva a colpo d'occhio componenti aggiunti, rimossi e modificati
- **Classificazione della deriva**: Distingui la deriva di versione dalla **deriva di integrità** (un hash cambiato senza cambio di versione, segnale di manomissione) e dalla deriva dei metadati
- **Punteggio di conformità**: Valuta qualsiasi SBOM rispetto agli elementi minimi di **NTIA**, **CISA 2025** e **BSI TR-03183**
- **Diff del grafo delle dipendenze**: Tieni traccia delle dipendenze transitive e della profondità della supply chain
- **Supporto multi-formato**: Syft, CycloneDX, SPDX (JSON)
- **Conversione di formato**: Converti tra formati CycloneDX, SPDX e Syft
- **Corrispondenza identità robusta**: precedenza PURL → CPE → BOM-ref → namespace/name
- **Modalità statistiche**: Analizza singoli SBOM per metriche di licenza, dipendenza e integrità
- **Modalità TUI interattiva**: Esplora gli SBOM con navigazione da tastiera e ricerca
- **Modalità Web UI**: Esploratore SBOM basato su browser con caricamento tramite trascinamento
- **Motore di policy**: Applica regole di deriva, licenza e punteggio di conformità nelle pipeline CI
- **GitHub Marketplace Action**: Controlla le pull request in base alla deriva SBOM con Job Summary, SARIF e output di commento opzionale
- **Rilevamento di duplicati e collisioni**: Trova più versioni dello stesso pacchetto e corrispondenze di identità ambigue
- **Molteplici formati di output**: Text, JSON, SARIF, JUnit XML, Markdown, HTML, JSON Patch
- **Parsing tollerante**: Continua in caso di errori con avvisi strutturati
## Installazione
### Homebrew (macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze
Lo script di installazione scarica il binario corretto per il tuo sistema operativo/architettura:```bash
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sudo sh -s -- -b /usr/local/bin
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh -s -- -v 0.4.0
**Opzioni dell'installer:**
| Opzione | Descrizione |
|--------|-------------|
| `-b <dir>` | Directory di installazione (predefinita: `./bin`) |
| `-d` | Abilita l'output di debug |
| `-v <ver>` | Installa una versione specifica (predefinita: ultima) |
L'installer verifica sempre il checksum della release. Quando è installata una CLI GitHub compatibile, verifica anche la provenienza della build della release e si blocca se tale verifica non riesce.
### Installazione con Go```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest
Scarica l'ultimo binario da GitHub Releases.
A partire dalla v0.3.7, gli archivi di rilascio vengono pubblicati con attestazioni degli artefatti
GitHub. Verifica un download in modo indipendente con:```bash
gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz
--repo rezmoss/sbomlyze
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml
Le istruzioni per i repository apt, rpm e apk non firmati sono state rimosse finché i
repository non supportano la verifica delle firme nativa del gestore di pacchetti.
**Utenti macOS:** Rimuovere il flag di quarantena dopo il download:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze
git clone https://github.com/rezmoss/sbomlyze.git cd sbomlyze go build -o sbomlyze ./cmd/sbomlyze
## Avvio rapido```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 [-o output]
Modes: Single file: sbomlyze [--json] Show statistics Interactive: sbomlyze -i Interactive explorer Convert: sbomlyze convert --to Convert SBOM format Web server: sbomlyze -web [--port 8080] Web UI explorer Two files: sbomlyze [...] 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 Web server port (default 8080) --json Output in JSON format (shortcut for --format json) --format Output format: text, json, sarif, junit, markdown, html, patch --compliance Show NTIA/CISA/BSI compliance scoring --policy Policy file for CI checks --strict Fail on parse warnings --tolerant Continue on parse warnings (default) --no-pager Disable automatic paging of output --to Target format for convert: cyclonedx (cdx), spdx, syft -o, --output Output file for convert (default: stdout) --version, -v Show version information --help, -h Show this help message
## Comandi
### Modalità Statistiche (File Singolo)
Analizza un SBOM per ottenere informazioni su componenti, licenze e dipendenze.```bash
sbomlyze image.json
L'output include il contesto di scansione, i risultati chiave rilevati automaticamente e le statistiche:``` 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)
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
#### Risultati Chiave
sbomlyze genera automaticamente approfondimenti sul tuo SBOM. Per l'analisi di un singolo file, questi includono:
| Rilevamento | Descrizione |
|---------|-------------|
| **Rilevamento OS/distribuzione** | Identifica il sistema operativo o la distribuzione dai metadati dell'SBOM |
| **Ecosistema dominante** | Segnala quando un tipo di pacchetto domina (>60% di tutti i pacchetti) |
| **Impronta del filesystem** | Numero di file tracciati sul filesystem |
| **Densità delle relazioni** | Conteggi delle relazioni di contenimento e di dipendenza |
| **Aree di concentrazione** | Directory principali in cui si trovano i componenti |
| **Profilo di rischio delle licenze** | Ripartizione delle percentuali di licenze permissive/copyleft/note |
| **Avvisi sulla qualità dei dati** | Allerta quando la copertura di licenze (<50%), hash (<50%) o PURL (<80%) è bassa |
| **Avvisi di duplicati** | Segnala gruppi di componenti duplicati |
| **Ripartizione catalogatori** | Principali scanner/catalogatori che hanno rilevato componenti (SBOM Syft) |
#### Metriche di Copertura
La modalità Statistiche calcola le percentuali di copertura per la valutazione della qualità dei dati:
| Metrica | Descrizione |
|--------|-------------|
| **Copertura PURL** | Percentuale di componenti con URL di pacchetto |
| **Copertura CPE** | Percentuale di componenti con CPE (prontezza per la scansione delle vulnerabilità) |
| **Copertura licenze** | Percentuale di componenti con almeno una licenza |
| **Copertura hash** | Percentuale di componenti con hash di integrità |
#### Categorizzazione delle Licenze
Le licenze vengono automaticamente categorizzate in:
| Categoria | Esempi |
|----------|----------|
| **Copyleft** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **Permissive** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **Pubblico Dominio** | Dediche al pubblico dominio |
| **Sconosciuta** | Licenze non riconosciute o mancanti |
### Modalità Converti
Converti SBOM tra i formati JSON CycloneDX, SPDX e Syft. Il formato di input viene rilevato automaticamente.```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
La conversione preserva nomi dei componenti, versioni, PURL, CPE, licenze, hash, informazioni sul fornitore e relazioni di dipendenza. I campi specifici del formato (ad es. linguaggio Syft, foundBy, locations) vengono trasportati attraverso le proprietà CycloneDX durante la conversione a CDX.
Confronta due SBOM per vedere cosa è cambiato tra le versioni.```bash sbomlyze v1.0.json v2.0.json
#### Panoramica del Diff
Il diff inizia con un confronto affiancato dei metadati (nomi dei file, dimensioni, informazioni sul sistema operativo, informazioni sullo strumento, conteggi dei componenti) seguito dai dettagli del contesto di scansione quando disponibili.
#### Output```
📊 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 ⚠️
In modalità diff, sbomlyze genera automaticamente insight più ricchi confrontando entrambi gli SBOM:
I componenti aggiunti e rimossi sono raggruppati per tipo di pacchetto con elenchi di esempio, rendendo facile vedere cosa è cambiato in ogni ecosistema.
Valuta qualsiasi SBOM rispetto ai tre principali framework di elementi minimi per rispondere alla domanda che revisori e team di acquisto continuano a porsi: "Questo SBOM è abbastanza completo?"```bash
sbomlyze image.json --compliance
sbomlyze before.json after.json --compliance
sbomlyze image.json --compliance --json
### Framework valutati
| Framework | Controlli | Requisiti notevoli |
|-----------|--------|----------------------|
| **NTIA Minimum Elements** (2021) | 7 | nome, versione, fornitore, ID univoci (PURL/CPE), relazioni di dipendenza, autore SBOM, timestamp |
| **CISA 2025 Minimum Elements** (bozza di agosto 2025) | 10 | aggiunge produttore del software, informazioni sulla licenza, **hash del componente** e nome dello strumento in aggiunta a NTIA |
| **BSI TR-03183-2** (v2.1.0, 2025) | 9 | richiede contatto del creatore del componente, **hash SHA-512**, licenze in formato SPDX e contatto del creatore SBOM |
### Presentazione del punteggio
Ogni framework riporta una percentuale (controlli superati / controlli totali) più un punteggio complessivo (media tra i framework), con indicatori di stato:
| Indicatore | Punteggio |
|-----------|-------|
| 🟢 | ≥ 90% |
| 🟡 | 70–89% |
| 🟠 | 50–69% |
| 🔴 | < 50% |
L'output JSON (`--compliance --json`) include il report completo con il dettaglio superato/non superato per ciascun controllo; il formato HTML incorpora il report di conformità nella pagina del report.
### Applicazione della conformità nella CI
Applica le soglie di conformità tramite il [motore di policy](#policy-engine). L'impostazione di qualsiasi soglia attiva la valutazione di conformità senza il flag `--compliance`:```json
{
"min_ntia_score": 85,
"min_cisa_score": 70,
"min_bsi_score": 80,
"min_overall_compliance": 75
}
## Diff del Grafo delle Dipendenze
sbomlyze va oltre i semplici diff delle liste di componenti per analizzare l'intero grafo delle dipendenze, rilevando i rischi della supply chain introdotti tramite dipendenze transitive.
### Caratteristiche
| Funzionalità | Descrizione |
|---------|-------------|
| **Diff dei bordi** | Dipendenze dirette aggiunte/rimosse (A dipende da B) |
| **Raggiungibilità transitiva** | Nuove dipendenze indirette che compaiono attraverso il grafo |
| **Tracciamento perdite transitive** | Dipendenze transitive che sono state rimosse |
| **Tracciamento dei percorsi** | Mostra esattamente come viene raggiunta ogni nuova dipendenza transitiva |
| **Tracciamento della profondità** | A quanti passi di distanza si trova ogni nuova dipendenza dal tuo codice |
| **Riepilogo dei rischi** | Le dipendenze con profondità 3+ sono contrassegnate come a rischio più elevato |
### Perché la Profondità è Importante
Le dipendenze introdotte più in profondità nel grafo:
- Sono più difficili da verificare e revisionare
- Spesso vengono incluse senza un'approvazione esplicita
- Sono vettori comuni per attacchi alla supply chain (ad es., l'incidente event-stream)
Il riepilogo della profondità aiuta a stabilire le priorità di revisione:
| Profondità | Livello di Rischio | Descrizione |
|-------|------------|-------------|
| **1** | Basso | Dipendenze dirette (le hai scelte tu) |
| **2** | Medio | Dipendenze delle tue dipendenze |
| **3+** | Alto ⚠️ | Dipendenze transitive profonde - da revisionare con attenzione |
### Esempio: Rilevamento di Dipendenze Transitive Profonde```bash
# Before: app -> express (simple, 1 dep)
# After: app -> express -> lodash -> underscore -> deep-lib (chain of 4)
sbomlyze before.json after.json
I don't see any content to translate in the input. The input section is empty. Please provide the chunk text you'd like me to translate from English to Italian.``` 🔗 New transitive dependencies (3):
📊 New deps by depth: Depth 2: 1 Depth 3+ (risky): 2 ⚠️
### Output JSON per il Grafo delle Dipendenze```json
{
"dependencies": {
"added_deps": {
"pkg:npm/express": ["pkg:npm/lodash", "pkg:npm/body-parser"]
},
"removed_deps": {},
"transitive_new": [
{
"target": "pkg:npm/underscore",
"via": ["pkg:npm/my-app", "pkg:npm/express", "pkg:npm/lodash", "pkg:npm/underscore"],
"depth": 3
}
],
"transitive_lost": [],
"depth_summary": {
"depth_1": 0,
"depth_2": 2,
"depth_3_plus": 2
}
}
}
sbomlyze classifica le modifiche dei componenti in tre tipi di drift, aiutandoti a distinguere gli aggiornamenti normali da modifiche potenzialmente sospette.
Il drift di integrità si verifica quando l'hash di un componente cambia ma la sua versione rimane la stessa. Questo potrebbe indicare:
~ suspicious-pkg ⚠️ [INTEGRITY] hash[SHA256]: abc123 -> def456
**Raccomandazione**: Investiga sempre la deriva di integrità. Potrebbe essere benigna, ma è un segnale chiave per la sicurezza della supply chain.
### Output JSON per la deriva
Il riepilogo della deriva si trova nell'oggetto `diff`:```json
{
"diff": {
"changed": [
{
"id": "pkg:npm/suspicious-pkg",
"name": "suspicious-pkg",
"changes": ["hash[SHA-256]: abc123 -> def456"],
"drift": {
"type": "integrity",
"hash_changes": {
"changed": {
"SHA-256": {"before": "abc123", "after": "def456"}
}
}
}
}
],
"drift_summary": {
"version_drift": 55,
"integrity_drift": 1,
"metadata_drift": 2
}
}
}
Estrazione del riepilogo del drift:```bash
sbomlyze before.json after.json --json | jq '.diff.drift_summary'
sbomlyze before.json after.json --json | jq -e '.diff.drift_summary.integrity_drift > 0'
## Rilevamento di Duplicati e Collisioni
### Rilevamento di Duplicati
sbomlyze identifica componenti con la stessa identità ma versioni diverse all'interno di un SBOM:```
⚠️ Duplicates Found: 2
lodash: [4.17.20, 4.17.21]
express: [4.18.0, 4.19.2]
In modalità diff, il confronto delle versioni duplicate tiene traccia di:
Le collisioni sono corrispondenze di identità ambigue in cui i componenti condividono lo stesso ID ma hanno caratteristiche in conflitto:
| Tipo | Descrizione |
|---|---|
| Nome non corrispondente | Nomi di componenti diversi mappati allo stesso ID di identità |
| Hash non corrispondente | La stessa versione di un componente ha hash diversi (possibile manomissione) |
sbomlyze sbom.json -i

### Scorciatoie da tastiera TUI
#### Navigazione
| Tasto | Azione |
|-------|--------|
| `↑` / `k` | Sposta su |
| `↓` / `j` | Sposta giù |
| `PgUp` / `Ctrl+u` | Mezza pagina su |
| `PgDn` / `Ctrl+d` | Mezza pagina giù |
| `Home` / `g` | Vai all'inizio |
| `End` / `G` | Vai alla fine |
| `Enter` | Visualizza i dettagli del componente |
| `Esc` / `Backspace` | Torna indietro |
| `q` / `Ctrl+c` | Esci |
#### Ricerca e filtro
| Tasto | Azione |
|-------|--------|
| `/` | Ricerca approfondita in tutti i campi (nome, PURL, licenze, JSON grezzo) |
| `t` | Filtra per tipo di pacchetto (npm, apk, golang, pypi, ecc.) |
| `c` | Cancella tutti i filtri attivi |
#### Viste
| Tasto | Contesto | Azione |
|-------|----------|--------|
| `j` | Vista dettagli | Visualizza il JSON grezzo del componente con evidenziazione della sintassi |
| `d` | Vista JSON | Torna alla vista dettagli |
| `Enter` | Vista JSON | Esporta il JSON del componente in un file |
| `?` | Qualsiasi vista | Mostra la guida con tutte le scorciatoie da tastiera |
### Vista dettagli componente
La vista dettagli mostra informazioni complete sul componente:
- Informazioni sul pacchetto (nome, versione, PURL, namespace, fornitore)
- Licenze con indicatori visivi
- Hash di integrità
- CPE (Common Platform Enumeration)
- Elenco delle dipendenze
- Identificatori (ID, BOM-ref, SPDX-ID)
## Modalità Web UI
Avvia un esploratore SBOM basato su browser con caricamento file tramite trascinamento:```bash
# Start web server on default port 8080
sbomlyze -web
# Start on custom port
sbomlyze -web --port 3000
Poi apri http://localhost:8080 nel tuo browser.
L'interfaccia web mostra statistiche complete tra cui:
Revisione della sicurezza
Audit di conformità
Debug in fase di sviluppo
L'interfaccia web include un esplora file system completo per esplorare i file all'interno degli SBOM (particolarmente utile per gli SBOM generati da Syft con metadati dei file):
*.so, /usr/lib/**/*.conf)-i (Modalità interattiva)Avvia l'esploratore TUI basato su terminale per navigare negli SBOM con controlli da tastiera.```bash sbomlyze image.json -i
Features: tree navigation, component details, search, license/hash inspection.
### `-web` (Web Server Mode)
Start a web server for browser-based SBOM exploration.```bash
# Default port 8080
sbomlyze -web
# Custom port
sbomlyze -web --port 3000
La web UI offre caricamento tramite drag-and-drop, vista ad albero interattiva, ricerca approfondita e dashboard di statistiche.
--complianceValuta l'SBOM rispetto ai framework a elementi minimi NTIA, CISA 2025 e BSI TR-03183. Vedi Valutazione della conformità.```bash sbomlyze image.json --compliance sbomlyze image.json --compliance --json
### `--format` / `-f`
Seleziona il formato di output. Sono disponibili sette formati:
| Formato | Flag | Descrizione | Ideale per |
|--------|------|-------------|----------|
| **text** | `--format text` (default) | Output di terminale leggibile | Ispezione locale |
| **json** | `--json` o `--format json` | JSON strutturato | Pipeline CI, scripting |
| **sarif** | `--format sarif` | SARIF 2.1.0 per GitHub Code Scanning | Integrazione GitHub |
| **junit** | `--format junit` | Risultati test JUnit XML | Dashboard dei test CI |
| **markdown** | `--format markdown` | Report Markdown pronto per commenti PR | Commenti alle pull request |
| **html** | `--format html` | Report HTML autonomo (CSS/JS inline) | Auditor, report condivisibili |
| **patch** | `--format patch` | Operazioni JSON Patch RFC 6902 | Applicazione di patch a livello di codice |```bash
# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif > results.sarif
# JUnit output for CI test dashboards
sbomlyze before.json after.json --format junit > results.xml
# Markdown report for PR comments
sbomlyze before.json after.json --format markdown > report.md
# Self-contained HTML report
sbomlyze before.json after.json --format html > report.html
# JSON Patch operations
sbomlyze before.json after.json --format patch > changes.json
Genera un report SARIF 2.1.0 adatto per GitHub Code Scanning. Le regole rilevate includono:
integrity-drift (errore): hash modificato senza variazione di versionedeep-dependency (avviso): nuova dipendenza a profondità 3+new-component / removed-component (nota): aggiunte/rimozioni di componentiversion-change (nota): aggiornamenti di versione dei componentipolicy-violation (errore/avviso): violazioni delle regole di policyGenera XML JUnit con casi di test per:
Genera un report Markdown con:
Genera un singolo file HTML autonomo (CSS e JavaScript inline, nessuna risorsa esterna) adatto per essere inviato via email ai revisori o allegato a una release. Include la dashboard delle statistiche, l'albero delle dipendenze, il riepilogo del drift e il report di conformità incorporato quando è impostato --compliance.
Genera un array di operazioni JSON Patch RFC 6902 (add, remove, replace) che rappresentano il diff.
--jsonAbbreviazione per --format json. Produce i risultati in formato JSON per il consumo programmatico.```bash
sbomlyze image.json --json
sbomlyze before.json after.json --json
**Struttura JSON delle statistiche:**```json
{
"stats": {
"total_components": 71,
"by_type": {"apk": 71},
"by_license": {"MIT": 17, "BSD-3-Clause": 8},
"without_license": 0,
"with_hashes": 0,
"without_hashes": 71,
"total_dependencies": 176,
"with_dependencies": 65,
"duplicate_count": 0,
"by_language": {"go": 45, "python": 12},
"by_found_by": {"apk-db-cataloger": 71},
"license_categories": {
"copyleft": 8,
"permissive": 55,
"public_domain": 0,
"unknown": 8
},
"with_cpes": 71,
"without_cpes": 0,
"with_purl": 71,
"without_purl": 0
},
"warnings": []
}
--policy <file>Applica le regole di policy e fa fallire la CI se vengono violate.```bash sbomlyze before.json after.json --policy policy.json
Vedi [Policy Engine](#policy-engine) per i dettagli.
### `--strict`
Fallisce immediatamente su qualsiasi errore di parsing.```bash
sbomlyze broken.json --strict
# Error parsing broken.json: unknown SBOM format
# exit status 1
--tolerant (predefinito)Continua l'elaborazione in caso di errori, raccogli gli avvisi.```bash sbomlyze broken.json --tolerant
Gli avvisi di parsing includono informazioni strutturate: il file sorgente, un messaggio leggibile dall'utente e, opzionalmente, il campo che ha causato il problema.
### `--no-pager`
Disabilita l'impaginazione automatica dell'output. Utile quando si reindirizza l'output a un altro comando o quando si opera in ambienti non interattivi.```bash
sbomlyze image.json --no-pager
sbomlyze before.json after.json --no-pager | head -20
Crea policy per applicare regole nelle pipeline CI/CD. sbomlyze esce con codice 1 quando si verificano violazioni.
{ "max_added": 10, "max_removed": 5, "max_changed": 100, "deny_licenses": ["GPL-3.0", "AGPL-3.0"], "require_licenses": true, "deny_duplicates": true, "deny_integrity_drift": true, "max_depth": 3, "warn_supplier_change": true, "warn_new_transitive": true, "min_ntia_score": 85, "min_cisa_score": 70, "min_bsi_score": 80, "min_overall_compliance": 75 }
### Policy Rules
| Rule | Type | Description |
|------|------|-------------|
| `max_added` | int | Massimo numero di nuovi componenti consentiti (0 = illimitato) |
| `max_removed` | int | Massimo numero di componenti rimossi consentiti (0 = illimitato) |
| `max_changed` | int | Massimo numero di componenti modificati consentiti (0 = illimitato) |
| `deny_licenses` | []string | Elenco di identificatori di licenza vietati |
| `require_licenses` | bool | Richiedi che tutti i componenti *aggiunti* abbiano una licenza (controlla solo i componenti appena aggiunti in modalità diff) |
| `deny_duplicates` | bool | Rileva errore se nel risultato esistono pacchetti duplicati |
| `deny_integrity_drift` | bool | Rileva errore se l'hash del componente è cambiato senza variazione di versione (rischio supply chain) |
| `max_depth` | int | Rileva errore se ci sono nuove dipendenze transitive a profondità >= N (0 = illimitato) |
| `warn_supplier_change` | bool | Avvisa (senza errore) se fornitore/autore del componente è cambiato |
| `warn_new_transitive` | bool | Avvisa (senza errore) su qualsiasi nuova dipendenza transitiva |
| `min_ntia_score` | int | Rileva errore se il punteggio di conformità NTIA è inferiore a questo (0-100, 0 = disattivato) |
| `min_cisa_score` | int | Rileva errore se il punteggio di conformità CISA è inferiore a questo (0-100, 0 = disattivato) |
| `min_bsi_score` | int | Rileva errore se il punteggio di conformità BSI è inferiore a questo (0-100, 0 = disattivato) |
| `min_overall_compliance` | int | Rileva errore se il punteggio di conformità complessivo è inferiore a questo (0-100, 0 = disattivato) |
> L'impostazione di qualsiasi soglia `min_*_score` attiva automaticamente la valutazione di conformità, anche senza il flag `--compliance`.
### Esempio: Policy Rigida```json
{
"max_added": 5,
"max_removed": 3,
"max_changed": 20,
"deny_licenses": ["GPL-3.0", "AGPL-3.0", "SSPL-1.0"],
"require_licenses": true,
"deny_duplicates": true,
"deny_integrity_drift": true,
"max_depth": 3,
"warn_supplier_change": true,
"warn_new_transitive": true,
"min_overall_compliance": 80
}
!! Policy Violations (3): [max_added] too many components added: 10 > 5 [max_removed] too many components removed: 7 > 3 [deny_licenses] component foo has denied license: GPL-3.0
## Formati SBOM supportati
| Formato | Rilevamento file | Identificatori estratti |
|---------|------------------|-------------------------|
| Syft (native) | chiave JSON `"artifacts"` + una di `"source"`, `"distro"`, `"descriptor"` | PURL, CPE, name |
| CycloneDX | chiave JSON `"bomFormat"` = `"CycloneDX"`, oppure `"$schema"` contenente `cyclonedx` | PURL, CPE, BOM-ref, group (namespace) |
| SPDX | chiave JSON `"spdxVersion"` che inizia con `"SPDX-"` | PURL, CPE, SPDXID |
Tutti i formati devono essere JSON. Il supporto XML non è attualmente disponibile.
### Conversione dei formati
sbomlyze può convertire tra uno qualsiasi dei tre formati supportati:```bash
sbomlyze convert input.json --to spdx # any format → SPDX 2.3
sbomlyze convert input.json --to cyclonedx # any format → CycloneDX 1.5
sbomlyze convert input.json --to syft # any format → Syft JSON
Vedi Modalità Convert per i dettagli.
sbomlyze può confrontare SBOM in formati diversi:```bash
sbomlyze syft-output.json cyclonedx-output.json
sbomlyze spdx-output.json syft-output.json
**Nota:** I diversi formati SBOM estraggono diversi livelli di dettaglio. Un diff tra formati può mostrare modifiche che riflettono differenze di formato (ad es., disponibilità dei campi) piuttosto che reali modifiche al sistema. Il sistema dei risultati principali avviserà in caso di rilevamento di mancate corrispondenze del contesto di scansione.
## Component Identity Matching
I componenti vengono associati utilizzando un sistema di identità basato sulla precedenza:
| Priority | Identifier | Example | Description |
|----------|------------|---------|-------------|
| 1 | PURL | `pkg:npm/lodash` | URL del pacchetto (senza versione) |
| 2 | CPE | `cpe:vendor:product` | CPE vendor:product (senza versione) |
| 3 | BOM-ref / SPDXID | `ref:component-123` | bom-ref CycloneDX o identificativo SPDX |
| 4 | Namespace + Name | `com.example/mypackage` | Gruppo/namespace con nome |
| 5 | Name | `simple-package` | Fallback al solo nome |
## CI/CD Integration
### GitHub Actions
SBOMlyze viene fornito come Action JavaScript senza dipendenze. Confronta un SBOM head archiviato o generato separatamente con il file alla base git della pull request, pubblica un Job Summary e, opzionalmente, genera SARIF o aggiorna un commento della PR.```yaml
name: SBOM Check
on:
pull_request:
permissions:
contents: read
jobs:
sbom-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- id: sbomlyze
uses: rezmoss/sbomlyze@31503690611fda8ebba4ed2bd186eda000442594 # v0.5.1
with:
sbom-path: build/sbom.cdx.json
policy: .github/sbom-policy.json
fail-on: policy
The Action non esegue mai i comandi del generator. Genera la SBOM principale in un passaggio separato e revisionato oppure committala nel repository. comment e sarif sono entrambi impostati su false di default; le PR da fork ricevono comunque il Job Summary completo quando il permesso per i commenti non è disponibile. Consulta il riferimento dell'Action per ogni input/output, il pinning degli SHA, l'upload SARIF, i permessi e il comportamento di sicurezza.
sbom-diff: stage: test script: - syft . -o json > current.json - sbomlyze baseline.json current.json --policy policy.json --json > sbom-report.json - sbomlyze baseline.json current.json --format junit > sbom-junit.xml artifacts: paths: - sbom-report.json reports: junit: sbom-junit.xml when: always
### Avviso di deriva dell'integrità```bash
# Alert on any integrity drift (CI example)
if sbomlyze baseline.json current.json --json | jq -e '.diff.drift_summary.integrity_drift > 0' > /dev/null; then
echo "⚠️ INTEGRITY DRIFT DETECTED - Investigate immediately!"
exit 1
fi
if sbomlyze baseline.json current.json --json | jq -e '.diff.dependencies.depth_summary.depth_3_plus > 0' > /dev/null; then echo "⚠️ New deep transitive dependencies detected - Review required!" fi
### Compliance Gate```bash
# Fail the build if the SBOM doesn't meet minimum-element requirements
sbomlyze current.json --policy compliance-policy.json
# where compliance-policy.json sets min_overall_compliance / min_ntia_score / etc.
| Code | Significato |
|---|---|
| 0 | Successo, nessuna differenza o violazione |
| 1 | Differenze trovate (eventuali componenti aggiunti/rimossi/modificati), violazioni delle policy o errori |
Nota: In modalità diff, il codice di uscita 1 viene restituito ogni volta che vengono rilevate modifiche ai componenti, anche senza un file di policy. Ciò lo rende utilizzabile come un semplice gate "è cambiato qualcosa?" nella CI.
syft nginx:1.25-alpine -o json > nginx-125.json syft nginx:1.26-alpine -o json > nginx-126.json
sbomlyze nginx-125.json nginx-126.json
### Audit delle licenze```bash
# Check for GPL licenses in new dependencies
cat > audit-policy.json << EOF
{
"deny_licenses": ["GPL-2.0", "GPL-3.0", "LGPL-2.1", "LGPL-3.0"],
"require_licenses": true
}
EOF
sbomlyze old.json new.json --policy audit-policy.json
cat > no-drift.json << EOF { "max_added": 0, "max_removed": 0, "max_changed": 0 } EOF
sbomlyze baseline.json current.json --policy no-drift.json
### Verifica di conformità```bash
# Score an SBOM and enforce a minimum
sbomlyze image.json --compliance
cat > compliance-policy.json << EOF
{
"min_ntia_score": 90,
"min_overall_compliance": 80
}
EOF
sbomlyze image.json --policy compliance-policy.json
syft alpine:latest -o json > alpine-syft.json sbomlyze convert alpine-syft.json --to cyclonedx -o alpine-cdx.json
sbomlyze convert vendor-sbom.cdx.json --to spdx > vendor-sbom.spdx.json
sbomlyze convert input.json --to spdx | jq '.packages | length'
### Esplora SBOM nel browser```bash
# Generate SBOM and explore in web UI
syft alpine:latest -o json > alpine.json
# Start web server
sbomlyze -web
# Then open http://localhost:8080 and drag-drop alpine.json
sbomlyze alpine.json -i
## Sviluppo
### Esegui i test```bash
make test
# or
go test -v ./...
make lint # runs go vet + golangci-lint + staticcheck make vulncheck # runs govulncheck for known CVEs
### Compilazione```bash
make build-quick
# or
go build -o sbomlyze ./cmd/sbomlyze
make all # Run test, lint, and build make test # Run all tests with race detector make lint # Run go vet, golangci-lint, and staticcheck make vulncheck # Run govulncheck for known vulnerabilities make build # Build with goreleaser (snapshot) make build-quick # Quick build for development make snapshot-test # Run snapshot tests only make update-snapshot # Update snapshot golden files make clean # Remove build artifacts
## Contributing
I contributi sono benvenuti! Le issue adatte per iniziare sono etichettate come [`good first issue`](https://github.com/rezmoss/sbomlyze/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). Consulta [CONTRIBUTING.md](https://github.com/rezmoss/sbomlyze/blob/HEAD/CONTRIBUTING.md) se presente e sentiti libero di aprire un'issue o una discussione per proporre modifiche.
[ci]: https://github.com/rezmoss/sbomlyze/actions/workflows/ci.yml
[ci-img]: https://github.com/rezmoss/sbomlyze/actions/workflows/ci.yml/badge.svg
[marketplace]: https://github.com/marketplace/actions/sbomlyze-diff
[marketplace-img]: https://img.shields.io/badge/Marketplace-SBOMlyze%20Diff-blue?logo=github
[release]: https://github.com/rezmoss/sbomlyze/releases
[release-img]: https://img.shields.io/github/v/release/rezmoss/sbomlyze
[go-report]: https://goreportcard.com/report/github.com/rezmoss/sbomlyze
[go-report-img]: https://goreportcard.com/badge/github.com/rezmoss/sbomlyze
[license]: https://raw.githubusercontent.com/rezmoss/sbomlyze/main/LICENSE
[license-img]: https://img.shields.io/badge/License-Apache%202.0-blue.svg
[download]: https://github.com/rezmoss/sbomlyze/releases
[download-img]: https://img.shields.io/github/downloads/rezmoss/sbomlyze/total
[scorecard]: https://scorecard.dev/viewer/?uri=github.com/rezmoss/sbomlyze
[scorecard-img]: https://api.scorecard.dev/projects/github.com/rezmoss/sbomlyze/badge
| Formato | Valore --to | Output |
|---|
| CycloneDX 1.5 | cyclonedx o cdx | CycloneDX JSON con metadati, dipendenze e proprietà |
| SPDX 2.3 | spdx | SPDX JSON con pacchetti, relazioni e riferimenti esterni |
| Syft | syft | Syft JSON con artefatti, relazioni, sorgente e informazioni sulla distribuzione |
| Riscontro | Descrizione |
|---|
| Mancata corrispondenza del contesto di scansione | Avvisa se la versione dello schema o l'ambito di scansione sono cambiati tra gli SBOM |
| Delta della superficie d'attacco | Variazioni del conteggio di pacchetti, file e relazioni con percentuali |
| Ecosistemi scomparsi/nuovi | Tipi di pacchetti completamente comparsi o scomparsi |
| Migrazione OS/distro | Rileva cambiamenti del sistema operativo tra le scansioni |
| Analisi delle modifiche di versione | Conta upgrade e downgrade, classifica le modifiche come major/minor/patch |
| Downgrade di versione | Segnala i downgrade come segnale di sicurezza con dettagli sui componenti |
| Contesto del drift di integrità | Scompone il drift di integrità per tipo di pacchetto con indicazioni sul rischio |
| Pattern di percorso dominanti | Modifiche concentrate per tipo e percorso del filesystem |
| Aree critiche di rimozione/aggiunta | Directory principali interessate dalle modifiche |
| Tipi stabili | Tipi di pacchetti con conteggi identici (core invariato) |
| Spostamenti delle categorie di licenza | Variazioni nell'equilibrio tra copyleft e licenze permissive |
| Lacune del catalogatore | Scanner che hanno trovato pacchetti in Before ma nessuno in After |
| Porta | Indirizzi in ascolto (Raggiungibili dalla rete locale/VPC interna) | Processo | Protocollo (revisione manuale del codice) | Sorgente (analisi statica) |
|---|
| 22 | 0.0.0.0:22:: :22 | /usr/sbin/sshd | SSH-2.0-OpenSSH_8.2p1 | openssh-server |
| 25 | 127.0.0.1:25::1 :25 | /usr/sbin/mas… | SMTP | exim4-daemon-light |
| 53 | 127.0.0.1:53127.0.1.1:53[::1]:53 | /usr/sbin/named | DNS | bind9 |
| 80 | 0.0.0.0:80:: :80 | /usr/sbin/ngi… | HTTP/1.1 | nginx |
| 443 | 0.0.0.0:443:: :443 | /usr/sbin/ngi… | TLS/SSL | nginx |
| 683 | 127.0.0.1:683[::1]:683 | ambrosia | Custom | ambrosia |
| 25565 | 0.0.0.0:25565:: :25565 | java | Minecraft | fabric |
| 27017 | 127.0.0.1:27017[::1]:27017 | go-exlore | MongoDB | mongod |
| sbomlyze image.json --policy compliance-policy.json |
| Tipo | Indicatore | Descrizione | Severità |
|---|
| Versione | 📦 | Numero di versione modificato | Normale |
| Integrità | ⚠️ | Hash modificato SENZA cambio di versione | Alta - investigare! |
| Metadati | 📝 | Solo metadati (licenze, ecc.) modificati | Bassa |
| Funzionalità | Descrizione |
|---|
| Caricamento tramite trascinamento | Rilascia qualsiasi file SBOM (Syft, CycloneDX, SPDX) sulla pagina (fino a 500MB) |
| Albero delle dipendenze | Vista ad albero interattiva con navigazione espandi/comprimi (paginata per oltre 5000 componenti) |
| Dettagli dei componenti | Visualizza licenze, hash, dipendenze, informazioni sul fornitore, numero di file |
| Vista JSON grezzo | JSON con evidenziazione della sintassi per ogni componente |
| Ricerca avanzata | Cerca in tutti i campi, inclusi i dati JSON grezzi |
| Pannello delle statistiche | Metriche di copertura, categorie di licenza, distribuzione delle lingue |
| Esplora file system | Sfoglia i file all'interno dell'SBOM con navigazione delle directory, ricerca e filtro per layer |