Torna agli aggiornamenti
New releaseJul 25, 2026

sbomlyze v0.3.5

git diff per il tuo SBOM , confronta le distinte dei materiali di CycloneDX/SPDX/Syft, rileva manomissioni, e blocca la CI

Condividi

sbomlyze

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]

SBOMlyze blocca una modifica dell'hash a parità di versione in una pull request reale

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 - --compliance analizza e valuta l'SBOM generato senza un file temporaneo. Confrontalo con una baseline per classificare la deriva e controllare la tua pipeline.

Avvio rapido con GitHub Action

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

Script di installazione

Lo script di installazione scarica il binario corretto per il tuo sistema operativo/architettura:```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

**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

Dalla release binaria

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

Compilazione dal sorgente```bash

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

Utilizzo```

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)

📦 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

#### 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

Formati di destinazione supportati

FormatoValore --toOutput
CycloneDX 1.5cyclonedx o cdxCycloneDX JSON con metadati, dipendenze e proprietà
SPDX 2.3spdxSPDX JSON con pacchetti, relazioni e riferimenti esterni
SyftsyftSyft JSON con artefatti, relazioni, sorgente e informazioni sulla distribuzione

Cosa viene preservato

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.

Modalità Diff (Due File)

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 ⚠️

Risultati chiave del diff

In modalità diff, sbomlyze genera automaticamente insight più ricchi confrontando entrambi gli SBOM:

RiscontroDescrizione
Mancata corrispondenza del contesto di scansioneAvvisa se la versione dello schema o l'ambito di scansione sono cambiati tra gli SBOM
Delta della superficie d'attaccoVariazioni del conteggio di pacchetti, file e relazioni con percentuali
Ecosistemi scomparsi/nuoviTipi di pacchetti completamente comparsi o scomparsi
Migrazione OS/distroRileva cambiamenti del sistema operativo tra le scansioni
Analisi delle modifiche di versioneConta upgrade e downgrade, classifica le modifiche come major/minor/patch
Downgrade di versioneSegnala 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 dominantiModifiche concentrate per tipo e percorso del filesystem
Aree critiche di rimozione/aggiuntaDirectory principali interessate dalle modifiche
Tipi stabiliTipi di pacchetti con conteggi identici (core invariato)
Spostamenti delle categorie di licenzaVariazioni nell'equilibrio tra copyleft e licenze permissive
Lacune del catalogatoreScanner che hanno trovato pacchetti in Before ma nessuno in After

Campioni di pacchetti per tipo

I componenti aggiunti e rimossi sono raggruppati per tipo di pacchetto con elenchi di esempio, rendendo facile vedere cosa è cambiato in ogni ecosistema.

Punteggio di conformità

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

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

### 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
}
PortaIndirizzi in ascolto (Raggiungibili dalla rete locale/VPC interna)ProcessoProtocollo (revisione manuale del codice)Sorgente (analisi statica)
220.0.0.0:22
:: :22
/usr/sbin/sshdSSH-2.0-OpenSSH_8.2p1openssh-server
25127.0.0.1:25
::1 :25
/usr/sbin/mas…SMTPexim4-daemon-light
53127.0.0.1:53
127.0.1.1:53
[::1]:53
/usr/sbin/namedDNSbind9
800.0.0.0:80
:: :80
/usr/sbin/ngi…HTTP/1.1nginx
4430.0.0.0:443
:: :443
/usr/sbin/ngi…TLS/SSLnginx
683127.0.0.1:683
[::1]:683
ambrosiaCustomambrosia
255650.0.0.0:25565
:: :25565
javaMinecraftfabric
27017127.0.0.1:27017
[::1]:27017
go-exloreMongoDBmongod
sbomlyze image.json --policy compliance-policy.json
## 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):

  • lodash (depth 2) via: [app express lodash]
  • underscore (depth 3) via: [app express lodash underscore]
  • deep-lib (depth 4) via: [app express lodash underscore deep-lib]

📊 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
    }
  }
}

Rilevamento del drift

sbomlyze classifica le modifiche dei componenti in tre tipi di drift, aiutandoti a distinguere gli aggiornamenti normali da modifiche potenzialmente sospette.

Tipi di drift

TipoIndicatoreDescrizioneSeverità
Versione📦Numero di versione modificatoNormale
Integrità⚠️Hash modificato SENZA cambio di versioneAlta - investigare!
Metadati📝Solo metadati (licenze, ecc.) modificatiBassa

Drift di integrità (Segnale di sicurezza)

Il drift di integrità si verifica quando l'hash di un componente cambia ma la sua versione rimane la stessa. Questo potrebbe indicare:

  • Attacco alla supply chain: Il pacchetto è stato sostituito con una versione malevola
  • Rebuild senza incremento di versione: Legittimo ma cattiva pratica
  • Ambiente di build differente: Problemi di riproducibilità```bash

Example output with integrity drift

~ 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

Get drift summary

sbomlyze before.json after.json --json | jq '.diff.drift_summary'

Check for integrity drift in CI

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:

  • Nuovi duplicati: Componenti che sono diventati duplicati nel nuovo SBOM
  • Duplicati risolti: Gruppi di duplicati che sono stati consolidati
  • Aggiunte/rimozioni di versioni: Modifiche di versione all'interno di gruppi di duplicati esistenti

Rilevamento delle collisioni

Le collisioni sono corrispondenze di identità ambigue in cui i componenti condividono lo stesso ID ma hanno caratteristiche in conflitto:

TipoDescrizione
Nome non corrispondenteNomi di componenti diversi mappati allo stesso ID di identità
Hash non corrispondenteLa stessa versione di un componente ha hash diversi (possibile manomissione)

SBOMlyze SBOM Explorer (TUI)```bash

sbomlyze sbom.json -i

![interactive-sbom](https://assets.kitploit.com/production/public/readmes/12637/d28ec876b78778fce19967cad0a41a5ebd0acb43ad4dd0aeb7837ff5204b9903.gif)

### 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.

Screenshot 2026-02-06 at 17 08 13

Funzionalità dell'interfaccia web

FunzionalitàDescrizione
Caricamento tramite trascinamentoRilascia qualsiasi file SBOM (Syft, CycloneDX, SPDX) sulla pagina (fino a 500MB)
Albero delle dipendenzeVista ad albero interattiva con navigazione espandi/comprimi (paginata per oltre 5000 componenti)
Dettagli dei componentiVisualizza licenze, hash, dipendenze, informazioni sul fornitore, numero di file
Vista JSON grezzoJSON con evidenziazione della sintassi per ogni componente
Ricerca avanzataCerca in tutti i campi, inclusi i dati JSON grezzi
Pannello delle statisticheMetriche di copertura, categorie di licenza, distribuzione delle lingue
Esplora file systemSfoglia i file all'interno dell'SBOM con navigazione delle directory, ricerca e filtro per layer

Statistiche visualizzate

L'interfaccia web mostra statistiche complete tra cui:

  • Conteggi dei componenti per tipo di pacchetto (npm, apk, pypi, ecc.)
  • Distribuzione delle licenze con suddivisione per categoria (copyleft, permissive, pubblico dominio)
  • Metriche di copertura con barre di avanzamento visive:
    • Copertura PURL (presenza dell'URL del pacchetto)
    • Copertura CPE (prontezza per la scansione delle vulnerabilità)
    • Copertura delle licenze
    • Copertura hash/integrità
  • Suddivisione per linguaggio (per SBOM generati da Syft)
  • Statistiche delle relazioni (contains, dependency-of, evident-by)
  • Avvisi di rilevamento duplicati

Casi d'uso

Revisione della sicurezza

  • Carica un SBOM ed esplora l'intero albero delle dipendenze
  • Controlla la copertura CPE per assicurarti che la scansione delle vulnerabilità funzioni
  • Esamina i componenti senza licenze o hash

Audit di conformità

  • Cerca licenze specifiche in tutti i componenti
  • Visualizza la distribuzione delle categorie di licenza (copyleft vs permissive)
  • Esporta il JSON grezzo per la documentazione

Debug in fase di sviluppo

  • Esplora quali pacchetti sono inclusi nella tua immagine
  • Controlla le dipendenze transitive
  • Verifica che i metadati del pacchetto siano corretti

Esplora file system

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):

  • Navigazione ad albero delle directory con percorso a briciole di pane
  • Ricerca file con supporto di sottostringhe e pattern glob (es. *.so, /usr/lib/**/*.conf)
  • Filtro per layer per SBOM di immagini container (sfoglia i file per layer dell'immagine)
  • Relazioni componente-file (quale componente possiede quali file)
  • Statistiche dei file per tipo, tipo MIME, estensione e layer
  • Rilevamento file senza proprietario (file non associati ad alcun componente)

Opzioni

-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.

--compliance

Valuta 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

Formato SARIF

Genera un report SARIF 2.1.0 adatto per GitHub Code Scanning. Le regole rilevate includono:

  • integrity-drift (errore): hash modificato senza variazione di versione
  • deep-dependency (avviso): nuova dipendenza a profondità 3+
  • new-component / removed-component (nota): aggiunte/rimozioni di componenti
  • version-change (nota): aggiornamenti di versione dei componenti
  • policy-violation (errore/avviso): violazioni delle regole di policy

Formato JUnit

Genera XML JUnit con casi di test per:

  • Nessun drift di integrità
  • Nessuna dipendenza transitiva profonda (profondità 3+)
  • Conformità alle policy (un caso di test per violazione)
  • Riepilogo del diff SBOM

Formato Markdown

Genera un report Markdown con:

  • Tabella di confronto SBOM affiancata (file, dimensione, OS, metriche di copertura)
  • Dettagli del contesto di scansione
  • Risultati chiave
  • Pacchetti aggiunti/rimossi raggruppati per tipo (in sezioni comprimibili)
  • Riepilogo del drift, profondità delle dipendenze e violazioni delle policy

Formato HTML

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.

Formato Patch

Genera un array di operazioni JSON Patch RFC 6902 (add, remove, replace) che rappresentano il diff.

--json

Abbreviazione per --format json. Produce i risultati in formato JSON per il consumo programmatico.```bash

Stats as JSON

sbomlyze image.json --json

Diff as 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

📦 SBOM Statistics

==================

Total Components: 0

...

⚠️ Parse Warnings (1):

[broken.json] unknown SBOM format

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

Motore di Policy

Crea policy per applicare regole nelle pipeline CI/CD. sbomlyze esce con codice 1 quando si verificano violazioni.

Formato del File di Policy```json

{ "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
}

Output delle Violazioni di Policy```

!! 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.

Confronto tra formati

sbomlyze può confrontare SBOM in formati diversi:```bash

Compare Syft output with CycloneDX

sbomlyze syft-output.json cyclonedx-output.json

Compare SPDX with Syft

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.

GitLab CI```yaml

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

Avviso di dipendenza profonda```bash

Alert on new deep transitive dependencies

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.

Codici di uscita

CodeSignificato
0Successo, nessuna differenza o violazione
1Differenze 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.

Esempi

Confronta le immagini Docker```bash

Generate SBOMs

syft nginx:1.25-alpine -o json > nginx-125.json syft nginx:1.26-alpine -o json > nginx-126.json

Compare

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

Rilevamento della Deriva delle Dipendenze```bash

Detect any changes (strict mode for no drift)

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

Converti i formati SBOM```bash

Convert a Syft SBOM to CycloneDX for tools that require it

syft alpine:latest -o json > alpine-syft.json sbomlyze convert alpine-syft.json --to cyclonedx -o alpine-cdx.json

Convert CycloneDX to SPDX for compliance workflows

sbomlyze convert vendor-sbom.cdx.json --to spdx > vendor-sbom.spdx.json

Pipe conversion output directly

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

Esplorazione interattiva del terminale```bash

Explore with keyboard navigation

sbomlyze alpine.json -i

Navigate with arrow keys, search with '/', view details with Enter

## Sviluppo

### Esegui i test```bash
make test
# or
go test -v ./...

Lint```bash

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

Comandi Make```bash

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

Categorie