
SBOM용 Git diff—CycloneDX, SPDX, Syft 문서를 비교하고, 변조를 탐지하며, CI를 게이팅합니다.
당신의 SBOM을 위한 git diff. 두 소프트웨어 자재 명세서(SBOM)를 비교하여 빌드, 버전, 릴리스 간 변경 사항을 확인하세요.
sbomlyze는 버전 문자열뿐만 아니라 구성 요소 해시를 비교합니다. 공격자가 버전을 올리지 않고 패키지를 교체하면 sbomlyze가 이를 플래그로 표시합니다. 생성기와 취약점 스캐너는 이를 놓칩니다.
[![CI][ci-img]][ci] [![GitHub Marketplace][marketplace-img]][marketplace] [![GitHub Release][release-img]][release] [![Go Report Card][go-report-img]][go-report] [![OpenSSF Scorecard][scorecard-img]][scorecard] [![License: Apache-2.0][license-img]][license] [![Downloads][download-img]][download]
이 신호가 매니페스트 또는 일반 구성 요소 diff와 어떻게 다른지 Manifest diff vs. SBOM diff vs. integrity drift에서 확인하세요.
생성기는 SBOM을 만들고 스캐너는 CVE를 찾습니다. sbomlyze는 두 SBOM 사이에 무엇이 변경되었는지, 그리고 그것을 신뢰할 수 있는지 알려줍니다. 생성기 다음에 실행하세요:
syft image:tag -o cyclonedx-json | sbomlyze - --compliance는 임시 파일 없이 생성된 SBOM을 분석하고 점수를 매깁니다. 기준선과 비교하여 드리프트를 분류하고 파이프라인을 게이트하세요.
[GitHub Marketplace의 SBOMlyze Diff][marketplace]를 추가하여 체크인된 SBOM 또는 별도로 생성된 SBOM을 git 기준선과 비교하세요. 아래의 불변 SHA는 게시된 v0.5.1 Action입니다.```yaml
steps:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0
uses: rezmoss/sbomlyze@31503690611fda8ebba4ed2bd186eda000442594 # v0.5.1 with: sbom-path: build/sbom.cdx.json
이 Action은 기본적으로 Job Summary를 작성하고, 정책을 적용하거나,
무결성 드리프트를 보고하거나, SARIF를 업로드하거나,
단일 풀 리퀘스트 코멘트를 유지할 수 있습니다.
입력, 출력, 권한 및 보안 지침은 [전체 Action 참조](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md)에서
확인하세요. [라이브 데모 저장소](https://github.com/rezmoss/sbomlyze-action-demo)에서
정상 통과하는 의존성 업데이트와 차단된 동일 버전 해시 변경을 확인할 수
있으며, 공개 워크플로 실행 및 SARIF 증거가 포함되어 있습니다.
포맷별 자체 사용(dogfood) 예시는 공개
[Go + SPDX](https://github.com/rezmoss/sbomlyze-go-spdx-demo),
[Node + CycloneDX](https://github.com/rezmoss/sbomlyze-node-cyclonedx-demo), 또는
[container](https://github.com/rezmoss/sbomlyze-container-demo) 데모를 사용하세요. 각 데모에는
재현 가능한 검토 시나리오 5개가 포함되어 있습니다.
[10분 베타 가이드](https://github.com/rezmoss/sbomlyze/blob/HEAD/BETA.md)는 네 가지 핵심 활성화 및 신호
품질 질문을 다룹니다.
생성된 SBOM은 커밋할 필요가 없습니다. `baseline: workflow-artifact`는
성공한 기본 브랜치 실행에서 가장 최근의 일치하는 아티팩트를
검색합니다. [고정된 Syft 동반 워크플로](https://github.com/rezmoss/sbomlyze/blob/HEAD/examples/workflows/syft-companion.yml)는
생성 및 베이스라인 게시를 보여주며, SBOMlyze는 검토와
정책을 담당합니다.
## 왜 sbomlyze인가?
많은 도구가 SBOM을 생성합니다. 그러나 그것들을 비교하는 도구는 드물고, 변경이 일상적인지 공급망 위험 신호인지 알려주는 도구는 더욱 드뭅니다. sbomlyze가 그 공백을 메웁니다.
| 기능 | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| SBOM 간 **diff** | ✅ | 기본 | ❌ | ❌ |
| **무결성 / 변조** 드리프트 (버전 변경 없이 해시 변경) | ✅ | ❌ | ❌ | ❌ |
| 의존성 그래프 diff + 전이적 깊이 위험 | ✅ | ❌ | ❌ | ❌ |
| **NTIA / CISA / BSI** 규정 준수 점수 | ✅ | ❌ | ✅ | ❌ |
| 포맷 변환 (Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | 부분 |
| **TUI + Web UI** 탐색기 | ✅ | ❌ | ❌ | ❌ |
| 정책 게이트 + SARIF / JUnit / Markdown / HTML / Patch | ✅ | 부분 | 부분 | 부분 |
## 기능
- **SBOM diffing**: 두 SBOM을 비교하여 추가, 제거, 변경된 구성 요소를 한눈에 확인
- **Drift classification**: 버전 드리프트와 **무결성 드리프트**(버전 변경 없이 해시가 변경되어 변조를 나타냄) 및 메타데이터 드리프트를 구분
- **Compliance scoring**: 모든 SBOM을 **NTIA**, **CISA 2025**, **BSI TR-03183** 최소 요소 기준으로 점수화
- **Dependency graph diff**: 전이적 의존성과 공급망 깊이 추적
- **Multi-format support**: Syft, CycloneDX, SPDX (JSON)
- **Format conversion**: CycloneDX, SPDX, Syft 포맷 간 변환
- **Strong identity matching**: PURL → CPE → BOM-ref → namespace/name 우선순위
- **Statistics mode**: 단일 SBOM의 라이선스, 의존성, 무결성 지표 분석
- **Interactive TUI mode**: 키보드 탐색 및 검색으로 SBOM 탐색
- **Web UI mode**: 드래그 앤 드롭 업로드를 지원하는 브라우저 기반 SBOM 탐색기
- **Policy engine**: CI 파이프라인에서 드리프트, 라이선스, 규정 준수 점수 규칙 적용
- **GitHub Marketplace Action**: Job Summary, SARIF 및 선택적 코멘트 출력으로 SBOM 드리프트에 대한 풀 리퀘스트 게이팅
- **Duplicate & collision detection**: 동일 패키지의 여러 버전과 모호한 ID 일치 항목 탐지
- **Multiple output formats**: 텍스트, JSON, SARIF, JUnit XML, Markdown, HTML, JSON Patch
- **Tolerant parsing**: 구조화된 경고와 함께 오류 발생 시에도 계속 파싱
## 설치
### Homebrew (macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze
설치 스크립트는 사용자의 OS/아키텍처에 맞는 올바른 바이너리를 다운로드합니다:```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
**설치 옵션:**
| 옵션 | 설명 |
|--------|-------------|
| `-b <dir>` | 설치 디렉터리 (기본값: `./bin`) |
| `-d` | 디버그 출력 활성화 |
| `-v <ver>` | 특정 버전 설치 (기본값: 최신) |
설치 프로그램은 항상 릴리스 체크섬을 검증합니다. 호환되는 GitHub CLI가 설치되어 있으면, 릴리스의 빌드 출처(provenance)도 검증하며, 해당 검증이 성공하지 않으면 실패로 처리합니다.
### Go 설치```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest
GitHub Releases에서 최신 바이너리를 다운로드하세요.
v0.3.7부터 릴리스 아카이브는 GitHub 아티팩트
증명과 함께 게시됩니다. 다음을 사용하여 다운로드를 독립적으로 검증하세요:```bash
gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz
--repo rezmoss/sbomlyze
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml
서명되지 않은 apt, rpm, apk 저장소 지침은 저장소가 패키지 관리자 기본 서명 검증을 지원할 때까지 제거되었습니다.
**macOS 사용자:** 다운로드 후 격리 플래그를 제거하십시오:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze
git clone https://github.com/rezmoss/sbomlyze.git cd sbomlyze go build -o sbomlyze ./cmd/sbomlyze
## 빠른 시작```bash
# Compare two SBOMs (the headline use case)
sbomlyze before.json after.json
# Analyze a single SBOM
sbomlyze image.json
# Read an SBOM from standard input
syft image:tag -o cyclonedx-json | sbomlyze -
# Use standard input on either side of a diff
syft image:tag -o cyclonedx-json | sbomlyze baseline.json -
# Score an SBOM against NTIA / CISA / BSI minimum elements
sbomlyze image.json --compliance
# Interactive TUI explorer
sbomlyze image.json -i
# Web UI (opens browser)
sbomlyze -web
# Convert between SBOM formats
sbomlyze convert syft.json --to spdx
sbomlyze convert cdx.json --to syft -o output.json
# JSON output for CI integration
sbomlyze before.json after.json --json
# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif
# Markdown report for PR comments
sbomlyze before.json after.json --format markdown
# Apply policy checks
sbomlyze before.json after.json --policy policy.json
sbomlyze <sbom1|-> [sbom2|-] [options] sbomlyze convert <sbom|-> --to [-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
## 명령어
### 통계 모드 (단일 파일)
SBOM을 분석하여 구성 요소, 라이선스, 종속성에 대한 통찰력을 얻습니다.```bash
sbomlyze image.json
출력에는 스캔 컨텍스트, 자동 감지된 주요 발견 사항 및 통계가 포함됩니다:``` Scan Context: Tool: syft 1.40.1 Schema: 16.0.18 Scan Scope: all-layers Source Type: image Source: alpine:latest
Key Findings: 💻 OS/Distro: Alpine Linux v3.21 📦 Dominated by apk: 71 of 71 packages (100.0%) 📂 8,542 files tracked on filesystem 🔗 Relationships: 71 containment + 64 dependency 📜 License profile: 72% permissive, 20% copyleft ⚠️ Low hash coverage: 0.0% (71 of 71 missing) 🔍 Top catalogers: apkdb-cataloger (71)
Total Components: 71
By Package Type: apk 71
Licenses: With license: 71 Without license: 0
Top Licenses: MIT 17 BSD-3-Clause 8 GPL-2.0-only 8
Integrity: With hashes: 0 Without hashes: 71
Dependencies: Components with deps: 65 Total dep relations: 176
#### 주요 발견 사항
sbomlyze는 SBOM에 대한 인사이트를 자동으로 생성합니다. 단일 파일 분석의 경우 다음이 포함됩니다:
| 발견 항목 | 설명 |
|---------|-------------|
| **OS/배포판 감지** | SBOM 메타데이터에서 운영체제 또는 배포판을 식별합니다 |
| **지배적 생태계** | 하나의 패키지 유형이 전체 패키지의 60%를 초과하여 지배하는 경우 보고합니다 |
| **파일시스템 사용량** | 파일시스템에서 추적되는 파일 수 |
| **관계 밀도** | 포함(containment) 및 의존(dependency-of) 관계의 수 |
| **위치 핫스팟** | 구성 요소가 발견되는 주요 디렉터리 |
| **라이선스 위험 프로필** | 허용적/카피레프트/알 수 없음 라이선스 비율 분석 |
| **데이터 품질 경고** | 라이선스(<50%), 해시(<50%), PURL(<80%) 적용 범위가 낮을 때 경고 |
| **중복 경고** | 중복 구성 요소 그룹을 표시합니다 |
| **카탈로거 세부 내역** | 구성 요소를 감지한 상위 스캐너/카탈로거 (Syft SBOM) |
#### 커버리지 지표
통계 모드는 데이터 품질 평가를 위한 커버리지 백분율을 계산합니다:
| 지표 | 설명 |
|--------|-------------|
| **PURL 커버리지** | Package URL을 가진 구성 요소의 비율 |
| **CPE 커버리지** | CPE를 가진 구성 요소의 비율 (취약점 스캔 준비 상태) |
| **라이선스 커버리지** | 라이선스를 하나 이상 가진 구성 요소의 비율 |
| **해시 커버리지** | 무결성 해시를 가진 구성 요소의 비율 |
#### 라이선스 분류
라이선스는 자동으로 다음 범주로 분류됩니다:
| 범주 | 예시 |
|----------|----------|
| **카피레프트** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **허용적(Permissive)** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **퍼블릭 도메인** | 퍼블릭 도메인 헌정 |
| **알 수 없음** | 인식되지 않거나 누락된 라이선스 |
### 변환 모드
CycloneDX, SPDX 및 Syft JSON 형식 간에 SBOM을 변환합니다. 입력 형식은 자동으로 감지됩니다.```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
변환 시 구성 요소 이름, 버전, PURL, CPE, 라이선스, 해시, 공급업체 정보 및 종속성 관계가 보존됩니다. 형식별 필드(예: Syft language, foundBy, locations)는 CDX로 변환할 때 CycloneDX 속성을 통해 전달됩니다.
두 SBOM을 비교하여 버전 간 변경 사항을 확인합니다.```bash sbomlyze v1.0.json v2.0.json
#### Diff 개요
diff는 파일 이름, 크기, OS 정보, 도구 정보, 구성 요소 수에 대한 나란한 메타데이터 비교로 시작하며, 사용 가능한 경우 스캔 컨텍스트 세부 정보가 이어집니다.
#### 출력```
📊 Drift Summary:
📦 Version drift: 58 components
⚠️ Integrity drift: 1 component (hash changed without version change!)
📝 Metadata drift: 2 components
🔑 Key Findings:
📈 Attack surface: +5 packages (7.0%), +120 files (3.2%)
🚨 2 version downgrades detected: openssl 3.1.4→3.0.2, curl 8.5.0→8.4.0
🔄 56 version upgrades (2 major, 12 minor, 42 patch) among 65 shared packages
⚠️ Integrity drift (1 total): 1 npm (review recommended)
❌ python ecosystem entirely removed (15 → 0 packages)
➕ New ecosystem: golang (8 packages)
✅ Core system packages stable: apk (71) unchanged
+ Added (2):
+ libgcrypt 1.10.3-r0
+ libgpg-error 1.49-r0
- Removed (3):
- libapk 3.0.3-r1
- libgcc 15.2.0-r2
- nghttp3 1.13.1-r0
~ Changed (58):
~ nginx
version: 1.29.4-r1 -> 1.27.3-r1
~ suspicious-pkg ⚠️ [INTEGRITY]
hash[SHA256]: abc123 -> def456
>> Added dependencies:
pkg:apk/alpine/libxslt: +[so:libgcrypt.so.20]
<< Removed dependencies:
pkg:apk/alpine/libcurl: -[so:libnghttp3.so.9]
🔗 New transitive dependencies (3):
+ pkg:npm/lodash (depth 2)
via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash]
+ pkg:npm/underscore (depth 3)
via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash pkg:npm/underscore]
📊 New deps by depth:
Depth 2: 1
Depth 3+ (risky): 2 ⚠️
Diff 모드에서 sbomlyze는 두 SBOM을 비교하여 더 풍부한 인사이트를 자동 생성합니다:
추가 및 제거된 구성 요소는 패키지 유형별로 그룹화되고 샘플 목록과 함께 제공되어 각 생태계에서 무엇이 변경되었는지 쉽게 확인할 수 있습니다.
감사자와 조달 팀이 계속 묻는 질문인 "이 SBOM이 충분히 완전한가?" 에 답하기 위해 세 가지 주요 최소 요소 프레임워크에 대해 모든 SBOM을 점수화합니다.```bash
sbomlyze image.json --compliance
sbomlyze before.json after.json --compliance
sbomlyze image.json --compliance --json
### 평가된 프레임워크
| 프레임워크 | 검사 수 | 주요 요구 사항 |
|-----------|--------|----------------------|
| **NTIA 최소 요소** (2021) | 7 | 이름, 버전, 공급자, 고유 ID(PURL/CPE), 종속성 관계, SBOM 작성자, 타임스탬프 |
| **CISA 2025 최소 요소** (2025년 8월 초안) | 10 | NTIA에 소프트웨어 생산자, 라이선스 정보, **구성 요소 해시**, 도구 이름을 추가 |
| **BSI TR-03183-2** (v2.1.0, 2025) | 9 | 구성 요소 작성자 연락처, **SHA-512 해시**, SPDX 형식 라이선스, SBOM 작성자 연락처를 요구 |
### 점수 표시
각 프레임워크는 백분율(통과 검사 수 / 전체 검사 수)과 전체 점수(프레임워크 간 평균)를 보고하며 상태 표시기를 포함합니다:
| 상태 표시기 | 점수 |
|-----------|-------|
| 🟢 | ≥ 90% |
| 🟡 | 70–89% |
| 🟠 | 50–69% |
| 🔴 | < 50% |
JSON 출력(`--compliance --json`)에는 검사별 통과/실패 세부 정보가 포함된 전체 보고서가 포함되며, HTML 형식은 규정 준수 보고서를 보고서 페이지에 포함합니다.
### CI에서 규정 준수 게이팅
[정책 엔진](#policy-engine)을 통해 규정 준수 임계값을 시행합니다. 임계값을 설정하면 `--compliance` 플래그 없이도 규정 준수 평가가 트리거됩니다:```json
{
"min_ntia_score": 85,
"min_cisa_score": 70,
"min_bsi_score": 80,
"min_overall_compliance": 75
}
입력된 청크 내용이 비어 있습니다. 번역할 원문이 제공되지 않았으니, 청크 33의 실제 내용을 다시 보내 주세요.```bash sbomlyze image.json --policy compliance-policy.json
## Dependency Graph Diff
sbomlyze는 단순한 구성요소 목록 비교를 넘어 전체 의존성 그래프를 분석하여, 전이 의존성을 통해 유입되는 공급망 위험을 탐지합니다.
### 기능
| 기능 | 설명 |
|---------|-------------|
| **엣지 비교** | 추가/제거된 직접 의존성 (A가 B에 의존) |
| **전이 도달 가능성** | 그래프를 통해 새로 나타나는 간접 의존성 |
| **전이 손실 추적** | 제거된 전이 의존성 |
| **경로 추적** | 각각의 새로운 전이 의존성에 어떻게 도달하는지 정확히 표시 |
| **깊이 추적** | 각각의 새로운 의존성이 코드에서 몇 홉 떨어져 있는지 |
| **위험 요약** | 깊이 3 이상의 의존성은 더 높은 위험으로 표시 |
### 깊이가 중요한 이유
그래프 깊은 곳에서 유입되는 의존성은 다음과 같은 특징이 있습니다:
- 감사 및 검토가 더 어려움
- 종종 명시적 승인 없이 포함됨
- 공급망 공격의 일반적인 경로 (예: event-stream 사건)
깊이 요약은 검토 우선순위를 정하는 데 도움을 줍니다:
| 깊이 | 위험 수준 | 설명 |
|-------|------------|-------------|
| **1** | 낮음 | 직접 의존성 (직접 선택한 것들) |
| **2** | 중간 | 내 의존성의 의존성 |
| **3+** | 높음 ⚠️ | 깊은 전이 의존성 - 신중히 검토 필요 |
### 예시: 깊은 전이 의존성 탐지```bash
# Before: app -> express (simple, 1 dep)
# After: app -> express -> lodash -> underscore -> deep-lib (chain of 4)
sbomlyze before.json after.json
출력:``` 🔗 New transitive dependencies (3):
📊 New deps by depth: Depth 2: 1 Depth 3+ (risky): 2 ⚠️
### 의존성 그래프용 JSON 출력```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는 구성 요소 변경 사항을 세 가지 드리프트 유형으로 분류하여 일반 업데이트와 잠재적으로 의심스러운 변경을 구분하는 데 도움을 줍니다.
무결성 드리프트는 구성 요소의 해시가 변경되었지만 버전이 동일하게 유지될 때 발생합니다. 이는 다음을 나타낼 수 있습니다:
~ suspicious-pkg ⚠️ [INTEGRITY] hash[SHA256]: abc123 -> def456
**권장 사항**: 무결성 드리프트를 항상 조사하세요. 무해할 수 있지만, 공급망 보안의 핵심 신호입니다.
### 드리프트에 대한 JSON 출력
드리프트 요약은 `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
}
}
}
드리프트 요약 추출:```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'
## 중복 및 충돌 감지
### 중복 감지
sbomlyze는 SBOM 내에서 동일한 식별자를 가지지만 버전이 다른 구성 요소를 식별합니다:```
⚠️ Duplicates Found: 2
lodash: [4.17.20, 4.17.21]
express: [4.18.0, 4.19.2]
In diff mode, duplicate version diffing tracks:
충돌은 구성 요소가 동일한 ID를 공유하지만 특성이 충돌하는 모호한 ID 일치입니다:
| 유형 | 설명 |
|---|---|
| 이름 불일치 | 동일한 ID에 매핑된 서로 다른 구성 요소 이름 |
| 해시 불일치 | 동일한 버전의 구성 요소가 서로 다른 해시를 가짐 (잠재적 변조) |
sbomlyze sbom.json -i

### TUI 키보드 단축키
#### 탐색
| 키 | 동작 |
|-----|--------|
| `↑` / `k` | 위로 이동 |
| `↓` / `j` | 아래로 이동 |
| `PgUp` / `Ctrl+u` | 반 페이지 위로 |
| `PgDn` / `Ctrl+d` | 반 페이지 아래로 |
| `Home` / `g` | 맨 위로 이동 |
| `End` / `G` | 맨 아래로 이동 |
| `Enter` | 구성 요소 세부 정보 보기 |
| `Esc` / `Backspace` | 뒤로 가기 |
| `q` / `Ctrl+c` | 종료 |
#### 검색 및 필터
| 키 | 동작 |
|-----|--------|
| `/` | 모든 필드에서 심층 검색 (이름, PURL, 라이선스, 원시 JSON) |
| `t` | 패키지 유형별 필터링 (npm, apk, golang, pypi 등) |
| `c` | 활성화된 모든 필터 지우기 |
#### 보기
| 키 | 컨텍스트 | 동작 |
|-----|---------|--------|
| `j` | 상세 보기 | 구문 강조로 원시 구성 요소 JSON 보기 |
| `d` | JSON 보기 | 상세 보기로 다시 전환 |
| `Enter` | JSON 보기 | 구성 요소 JSON을 파일로 내보내기 |
| `?` | 모든 보기 | 모든 키 바인딩이 포함된 도움말 표시 |
### 구성 요소 상세 보기
상세 보기에는 구성 요소에 대한 포괄적인 정보가 표시됩니다:
- 패키지 정보 (이름, 버전, PURL, 네임스페이스, 공급업체)
- 시각적 표시가 있는 라이선스
- 무결성 해시
- CPEs (Common Platform Enumeration)
- 종속성 목록
- 식별자 (ID, BOM-ref, SPDX-ID)
## Web UI 모드
드래그 앤 드롭 파일 업로드를 지원하는 브라우저 기반 SBOM 탐색기를 시작합니다:```bash
# Start web server on default port 8080
sbomlyze -web
# Start on custom port
sbomlyze -web --port 3000
그런 다음 브라우저에서 http://localhost:8080을 여세요.
웹 UI는 다음을 포함한 포괄적인 통계를 표시합니다:
보안 검토
규정 준수 감사
개발 디버깅
웹 UI에는 SBOM 내 파일을 탐색하기 위한 전체 파일시스템 브라우저가 포함되어 있습니다(Syft로 생성된 파일 메타데이터가 있는 SBOM에 특히 유용):
*.so, /usr/lib/**/*.conf)-i (대화형 모드)키보드 컨트롤로 SBOM을 탐색하는 터미널 기반 TUI 탐색기를 실행합니다.```bash sbomlyze image.json -i
Features: 트리 탐색, 구성 요소 세부 정보, 검색, 라이선스/해시 검사.
### `-web` (웹 서버 모드)
브라우저 기반 SBOM 탐색을 위한 웹 서버를 시작합니다.```bash
# Default port 8080
sbomlyze -web
# Custom port
sbomlyze -web --port 3000
웹 UI는 드래그 앤 드롭 업로드, 대화형 트리 뷰, 심층 검색 및 통계 대시보드를 제공합니다.
--complianceSBOM을 NTIA, CISA 2025 및 BSI TR-03183 최소 요소 프레임워크에 대해 채점합니다. 준수 점수를 참조하세요.```bash sbomlyze image.json --compliance sbomlyze image.json --compliance --json
### `--format` / `-f`
출력 형식을 선택합니다. 7가지 형식을 사용할 수 있습니다:
| 형식 | 플래그 | 설명 | 가장 적합한 용도 |
|--------|------|-------------|----------|
| **text** | `--format text` (기본값) | 사람이 읽기 쉬운 터미널 출력 | 로컬 검사 |
| **json** | `--json` 또는 `--format json` | 구조화된 JSON | CI 파이프라인, 스크립팅 |
| **sarif** | `--format sarif` | GitHub Code Scanning용 SARIF 2.1.0 | GitHub 통합 |
| **junit** | `--format junit` | JUnit XML 테스트 결과 | CI 테스트 대시보드 |
| **markdown** | `--format markdown` | PR 댓글 작성 준비가 된 Markdown 보고서 | 풀 리퀘스트 댓글 |
| **html** | `--format html` | 자체 포함 HTML 보고서(인라인 CSS/JS) | 감사자, 공유 가능한 보고서 |
| **patch** | `--format patch` | RFC 6902 JSON Patch 작업 | 프로그래매틱 패칭 |```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
GitHub Code Scanning에 적합한 SARIF 2.1.0 보고서를 생성합니다. 감지된 규칙은 다음과 같습니다.
integrity-drift (오류): 버전 변경 없이 해시 변경deep-dependency (경고): 깊이 3 이상의 새 종속성new-component / removed-component (참고): 구성 요소 추가/제거version-change (참고): 구성 요소 버전 업데이트policy-violation (오류/경고): 정책 규칙 위반다음에 대한 테스트 케이스가 포함된 JUnit XML을 생성합니다.
다음을 포함하는 Markdown 보고서를 생성합니다.
감사자에게 이메일로 보내거나 릴리스에 첨부하기에 적합한 자체 포함된 단일 HTML 파일(인라인 CSS 및 JavaScript, 외부 자산 없음)을 생성합니다. --compliance가 설정된 경우 통계 대시보드, 종속성 트리, 드리프트 요약 및 내장된 컴플라이언스 보고서가 포함됩니다.
diff를 나타내는 RFC 6902 JSON Patch 연산 배열(add, remove, replace)을 생성합니다.
--json--format json의 약어입니다. 프로그램에서 사용할 수 있도록 결과를 JSON 형식으로 출력합니다.```bash
sbomlyze image.json --json
sbomlyze before.json after.json --json
**통계 JSON 구조:**```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>정책 규칙을 적용하고 위반 시 CI를 실패 처리합니다.```bash sbomlyze before.json after.json --policy policy.json
자세한 내용은 [Policy Engine](#policy-engine)을 참조하세요.
### `--strict`
파싱 오류가 발생하면 즉시 실패합니다.```bash
sbomlyze broken.json --strict
# Error parsing broken.json: unknown SBOM format
# exit status 1
--tolerant (기본값)오류가 발생해도 처리를 계속하고 경고를 수집합니다.```bash sbomlyze broken.json --tolerant
파싱 경고에는 구조화된 정보가 포함됩니다: 소스 파일, 사람이 읽을 수 있는 메시지, 그리고 선택적으로 문제를 일으킨 필드.
### `--no-pager`
자동 출력 페이징을 비활성화합니다. 출력을 다른 명령으로 파이프하거나 비대화형 환경에서 실행할 때 유용합니다.```bash
sbomlyze image.json --no-pager
sbomlyze before.json after.json --no-pager | head -20
CI/CD 파이프라인에서 규칙을 적용하기 위한 정책을 생성합니다. 위반이 발생하면 sbomlyze는 코드 1로 종료됩니다.
{ "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
| 규칙 | 유형 | 설명 |
|------|------|-------------|
| `max_added` | int | 허용되는 최대 새 구성 요소 수 (0 = 무제한) |
| `max_removed` | int | 허용되는 최대 제거 구성 요소 수 (0 = 무제한) |
| `max_changed` | int | 허용되는 최대 변경 구성 요소 수 (0 = 무제한) |
| `deny_licenses` | []string | 금지된 라이선스 식별자 목록 |
| `require_licenses` | bool | 모든 *추가된* 구성 요소에 라이선스가 있어야 합니다 (diff 모드에서는 새로 추가된 구성 요소만 확인) |
| `deny_duplicates` | bool | 결과에 중복 패키지가 존재하면 실패 |
| `deny_integrity_drift` | bool | 버전 변경 없이 구성 요소 해시가 변경되면 실패 (공급망 위험) |
| `max_depth` | int | 깊이 >= N인 새 전이 의존성이 있으면 실패 (0 = 무제한) |
| `warn_supplier_change` | bool | 구성 요소 공급자/작성자가 변경된 경우 경고 (실패 아님) |
| `warn_new_transitive` | bool | 새 전이 의존성에 대해 경고 (실패 아님) |
| `min_ntia_score` | int | NTIA 준수 점수가 이 값보다 낮으면 실패 (0-100, 0 = 비활성화) |
| `min_cisa_score` | int | CISA 준수 점수가 이 값보다 낮으면 실패 (0-100, 0 = 비활성화) |
| `min_bsi_score` | int | BSI 준수 점수가 이 값보다 낮으면 실패 (0-100, 0 = 비활성화) |
| `min_overall_compliance` | int | 전체 준수 점수가 이 값보다 낮으면 실패 (0-100, 0 = 비활성화) |
> `min_*_score` 임계값을 설정하면 `--compliance` 플래그 없이도 자동으로 준수 평가가 트리거됩니다.
### 예: 엄격한 정책```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
## 지원되는 SBOM 형식
| 형식 | 파일 감지 | 추출된 식별자 |
|--------|----------------|----------------------|
| Syft (네이티브) | JSON 키 `"artifacts"` + 다음 중 하나: `"source"`, `"distro"`, `"descriptor"` | PURL, CPE, name |
| CycloneDX | JSON 키 `"bomFormat"` = `"CycloneDX"` 또는 `"$schema"`에 `cyclonedx` 포함 | PURL, CPE, BOM-ref, group (namespace) |
| SPDX | JSON 키 `"spdxVersion"`이 `"SPDX-"`로 시작 | PURL, CPE, SPDXID |
모든 형식은 JSON이어야 합니다. XML 지원은 현재 제공되지 않습니다.
### 형식 변환
sbomlyze는 지원되는 세 가지 형식 간에 변환할 수 있습니다:```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
자세한 내용은 Convert Mode를 참조하세요.
sbomlyze는 다양한 형식의 SBOM을 비교할 수 있습니다:```bash
sbomlyze syft-output.json cyclonedx-output.json
sbomlyze spdx-output.json syft-output.json
**참고:** SBOM 형식에 따라 추출되는 세부 정보 수준이 다릅니다. 형식 간 diff는 실제 시스템 변경보다는 형식 차이(예: 필드 가용성)를 반영한 변경 사항으로 표시될 수 있습니다. 주요 발견 사항 시스템은 감지 시 스캔 컨텍스트 불일치에 대해 경고합니다.
## 구성 요소 ID 매칭
구성 요소는 우선순위 기반 ID 시스템을 사용하여 매칭됩니다.
| 우선순위 | 식별자 | 예시 | 설명 |
|----------|------------|---------|-------------|
| 1 | PURL | `pkg:npm/lodash` | 패키지 URL(버전 제거) |
| 2 | CPE | `cpe:vendor:product` | CPE vendor:product(버전 제거) |
| 3 | BOM-ref / SPDXID | `ref:component-123` | CycloneDX bom-ref 또는 SPDX 식별자 |
| 4 | 네임스페이스 + 이름 | `com.example/mypackage` | 이름이 포함된 그룹/네임스페이스 |
| 5 | 이름 | `simple-package` | 이름만 사용하는 폴백 |
## CI/CD 통합
### GitHub Actions
SBOMlyze는 종속성이 없는 JavaScript Action으로 제공됩니다. 체크인되었거나 별도로 생성된 head SBOM을 풀 리퀘스트의 git base에 있는 파일과 비교하고, Job Summary를 게시하며, 선택적으로 SARIF를 생성하거나 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
이 Action은 생성기 명령을 실행하지 않습니다. 헤드 SBOM을 별도의 검토된 단계에서 생성하거나 저장소에 커밋하세요. comment와 sarif는 둘 다 기본적으로 false입니다. comment 권한을 사용할 수 없는 경우에도 포크된 PR은 전체 Job Summary를 계속 받습니다. 모든 입출력, SHA 고정, SARIF 업로드, 권한 및 보안 동작은 Action 참조를 참조하세요.
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
### 무결성 드리프트 경고```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
### 규정 준수 게이트```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.
| 코드 | 의미 |
|---|---|
| 0 | 성공, 차이점 또는 위반 사항 없음 |
| 1 | 차이점 발견(추가/제거/변경된 구성 요소), 정책 위반 또는 오류 |
참고: diff 모드에서는 정책 파일 없이도 구성 요소 변경이 감지되면 항상 종료 코드 1이 반환됩니다. 이를 통해 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
### 라이선스 감사```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
### 규정 준수 점검```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'
### 브라우저에서 SBOM 탐색```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
## 개발
### 테스트 실행```bash
make test
# or
go test -v ./...
make lint # runs go vet + golangci-lint + staticcheck make vulncheck # runs govulncheck for known CVEs
### 빌드```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
## 기여
기여를 환영합니다! 좋은 첫 이슈는 [`good first issue`](https://github.com/rezmoss/sbomlyze/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) 라벨로 표시됩니다. 존재하는 경우 [CONTRIBUTING.md](https://github.com/rezmoss/sbomlyze/blob/HEAD/CONTRIBUTING.md)를 참조하고, 변경 사항을 제안하려면 이슈나 토론을 자유롭게 열어 주세요.
[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
| 형식 | --to 값 | 출력 |
|---|
| CycloneDX 1.5 | cyclonedx 또는 cdx | 메타데이터, 종속성 및 속성이 포함된 CycloneDX JSON |
| SPDX 2.3 | spdx | 패키지, 관계 및 외부 참조가 포함된 SPDX JSON |
| Syft | syft | 아티팩트, 관계, 소스 및 배포판 정보가 포함된 Syft JSON |
| Finding | Description |
|---|
| 스캔 컨텍스트 불일치 | SBOM 간 스키마 버전 또는 스캔 범위가 변경되었는지 경고 |
| 공격 표면 델타 | 패키지, 파일, 관계 수의 변화를 백분율로 표시 |
| 사라진/새로 추가된 생태계 | 완전히 나타나거나 사라진 패키지 유형 |
| OS/배포판 마이그레이션 | 스캔 간 운영 체제 변경 감지 |
| 버전 변경 분석 | 업그레이드 vs 다운그레이드 수를 집계하고 변경 사항을 major/minor/patch로 분류 |
| 버전 다운그레이드 | 다운그레이드를 보안 신호로 표시하고 구성 요소 세부 정보 제공 |
| 무결성 드리프트 컨텍스트 | 패키지 유형별 무결성 드리프트를 위험 가이드와 함께 분석 |
| 지배적 경로 패턴 | 유형 및 파일시스템 경로별 집중 변경 사항 |
| 제거/추가 핫스팟 | 변경 사항의 영향을 받은 주요 디렉터리 |
| 안정적 유형 | 개수가 동일한 패키지 유형 (변경되지 않은 핵심) |
| 라이선스 카테고리 이동 | 카피레프트/퍼미시브 균형의 변화 |
| 카탈로거 공백 | Before에서 패키지를 찾았지만 After에서는 찾지 못한 스캐너 |
| 유형 | 표시 | 설명 | 심각도 |
|---|
| Version | 📦 | 버전 번호 변경됨 | 정상 |
| Integrity | ⚠️ | 해시가 버전 변경 없이 변경됨 | 높음 - 조사 필요! |
| Metadata | 📝 | 메타데이터(라이선스 등)만 변경됨 | 낮음 |
| 기능 | 설명 |
|---|
| 드래그 앤 드롭 업로드 | 모든 SBOM 파일(Syft, CycloneDX, SPDX)을 페이지에 드롭하세요(최대 500MB) |
| 의존성 트리 | 확장/축소 탐색이 가능한 대화형 트리 뷰(5000개 이상 구성 요소는 페이지네이션) |
| 구성 요소 세부 정보 | 라이선스, 해시, 의존성, 공급업체 정보, 파일 수를 볼 수 있습니다 |
| 원시 JSON 보기 | 각 구성 요소에 대한 구문 강조 JSON |
| 심층 검색 | 원시 JSON 데이터를 포함한 모든 필드 검색 |
| 통계 대시보드 | 적용 범위 지표, 라이선스 범주, 언어 분포 |
| 파일시스템 브라우저 | 디렉터리 탐색, 검색, 레이어 필터링으로 SBOM 내 파일 탐색 |