はじめに
今日は、SBOM(Software Bill of Materials)について学びます。
以下の記事を参考に、Syftを使って3ステップ で簡単にSBOMを作成してみました。
環境
- Mac Apple M1
手順
① サンプルソフトウェアを取得
まずは解析対象となるソフトウェアを取得します。
git clone https://github.com/DependencyTrack/dependency-track.git
② Syftをインストール
brewでsyftをインストールします。
brew install syft
syft version # インストール確認
③ SBOMを作成
cloneしたソフトウェアのうちSBOMが入っているリポジトリへ移動します。
cd ~/dependency-track
SBOMを生成。
syft file:pom.xml -o spdx-json --file dependency-track_spdx.json
pom.xmlをSyftで解析。
Syftに対して、pom.xml(JavaのビルドツールであるMavenがプロジェクトを管理するための設定ファイル、依存関係ライブラリ一覧が含まれるxmlファイル)を解析し、SPDX形式でdependency-track_spdx.jsonというファイルに出力するよう指示しています。
結果確認
結果を確認。jsonファイルができました。
ls -lh dependency-track_spdx.json
# 出力結果例
-rw-r--r-- 1 hinano staff 4.6K Aug 11 09:00 dependency-track_spdx.json
jsonファイルの中身を確認
cat dependency-track_spdx.json | jq .
# 出力結果例(一部)
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "pom.xml", # 解析対象
"documentNamespace": "https://anchore.com/syft/file/pom.xml-b24ab133-a677-4696-92b0-f905248027ad", # SBOMのuniqueID
"creationInfo": {
"licenseListVersion": "3.28", # ライセンス判定に使ったSPDXライセンス辞書のバージョン
"creators": [
"Organization: Anchore, Inc",
"Tool: syft-1.51.0"
],
"created": "2026-08-11T00:00:24Z"
},
"packages": [ # 検出したソフトウェア(パッケージ)一覧
{
"name": "dependency-track-parent", # package名
"SPDXID": "SPDXRef-Package-java-archive-dependency-track-parent-896d09bec9a9a4d9",
"versionInfo": "5.1.0-SNAPSHOT", # バージョン
"supplier": "NOASSERTION",
"downloadLocation": "NOASSERTION",
"filesAnalyzed": false,
"sourceInfo": "acquired package info from installed java archive: /pom.xml",
"licenseConcluded": "NOASSERTION",
"licenseDeclared": "Apache-2.0", # ライセンス
"copyrightText": "NOASSERTION",
"externalRefs": [
{
"referenceCategory": "SECURITY",
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:dependency-track-parent:dependency-track-parent:5.1.0-SNAPSHOT:*:*:*:*:*:*:*"
},
{
"referenceCategory": "SECURITY", # セキュリティ関連情報
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:dependency-track-parent:dependency_track_parent:5.1.0-SNAPSHOT:*:*:*:*:*:*:*"
}, # CPE(脆弱性DBが使う名前)脆弱性管理ツールは、このソフトウェアの5.1.0-SNAPSHOTを見つけると、CVEが存在するか検索できるようになる。
{
"referenceCategory": "SECURITY",
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:org.dependencytrack:dependency_track_parent:5.1.0-SNAPSHOT:*:*:*:*:*:*:*"
},
{
"referenceCategory": "SECURITY",
"referenceType": "cpe23Type",
"referenceLocator": "cpe:2.3:a:dependency-track:dependency-track-parent:5.1.0-SNAPSHOT:*:*:*:*:*:*:*"
},
.....
}
]
}
わかったこと
SBOMには、利用しているライブラリやOSSの情報がJSON形式で記録されている。
例:
{
"name": "commons-compress",
"versionInfo": "1.25.0"
}
これによって、
- 利用しているソフトウェアコンポーネント
- 利用しているバージョンはいくつか
- 脆弱性照合用のCPE
などを把握できる。
CVEとCPEの関係
CPE(Common Platform Enumeration)は、ソフトウェアやライブラリを一意に識別するための識別子です。
脆弱性DB(NVD等)では各CVEの影響対象として紐づけられており、脆弱性管理ツールは、このCPEを利用して該当するCVEを取得します。
CVE-2021-44228
├─ 概要: Log4Shell
├─ 深刻度: Critical
└─ 影響対象:
├─ cpe:2.3:a:apache:log4j:2.0
├─ cpe:2.3:a:apache:log4j:2.1
├─ cpe:2.3:a:apache:log4j:2.14.1
...
おわりに
今回は Syft を利用して、Dependency-Track の pom.xml から SBOMを生成してみました。
実際に生成された SBOM を確認することで、ソフトウェアに含まれるコンポーネント情報、バージョン情報、ライセンス情報、そして脆弱性照合に利用されるCPE が記録されていることがわかりました。
特に、SBOMに含まれるCPEを利用して脆弱性データベースと照合し、CVEを特定する流れのイメージが湧きました。