0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人メモ】SBOMを作成してみた

0
Posted at

はじめに

今日は、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を特定する流れのイメージが湧きました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?