📝

SBOMをガチで調べた

2024/11/16に公開

はじめに

突然ですが、業務や個人で開発しているプロダクトに組み込まれたOSSなどのライセンスについて把握できておりますでしょうか?
脆弱性についても、OSSのどこに脆弱性があるのか把握できておりますでしょうか?

冷や汗をかいたそこのあなたにはSBOMの出番かもしれません。

SBOMとは、「Software Bill of Materials」の略で、ソフトウェアの構成を表すファイルのことです。
聞き馴染みのない方も多いと思いますが、2021年のアメリカ大統領令でも言及された、近年のソフトウェアの脆弱性対策やライセンス管理方法として注目されている技術です。

そんなSBOMについて調べる機会があったため、概要をご紹介いたします。

誰のため?
ソフトウェアエンジニアや、納品先の顧客、社会全体など、様々な人のための技術です。

何のため?
ソフトウェアの脆弱性やライセンス管理を行うための技術です。
ツールを使用して、自動で脆弱性の検出やライセンスの確認を行うことができます。

なぜ?
近年、ソフトウェアの構造は複雑化・大規模化しています。さらにサイバー攻撃の規模も拡大しています。
そんな中でライセンス管理や脆弱性管理を手動で実施することは困難になっています。最近でいえば、log4jの脆弱性が挙げられます。様々なものに組み込まれているだけあって、どこを修正すればいいのか対応に追われた方もいるのではないでしょうか?

どうやって?
SBOMと呼ばれるファイルを作成し、ソフトウェアの作成者、ライセンス、バージョン、依存関係などを記載して管理します。
ファイルの形式は、JSONやXMLなど複数存在します。
ツールを用いて、作成したファイルから脆弱性の検出やライセンスの確認を継続的に行うことができます。

SBOMの標準形式

SBOMには標準形式が存在します。代表的なものは「SPDX」「CycloneDX」です。
SBOMは「ソフトウェアの構成を表すファイル」という概念に近いものです。SPDXやCycloneDXは、SBOMを作成するために広く使われている標準形式(フォーマット)です。
極端な話、SPDXやCycloneDXを使わなくてもSBOMと言い張ることは可能です。

標準形式 説明 公式サイト
SPDX Linux Foundationが提供するSBOM仕様。 SPDX公式
CycloneDX 高速で軽量なSBOM形式。 CycloneDX公式

このブログではSPDXに焦点を当てて書いていきます。

SPDXとは?

SPDX(System Package Data Exchange)はLinux Foundationが提供しているSBOM仕様です。
まずは例を見てみましょう。SPDX公式のJSON形式の例です。

https://github.com/spdx/spdx-spec/blob/develop/examples/jsonld/package_sbom.json

前提として、SPDXは9つのProfileと呼ばれるもので構成されています。
上の例で言えば、CreationInfoPersonSpdxDocumentRelationshipProfile Coreに属します。そしてsoftware_Sbomsoftware_PackageProfile Softwareに属します。
これらのProfileを組み合わせて必要な情報を記載し、SPDXを作成します。

それぞれのProfileの役割については、こちらをご覧ください。Core Profileのみ必須となっており、その他のProfileは任意です。必要なものだけ書いていく感じですね。

プロファイル名 説明 目的と特徴
Core Profile 全てのSPDXプロファイルで使用可能な基本クラスとプロパティを定義。 SBOM情報の基盤を提供し、ツール間での情報交換を支援。
Software Profile ソフトウェアに関する詳細情報を定義。 ソフトウェア関連情報の交換を支援。
Security Profile ソフトウェアの脆弱性情報を定義。 セキュリティ情報の交換を支援。
Licensing Profile ソフトウェアライセンスや知的財産情報を定義。 ライセンス情報の詳細な表現と交換を支援。
Dataset Profile AIシステムで使用されるデータセット情報を定義。 データセットの構造やメタデータの理解と交換を支援。
AI Profile AIシステム関連のソフトウェアコンポーネントを定義。 AIモデルとシステム情報の交換を支援。
Build Profile ソフトウェアのビルドプロセス情報を定義。 ビルドプロセスの詳細を表現し、交換を支援。
Lite Profile 最小限のライセンス情報を定義。 SBOM作成時の最低限の情報交換を支援。
Extension Profile 独自または拡張されたSPDXコンテンツを定義。 標準を超えた情報の拡張と相互運用性を提供。

SPDXのアーキテクチャ

SPDXの理解には必要なため、アーキテクチャについて簡単にご紹介します。
SPDXがProfileで構成されていることは先述した通りです。このProfileはオブジェクト指向で設計されています。

SPDXアーキテクチャ
SPDXのクラス図

上記のクラス図がその継承関係を表したものです。こちらには、Profile CoreとProfile Softwareのみ載っており、その他のProfileはまた別のクラス図で表現されています。

画像の読み取りポイントはこちらです。

  • 画像上の塊がProfile Core
  • 画像左下の塊がProfile Software
  • 画像右下の塊がEnum定義
  • Profileの中には複数のクラスが含まれていて、そのクラスのプロパティをJSON形式やXML形式で書いていく
  • クラスは継承関係を持つ。そのため、Profile SoftwareがProfile Coreのプロパティを一部持っている
  • それぞれプロパティはminとmaxが決まっている。継承によってminとmaxが上書きされる場合もある

SPDXの詳しいドキュメントについてはこちらをご覧ください。
https://spdx.github.io/spdx-spec/v3.0.1/

SBOMツール

これまで見てきたように、SPDXやCycloneDXに準拠したSBOMはフォーマットが決まっており、機械判読可能です。つまりツールを用いた「作成の自動化」「読み取りの自動化」が可能です。
有名なツールにはFOSSABlack Duckなどがあります。

SBOMツールの特徴

  • 自動化:SBOMの作成や脆弱性の検出を自動で行えます。
  • 有償・無償:機能やサポート内容に応じて選択可能。
  • ブラウザでの可視化:SBOMの結果を視覚的に確認できます。

FOSSAの画面

引用:https://www.youtube.com/watch?v=mnaThx07m8Y&t=54s

詳細なツールの比較はこちらのまとめサイトをご参照ください。

SBOMのこれから

SBOMはこれから広く使われるようになるのでしょうか?

国内の一部調査によると、導入率は10数%とされています。

https://japan.zdnet.com/article/35212809/
https://prtimes.jp/main/html/rd/p/000000025.000089232.html

導入率が低いと感じる一方で、トヨタや日立といった企業がSBOMに前向きな姿勢を見せています。今後広まって行きそうな機運は感じますね。
ぜひ、活用を検討してみては!

https://japan.zdnet.com/article/35218970/

Appendix

より詳しく知りたい方向けに、経産省の資料です。
https://www.meti.go.jp/press/2024/08/20240829001/20240829001-1r.pdf

Discussion