
sbomlyze v0.3.5
git diff para sua SBOM ,compare listas de materiais CycloneDX/SPDX/Syft, detecte adulteração, e controle a CI
sbomlyze
git diff para a sua SBOM. Compare duas Listas de Materiais de Software e veja o que mudou entre builds, versões e lançamentos.
O sbomlyze compara hashes de componentes, não apenas strings de versão. Quando um invasor troca um pacote sem incrementar a versão, o sbomlyze sinaliza isso. Geradores e scanners de vulnerabilidades não detectam isso.
[![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]
Veja por que esse sinal é diferente de um diff de manifesto ou de um diff comum de componentes em Diff de manifesto vs. diff de SBOM vs. desvio de integridade.
Geradores criam SBOMs e scanners encontram CVEs. O sbomlyze informa o que mudou entre duas SBOMs e se você pode confiar nisso. Execute-o após seu gerador:
syft image:tag -o cyclonedx-json | sbomlyze - --complianceanalisa e pontua a SBOM gerada sem arquivo temporário. Compare-a com uma linha de base para classificar desvios e controlar seu pipeline.
Início rápido da GitHub Action
Adicione [SBOMlyze Diff do GitHub Marketplace][marketplace] para comparar uma SBOM versionada
ou gerada separadamente com sua linha de base do git. O SHA imutável abaixo é
a Action v0.5.1 publicada:```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
A Action escreve um Resumo de Job por padrão e pode aplicar políticas, reportar
desvios de integridade, enviar SARIF ou manter um único comentário em pull-request. Consulte
[a referência completa da Action](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md) para entradas, saídas, permissões
e orientações de segurança. Consulte o
[repositório de demonstração ao vivo](https://github.com/rezmoss/sbomlyze-action-demo)
para uma atualização de dependência aprovada e uma alteração de hash de mesma versão bloqueada, com
execuções de workflow públicas e evidências SARIF.
Para dogfood específico de formato, use os exemplos públicos
[Go + SPDX](https://github.com/rezmoss/sbomlyze-go-spdx-demo),
[Node + CycloneDX](https://github.com/rezmoss/sbomlyze-node-cyclonedx-demo) ou
[contêiner](https://github.com/rezmoss/sbomlyze-container-demo). Cada um
contém cinco cenários de revisão reproduzíveis. O
[guia beta de 10 minutos](https://github.com/rezmoss/sbomlyze/blob/HEAD/BETA.md) reúne quatro perguntas focadas sobre ativação e
qualidade de sinal.
Os SBOMs gerados não precisam ser commitados: `baseline: workflow-artifact`
recupera o artefato correspondente mais recente de uma execução bem-sucedida no branch
padrão. Um [workflow complementar do Syft com pin](https://github.com/rezmoss/sbomlyze/blob/HEAD/examples/workflows/syft-companion.yml)
mostra a geração e a publicação da baseline, enquanto o SBOMlyze permanece responsável
pela revisão e pela política.
## Por que sbomlyze?
Muitas ferramentas geram SBOMs. Poucas os comparam, e menos ainda dizem se uma mudança é rotineira ou um sinal de alerta na cadeia de suprimentos. O sbomlyze preenche essa lacuna.
| Capacidade | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| **Diff** de SBOM para SBOM | ✅ | básico | ❌ | ❌ |
| Desvio de **integridade / adulteração** (hash alterado sem mudança de versão) | ✅ | ❌ | ❌ | ❌ |
| Diff de grafo de dependências + risco de profundidade transitiva | ✅ | ❌ | ❌ | ❌ |
| Pontuação de conformidade **NTIA / CISA / BSI** | ✅ | ❌ | ✅ | ❌ |
| Conversão de formatos (Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | parcial |
| Exploradores de **TUI + Web UI** | ✅ | ❌ | ❌ | ❌ |
| Portão de política + SARIF / JUnit / Markdown / HTML / Patch | ✅ | parcial | parcial | parcial |
## Recursos
- **Diff de SBOM**: Compare dois SBOMs e veja componentes adicionados, removidos e alterados de uma só vez
- **Classificação de desvios**: Distinga desvios de versão de **desvios de integridade** (um hash alterado sem mudança de versão, sinalizando adulteração) e desvios de metadados
- **Pontuação de conformidade**: Pontue qualquer SBOM em relação aos elementos mínimos da **NTIA**, **CISA 2025** e **BSI TR-03183**
- **Diff de grafo de dependências**: Rastreie dependências transitivas e a profundidade da cadeia de suprimentos
- **Suporte a múltiplos formatos**: Syft, CycloneDX, SPDX (JSON)
- **Conversão de formatos**: Converta entre formatos CycloneDX, SPDX e Syft
- **Correspondência robusta de identidade**: Precedência PURL → CPE → BOM-ref → namespace/nome
- **Modo estatísticas**: Analise SBOMs individuais para métricas de licença, dependência e integridade
- **Modo TUI interativo**: Explore SBOMs com navegação por teclado e busca
- **Modo Web UI**: Explorador de SBOM baseado em navegador com upload por arrastar e soltar
- **Mecanismo de políticas**: Aplique regras de desvio, licença e pontuação de conformidade em pipelines de CI
- **Action do GitHub Marketplace**: Bloqueie pull-requests com base em desvios de SBOM com Resumo de Job, SARIF e saída opcional de comentário
- **Detecção de duplicatas e colisões**: Encontre múltiplas versões do mesmo pacote e correspondências de identidade ambíguas
- **Múltiplos formatos de saída**: Texto, JSON, SARIF, JUnit XML, Markdown, HTML, JSON Patch
- **Parsing tolerante**: Continue com erros e avisos estruturados
## Instalação
### Homebrew (macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze
Script de instalação
O script de instalação baixa o binário correto para o seu SO/arquitetura:```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
**Opções do instalador:**
| Opção | Descrição |
|--------|-------------|
| `-b <dir>` | Diretório de instalação (padrão: `./bin`) |
| `-d` | Ativar saída de depuração |
| `-v <ver>` | Instalar versão específica (padrão: mais recente) |
O instalador sempre verifica o checksum do release. Quando uma CLI do GitHub compatível
está instalada, ele também verifica a procedência do build do release e falha de forma segura se
essa verificação não for bem-sucedida.
### Instalação via Go```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest
A partir do lançamento binário
Baixe o binário mais recente em GitHub Releases.
A partir da v0.3.7, os arquivos de lançamento são publicados com atestações de artefatos do GitHub. Verifique um download de forma independente com:```bash
gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz
--repo rezmoss/sbomlyze
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml
Instruções de repositórios apt, rpm e apk não assinados foram removidas até que os repositórios suportem verificação de assinatura nativa do gerenciador de pacotes.
**Usuários de macOS:** Remova o sinalizador de quarentena após o download:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze
Compilar a partir do código-fonte```bash
git clone https://github.com/rezmoss/sbomlyze.git cd sbomlyze go build -o sbomlyze ./cmd/sbomlyze
## Início Rápido```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
Uso```
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
## Comandos
### Modo Estatísticas (Arquivo Único)
Analise um SBOM para obter insights sobre componentes, licenças e dependências.```bash
sbomlyze image.json
A saída inclui o contexto da varredura, principais descobertas auto-detectadas e estatísticas:``` 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
#### Principais Descobertas
O sbomlyze gera automaticamente insights sobre o seu SBOM. Para análise de arquivo único, estes incluem:
| Descoberta | Descrição |
|---------|-------------|
| **Detecção de SO/distro** | Identifica o sistema operacional ou distro a partir dos metadados do SBOM |
| **Ecossistema dominante** | Relata quando um tipo de pacote domina (>60% de todos os pacotes) |
| **Pegada do sistema de arquivos** | Número de arquivos rastreados no sistema de arquivos |
| **Densidade de relacionamentos** | Contagens de relacionamentos de contenção e dependência |
| **Locais de maior concentração** | Principais diretórios onde os componentes são encontrados |
| **Perfil de risco de licença** | Detalhamento das porcentagens de licenças permissivas/copyleft/desconhecidas |
| **Avisos de qualidade de dados** | Alertas quando a cobertura de licença (<50%), hash (<50%) ou PURL (<80%) é baixa |
| **Avisos de duplicidade** | Sinaliza grupos de componentes duplicados |
| **Detalhamento do catalogador** | Principais scanners/catalogadores que detectaram componentes (SBOMs Syft) |
#### Métricas de Cobertura
O modo de estatísticas calcula porcentagens de cobertura para avaliação da qualidade dos dados:
| Métrica | Descrição |
|--------|-------------|
| **Cobertura de PURL** | Percentual de componentes com Package URLs |
| **Cobertura de CPE** | Percentual de componentes com CPEs (prontidão para varredura de vulnerabilidades) |
| **Cobertura de licença** | Percentual de componentes com pelo menos uma licença |
| **Cobertura de hash** | Percentual de componentes com hashes de integridade |
#### Categorização de Licenças
As licenças são automaticamente categorizadas em:
| Categoria | Exemplos |
|----------|----------|
| **Copyleft** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **Permissiva** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **Domínio Público** | Dedicações de domínio público |
| **Desconhecida** | Licenças não reconhecidas ou ausentes |
### Modo de Conversão
Converta SBOMs entre os formatos JSON CycloneDX, SPDX e Syft. O formato de entrada é detectado 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
Formatos de Destino Suportados
| Formato | Valor de --to | Saída |
|---|---|---|
| CycloneDX 1.5 | cyclonedx ou cdx | CycloneDX JSON com metadados, dependências e propriedades |
| SPDX 2.3 | spdx | SPDX JSON com pacotes, relacionamentos e referências externas |
| Syft | syft | Syft JSON com artefatos, relacionamentos, origem e informações da distribuição |
O Que É Preservado
A conversão preserva nomes de componentes, versões, PURLs, CPEs, licenças, hashes, informações do fornecedor e relacionamentos de dependência. Campos específicos de formato (ex.: linguagem do Syft, foundBy, locations) são transportados por meio das propriedades do CycloneDX ao converter para CDX.
Modo Diff (Dois Arquivos)
Compare dois SBOMs para ver o que mudou entre as versões.```bash sbomlyze v1.0.json v2.0.json
#### Visão Geral do Diff
O diff começa com uma comparação lado a lado de metadados (nomes de arquivos, tamanhos, informações do SO, informações da ferramenta, contagens de componentes), seguida por detalhes do contexto da varredura quando disponíveis.
#### Saída```
📊 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 ⚠️
Principais Descobertas do Diff
No modo diff, o sbomlyze gera automaticamente insights mais detalhados comparando ambos os SBOMs:
| Descoberta | Descrição |
|---|---|
| Divergência de contexto da varredura | Alerta se a versão do esquema ou o escopo da varredura mudou entre os SBOMs |
| Delta de superfície de ataque | Alterações nas contagens de pacotes, arquivos e relacionamentos com porcentagens |
| Ecossistemas desaparecidos/novos | Tipos de pacotes que apareceram ou desapareceram completamente |
| Migração de SO/distribuição | Detecta mudanças no sistema operacional entre varreduras |
| Análise de mudanças de versão | Conta atualizações vs rebaixamentos, classifica alterações como major/minor/patch |
| Rebaixamentos de versão | Sinaliza rebaixamentos como um sinal de segurança com detalhes dos componentes |
| Contexto de desvio de integridade | Detalha o desvio de integridade por tipo de pacote com orientação de risco |
| Padrões dominantes de caminho | Alterações concentradas por tipo e caminho do sistema de arquivos |
| Pontos críticos de remoção/adição | Principais diretórios afetados pelas alterações |
| Tipos estáveis | Tipos de pacotes com contagens idênticas (núcleo inalterado) |
| Mudanças nas categorias de licença | Alterações no equilíbrio copyleft/permissiva |
| Lacunas do catalogador | Scanners que encontraram pacotes no Before, mas nenhum no After |
Amostras de Pacotes por Tipo
Componentes adicionados e removidos são agrupados por tipo de pacote com listagens de exemplo, facilitando a visualização do que mudou em cada ecossistema.
Pontuação de Conformidade
Pontue qualquer SBOM em relação aos três principais frameworks de elementos mínimos para responder à pergunta que auditores e equipes de aquisição não param de fazer: "Este SBOM está completo o suficiente?"```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
### Frameworks Avaliados
| Framework | Verificações | Requisitos notáveis |
|-----------|--------------|---------------------|
| **NTIA Minimum Elements** (2021) | 7 | nome, versão, fornecedor, IDs exclusivos (PURL/CPE), relações de dependência, autor do SBOM, carimbo de data/hora |
| **CISA 2025 Minimum Elements** (rascunho de agosto de 2025) | 10 | adiciona produtor de software, informações de licença, **hash do componente** e nome da ferramenta além dos requisitos da NTIA |
| **BSI TR-03183-2** (v2.1.0, 2025) | 9 | exige contato do criador do componente, **hash SHA-512**, licenças em formato SPDX e contato do criador do SBOM |
### Apresentação da Pontuação
Cada framework apresenta uma porcentagem (verificações aprovadas / total de verificações) além de uma pontuação geral (média entre os frameworks), com indicadores de status:
| Indicador | Pontuação |
|-----------|-----------|
| 🟢 | ≥ 90% |
| 🟡 | 70–89% |
| 🟠 | 50–69% |
| 🔴 | < 50% |
A saída JSON (`--compliance --json`) inclui o relatório completo com detalhes de aprovação/reprovação por verificação; o formato HTML incorpora o relatório de conformidade na página do relatório.
### Gate de Conformidade na CI
Aplique limites de conformidade por meio do [mecanismo de políticas](#policy-engine). Definir qualquer limite aciona a avaliação de conformidade sem a opção `--compliance`:```json
{
"min_ntia_score": 85,
"min_cisa_score": 70,
"min_bsi_score": 80,
"min_overall_compliance": 75
}
O cenário acima é o primeiro da lista:```bash sbomlyze image.json --policy compliance-policy.json
## Diff do Grafo de Dependências
O sbomlyze vai além de simples diffs de lista de componentes para analisar o grafo de dependências completo, detectando riscos na cadeia de suprimentos introduzidos por dependências transitivas.
### Recursos
| Feature | Descrição |
|---------|-------------|
| **Edge diff** | Dependências diretas adicionadas/removidas (A depende de B) |
| **Transitive reachability** | Novas dependências indiretas que aparecem através do grafo |
| **Transitive loss tracking** | Dependências transitivas que foram removidas |
| **Path tracking** | Mostra exatamente como cada nova dependência transitiva é alcançada |
| **Depth tracking** | A quantos saltos cada nova dependência está do seu código |
| **Risk summary** | Dependências com profundidade 3+ sinalizadas como de maior risco |
### Por que a Profundidade Importa
Dependências introduzidas mais profundamente no grafo são:
- Mais difíceis de auditar e revisar
- Frequentemente incluídas sem aprovação explícita
- Vetores comuns para ataques à cadeia de suprimentos (por exemplo, incidente do event-stream)
O resumo de profundidade ajuda a priorizar a revisão:
| Profundidade | Nível de Risco | Descrição |
|-------|------------|-------------|
| **1** | Baixo | Dependências diretas (você escolheu estas) |
| **2** | Médio | Dependências das suas dependências |
| **3+** | Alto ⚠️ | Dependências transitivas profundas - revise com cuidado |
### Exemplo: Detectando Dependências Transitivas Profundas```bash
# Before: app -> express (simple, 1 dep)
# After: app -> express -> lodash -> underscore -> deep-lib (chain of 4)
sbomlyze before.json after.json
I'm ready to translate, but I notice the input chunk appears to be empty — there is no source text after "INPUT:" to translate. Please provide the actual Markdown content for chunk 37, and I'll translate it into Portuguese following all the specified rules.``` 🔗 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 ⚠️
### Saída JSON para o Grafo de Dependências```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
}
}
}
Detecção de Drift
O sbomlyze classifica mudanças de componentes em três tipos de drift, ajudando você a distinguir atualizações normais de alterações potencialmente suspeitas.
Tipos de Drift
| Tipo | Indicador | Descrição | Severidade |
|---|---|---|---|
| Versão | 📦 | Número da versão alterado | Normal |
| Integridade | ⚠️ | Hash alterado SEM mudança de versão | Alta - investigue! |
| Metadados | 📝 | Somente metadados (licenças, etc.) alterados | Baixa |
Drift de Integridade (Sinal de Segurança)
O drift de integridade ocorre quando o hash de um componente muda, mas sua versão permanece a mesma. Isso pode indicar:
- Ataque à cadeia de suprimentos: O pacote foi substituído por uma versão maliciosa
- Reconstrução sem incremento de versão: Legítimo, porém má prática
- Ambiente de build diferente: Problemas de reprodutibilidade```bash
Example output with integrity drift
~ suspicious-pkg ⚠️ [INTEGRITY] hash[SHA256]: abc123 -> def456
**Recomendação**: Sempre investigue o desvio de integridade. Pode ser benigno, mas é um sinal-chave para a segurança da cadeia de suprimentos.
### Saída JSON para o Desvio
O resumo do desvio está dentro do objeto `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
}
}
}
Extraindo resumo de 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'
## Detecção de Duplicatas e Colisões
### Detecção de Duplicatas
sbomlyze identifica componentes com a mesma identidade, mas versões diferentes dentro de um SBOM:```
⚠️ Duplicates Found: 2
lodash: [4.17.20, 4.17.21]
express: [4.18.0, 4.19.2]
No modo diff, o rastreamento de diff de versões duplicadas:
- Novas duplicatas: Componentes que se tornaram duplicados no novo SBOM
- Duplicatas resolvidas: Grupos de duplicatas que foram consolidados
- Adições/remoções de versão: Mudanças de versão dentro de grupos de duplicatas existentes
Detecção de Colisões
Colisões são correspondências de identidade ambíguas em que componentes compartilham o mesmo ID, mas têm características conflitantes:
| Tipo | Descrição |
|---|---|
| Incompatibilidade de nome | Nomes de componentes diferentes mapeados para o mesmo ID de identidade |
| Incompatibilidade de hash | A mesma versão de um componente tem hashes diferentes (possível adulteração) |
SBOMlyze SBOM Explorer (TUI)```bash
sbomlyze sbom.json -i

### Atalhos de Teclado da TUI
#### Navegação
| Tecla | Ação |
|-----|--------|
| `↑` / `k` | Mover para cima |
| `↓` / `j` | Mover para baixo |
| `PgUp` / `Ctrl+u` | Meia página acima |
| `PgDn` / `Ctrl+d` | Meia página abaixo |
| `Home` / `g` | Ir para o topo |
| `End` / `G` | Ir para o final |
| `Enter` | Ver detalhes do componente |
| `Esc` / `Backspace` | Voltar |
| `q` / `Ctrl+c` | Sair |
#### Pesquisa e Filtro
| Tecla | Ação |
|-----|--------|
| `/` | Pesquisa profunda em todos os campos (nome, PURL, licenças, JSON bruto) |
| `t` | Filtrar por tipo de pacote (npm, apk, golang, pypi, etc.) |
| `c` | Limpar todos os filtros ativos |
#### Visualizações
| Tecla | Contexto | Ação |
|-----|---------|--------|
| `j` | Visualização de detalhes | Ver JSON bruto do componente com realce de sintaxe |
| `d` | Visualização JSON | Voltar para a visualização de detalhes |
| `Enter` | Visualização JSON | Exportar JSON do componente para arquivo |
| `?` | Qualquer visualização | Mostrar ajuda com todos os atalhos de teclado |
### Visualização de Detalhes do Componente
A visualização de detalhes mostra informações abrangentes do componente:
- Informações do pacote (nome, versão, PURL, namespace, fornecedor)
- Licenças com indicadores visuais
- Hashes de integridade
- CPEs (Common Platform Enumeration)
- Lista de dependências
- Identificadores (ID, BOM-ref, SPDX-ID)
## Modo Web UI
Inicie um explorador de SBOM baseado em navegador com upload de arquivo por arrastar e soltar:```bash
# Start web server on default port 8080
sbomlyze -web
# Start on custom port
sbomlyze -web --port 3000
Em seguida, abra http://localhost:8080 no seu navegador.
Funcionalidades da Interface Web
| Funcionalidade | Descrição |
|---|---|
| Envio por Arrastar e Soltar | Solte qualquer arquivo SBOM (Syft, CycloneDX, SPDX) na página (até 500MB) |
| Árvore de Dependências | Visualização em árvore interativa com navegação expandir/contrair (paginada para >5000 componentes) |
| Detalhes do Componente | Visualize licenças, hashes, dependências, informações do fornecedor, contagem de arquivos |
| Visualização de JSON Bruto | JSON com realce de sintaxe para cada componente |
| Pesquisa Profunda | Pesquise em todos os campos, incluindo dados JSON brutos |
| Painel de Estatísticas | Métricas de cobertura, categorias de licença, distribuição de linguagens |
| Navegador do Sistema de Arquivos | Navegue pelos arquivos dentro do SBOM com navegação de diretórios, pesquisa e filtragem por camadas |
Estatísticas Exibidas
A interface web exibe estatísticas abrangentes, incluindo:
- Contagens de componentes por tipo de pacote (npm, apk, pypi, etc.)
- Distribuição de licenças com detalhamento por categoria (copyleft, permissiva, domínio público)
- Métricas de cobertura com barras de progresso visuais:
- Cobertura de PURL (presença do URL do pacote)
- Cobertura de CPE (prontidão para escaneamento de vulnerabilidades)
- Cobertura de licenças
- Cobertura de hash/integridade
- Divisão por linguagem (para SBOMs gerados por Syft)
- Estatísticas de relacionamento (contains, dependency-of, evident-by)
- Detecção de duplicatas (avisos)
Casos de Uso
Revisão de Segurança
- Carregue um SBOM e explore a árvore de dependências completa
- Verifique a cobertura de CPE para garantir que o escaneamento de vulnerabilidades funciona
- Revise componentes sem licenças ou hashes
Auditoria de Conformidade
- Pesquise licenças específicas em todos os componentes
- Visualize a distribuição de categorias de licença (copyleft vs permissiva)
- Exporte JSON bruto para documentação
Depuração de Desenvolvimento
- Explore quais pacotes estão incluídos na sua imagem
- Verifique dependências transitivas
- Verifique se os metadados do pacote estão corretos
Navegador do Sistema de Arquivos
A interface web inclui um navegador completo do sistema de arquivos para explorar arquivos dentro de SBOMs (particularmente útil para SBOMs gerados por Syft com metadados de arquivo):
- Navegação em árvore de diretórios com trilha de breadcrumbs
- Pesquisa de arquivos com suporte a padrões de substring e glob (por exemplo,
*.so,/usr/lib/**/*.conf) - Filtragem por camadas para SBOMs de imagens de contêiner (navegue pelos arquivos por camada da imagem)
- Relacionamentos componente-arquivo (qual componente possui quais arquivos)
- Estatísticas de arquivos por tipo, tipo MIME, extensão e camada
- Detecção de arquivos sem dono (arquivos não associados a nenhum componente)
Opções
-i (Modo Interativo)
Inicie o explorador TUI baseado em terminal para navegar por SBOMs com controles de teclado.```bash sbomlyze image.json -i
Features: tree navigation, component details, search, license/hash inspection.
### `-web` (Modo Servidor Web)
Inicie um servidor web para exploração de SBOM baseada em navegador.```bash
# Default port 8080
sbomlyze -web
# Custom port
sbomlyze -web --port 3000
A interface web oferece upload por arrastar e soltar, visualização em árvore interativa, busca avançada e painel de estatísticas.
--compliance
Pontue o SBOM de acordo com as estruturas de elementos mínimos da NTIA, CISA 2025 e BSI TR-03183. Consulte Pontuação de conformidade.```bash sbomlyze image.json --compliance sbomlyze image.json --compliance --json
### `--format` / `-f`
Selecione o formato de saída. Sete formatos estão disponíveis:
| Formato | Flag | Descrição | Melhor Para |
|--------|------|-------------|----------|
| **text** | `--format text` (padrão) | Saída de terminal legível por humanos | Inspeção local |
| **json** | `--json` ou `--format json` | JSON estruturado | Pipelines de CI, scripting |
| **sarif** | `--format sarif` | SARIF 2.1.0 para GitHub Code Scanning | Integração com GitHub |
| **junit** | `--format junit` | Resultados de teste em XML JUnit | Dashboards de teste de CI |
| **markdown** | `--format markdown` | Relatório Markdown pronto para comentários em PR | Comentários em pull requests |
| **html** | `--format html` | Relatório HTML autocontido (CSS/JS inline) | Auditores, relatórios compartilháveis |
| **patch** | `--format patch` | Operações JSON Patch (RFC 6902) | Aplicação de patches programática |```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
Gera um relatório SARIF 2.1.0 adequado para o GitHub Code Scanning. As regras detectadas incluem:
integrity-drift(erro): hash alterado sem mudança de versãodeep-dependency(aviso): nova dependência na profundidade 3+new-component/removed-component(nota): adições/remoções de componentesversion-change(nota): atualizações de versão de componentespolicy-violation(erro/aviso): violações de regras de política
Formato JUnit
Gera XML JUnit com casos de teste para:
- Sem desvio de integridade
- Sem dependências transitivas profundas (profundidade 3+)
- Conformidade com políticas (um caso de teste por violação)
- Resumo do diff do SBOM
Formato Markdown
Gera um relatório Markdown com:
- Tabela de comparação lado a lado do SBOM (arquivo, tamanho, SO, métricas de cobertura)
- Detalhes do contexto da varredura
- Principais descobertas
- Pacotes adicionados/removidos agrupados por tipo (em seções recolhíveis)
- Resumo de desvios, profundidade de dependências e violações de políticas
Formato HTML
Gera um único arquivo HTML autônomo (CSS e JavaScript embutidos, sem recursos externos), adequado para envio por e-mail a auditores ou anexação a um release. Inclui o painel de estatísticas, a árvore de dependências, o resumo de desvios e o relatório de conformidade embutido quando --compliance está definido.
Formato Patch
Gera um array de operações JSON Patch RFC 6902 (add, remove, replace) representando o diff.
--json
Atalho para --format json. Produz resultados em formato JSON para consumo programático.```bash
Stats as JSON
sbomlyze image.json --json
Diff as JSON
sbomlyze before.json after.json --json
**Estrutura do JSON de estatísticas:**```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>
Aplicar as regras de política e falhar a CI se forem violadas.```bash sbomlyze before.json after.json --policy policy.json
Consulte [Mecanismo de Política](#policy-engine) para obter detalhes.
### `--strict`
Falha imediatamente em qualquer erro de análise.```bash
sbomlyze broken.json --strict
# Error parsing broken.json: unknown SBOM format
# exit status 1
--tolerant (padrão)
Continuar o processamento em caso de erros, coletar avisos.```bash sbomlyze broken.json --tolerant
📦 SBOM Statistics
==================
Total Components: 0
...
⚠️ Parse Warnings (1):
[broken.json] unknown SBOM format
Os avisos de parse incluem informações estruturadas: o arquivo de origem, uma mensagem legível por humanos e, opcionalmente, o campo que causou o problema.
### `--no-pager`
Desativa a paginação automática da saída. Útil ao canalizar a saída para outro comando ou ao executar em ambientes não interativos.```bash
sbomlyze image.json --no-pager
sbomlyze before.json after.json --no-pager | head -20
Mecanismo de Políticas
Crie políticas para aplicar regras em pipelines de CI/CD. O sbomlyze é encerrado com o código 1 quando ocorrem violações.
Formato do Arquivo de Políticas```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 }
### Regras de Política
| Regra | Tipo | Descrição |
|------|------|-------------|
| `max_added` | int | Máximo de novos componentes permitidos (0 = ilimitado) |
| `max_removed` | int | Máximo de componentes removidos permitidos (0 = ilimitado) |
| `max_changed` | int | Máximo de componentes alterados permitidos (0 = ilimitado) |
| `deny_licenses` | []string | Lista de identificadores de licença proibidos |
| `require_licenses` | bool | Exigir que todos os componentes *adicionados* tenham licenças (verifica apenas componentes recém-adicionados no modo diff) |
| `deny_duplicates` | bool | Falhar se existirem pacotes duplicados no resultado |
| `deny_integrity_drift` | bool | Falhar se o hash do componente mudou sem alteração de versão (risco de cadeia de suprimentos) |
| `max_depth` | int | Falhar se houver novas dependências transitivas em profundidade >= N (0 = ilimitado) |
| `warn_supplier_change` | bool | Avisar (não falhar) se o fornecedor/autor do componente mudou |
| `warn_new_transitive` | bool | Avisar (não falhar) sobre quaisquer novas dependências transitivas |
| `min_ntia_score` | int | Falhar se a pontuação de conformidade NTIA estiver abaixo disso (0-100, 0 = desativado) |
| `min_cisa_score` | int | Falhar se a pontuação de conformidade CISA estiver abaixo disso (0-100, 0 = desativado) |
| `min_bsi_score` | int | Falhar se a pontuação de conformidade BSI estiver abaixo disso (0-100, 0 = desativado) |
| `min_overall_compliance` | int | Falhar se a pontuação geral de conformidade estiver abaixo disso (0-100, 0 = desativado) |
> Definir qualquer limite `min_*_score` aciona automaticamente a avaliação de conformidade, mesmo sem a flag `--compliance`.
### Exemplo: Política Estrita```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
}
Saída de Violações de Política```
!! 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
## Formatos de SBOM Suportados
| Formato | Detecção de Arquivo | Identificadores Extraídos |
|--------|----------------|----------------------|
| Syft (nativo) | chave JSON `"artifacts"` + uma entre `"source"`, `"distro"`, `"descriptor"` | PURL, CPE, name |
| CycloneDX | chave JSON `"bomFormat"` = `"CycloneDX"`, ou `"$schema"` contendo `cyclonedx` | PURL, CPE, BOM-ref, group (namespace) |
| SPDX | chave JSON `"spdxVersion"` começando com `"SPDX-"` | PURL, CPE, SPDXID |
Todos os formatos devem ser JSON. O suporte a XML não está disponível atualmente.
### Conversão de Formatos
sbomlyze pode converter entre qualquer um dos três formatos suportados:```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
Consulte Modo de Conversão para detalhes.
Comparação entre Formatos
sbomlyze pode comparar SBOMs em diferentes formatos:```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:** Diferentes formatos de SBOM extraem diferentes níveis de detalhe. Uma comparação entre formatos pode mostrar alterações que refletem diferenças de formato (por exemplo, disponibilidade de campo) em vez de alterações reais no sistema. O sistema de principais descobertas avisará sobre incompatibilidades de contexto de varredura quando detectadas.
## Correspondência de Identidade de Componentes
Os componentes são correspondidos usando um sistema de identidade baseado em precedência:
| Prioridade | Identificador | Exemplo | Descrição |
|----------|------------|---------|-------------|
| 1 | PURL | `pkg:npm/lodash` | URL do pacote (versão removida) |
| 2 | CPE | `cpe:vendor:product` | CPE vendor:product (versão removida) |
| 3 | BOM-ref / SPDXID | `ref:component-123` | bom-ref do CycloneDX ou identificador SPDX |
| 4 | Namespace + Name | `com.example/mypackage` | Grupo/namespace com nome |
| 5 | Name | `simple-package` | Fallback para apenas o nome |
## Integração CI/CD
### GitHub Actions
O SBOMlyze é fornecido como uma Action JavaScript sem dependências. Ele compara um SBOM head
verificado no repositório ou gerado separadamente com o arquivo na base git do pull request,
publica um Job Summary e, opcionalmente, produz SARIF ou atualiza um comentário do 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
A Action nunca executa comandos de gerador. Gere o SBOM do head em uma etapa separada e revisada ou faça commit dele no repositório. comment e sarif por padrão são false; PRs de fork ainda recebem o Resumo do Job completo quando a permissão de comentário não está disponível. Consulte a referência da Action para todos os inputs/outputs, fixação por SHA, upload de SARIF, permissões e comportamento de segurança.```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
### Alerta de Deriva de Integridade```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
Alerta de Dependência Profunda```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
### Gate de Conformidade```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.
Códigos de Saída
| Code | Meaning |
|---|---|
| 0 | Sucesso, sem diferenças ou violações |
| 1 | Diferenças encontradas (quaisquer componentes adicionados/removidos/alterados), violações de política ou erros |
Nota: No modo diff, o código de saída 1 é retornado sempre que qualquer alteração de componente for detectada, mesmo sem um arquivo de política. Isso torna possível usá-lo como uma simples verificação de "mudou alguma coisa?" em CI.
Exemplos
Comparar Imagens 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
### Auditoria de Licenças```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
Detecção de Deriva de Dependências```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ção de Conformidade```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
Converter Formatos de 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'
### Explorar SBOM no Navegador```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
Exploração Interativa do Terminal```bash
Explore with keyboard navigation
sbomlyze alpine.json -i
Navigate with arrow keys, search with '/', view details with Enter
## Desenvolvimento
### Executar Testes```bash
make test
# or
go test -v ./...
Lint```bash
make lint # runs go vet + golangci-lint + staticcheck make vulncheck # runs govulncheck for known CVEs
### Compilação```bash
make build-quick
# or
go build -o sbomlyze ./cmd/sbomlyze
Comandos 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
## Contribuição
Contribuições são bem-vindas! Boas primeiras issues estão marcadas com o rótulo [`good first issue`](https://github.com/rezmoss/sbomlyze/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). Consulte [CONTRIBUTING.md](https://github.com/rezmoss/sbomlyze/blob/HEAD/CONTRIBUTING.md), se existir, e fique à vontade para abrir uma issue ou discussão para propor mudanças.
[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
