🥦

法規制が予想されるSBOMについて

2023/08/12に公開

ソフトウェア部品表入門

SBOMとは

SBOM(Software Bill of Materials、ソフトウェア部品表)はソフトウェアで使われている各コンポーネントやそれらの依存関係の情報をまとめたリストです。プロダクトとしてのソフトウェアの中に社内コンポーネントを使っている場合もあるので、必ずしも一致するわけではないですが、ざっくり言えば使っているライブラリーの一覧表です。

アメリカでは2021年にサイバーセキュリティに関する大統領令が出てから、政府機関に提供されるソフトウエアに関してはサプライチェーンの安全性向上のためにSBOMが要求されています。同様に欧州でもサイバーレジリエンス法(CRA)でSBOM周りの強化が予定されています。

米国大統領令においてはSBOMの公開は必須ではないですが、EU CRAの草案ではすべてのデジタル製品が対象となっているなど温度感に違いはあるようです。

QUAD (日米豪印戦略対話)で政府調達ソフトウェアの安全性の共同原則が発表されたこともあり、日本でもSBOM周りの規制の導入が検討されており、2023/7にソフトウェア管理に向けたSBOM(Software Bill of Materials)の導入に関する手引が公開されました。

今後の規制に備えてSBOM周りの仕様についてまとめておきます。

パッケージマネージャーのロックファイルはSBOMではない

最初に自分が思った疑問はパッケージマネージャーのロックファイルはSBOMか?でした。

モダンな言語ならその言語に特化したパッケージマネージャーが存在し、Rubyならbundler、PHPならcomposer、node.jsならnpmやyarnが該当します。Rubyで言うとバージョンを要件を定めたGemfileをベースに開発環境でライブラリー(gem)をインストールすると、完了時に解決結果をGemfile.lockが生成されます。

ライブラリーの脆弱性管理で言うと、Gemfile.lockベースに解析して更新が必要なgemを教えてくれるライブラリーは存在し、一見SBOMが達成したかったことはSBOMを使わずとも達成できているように思います。Gemfile.lockはSBOMでしょうか?

NTIA(米国電気通信情報庁)ではThe Minimum Elements For a Software Bill of Materials を公開しており、データフィールドに以下を含めるよう要求しています。

  • サプライヤー名
  • コンポーネント名
  • コンポーネントのバージョン
  • その他の一意な識別子
  • 依存関係
  • SBOM作成者
  • タイムスタンプ

discourseのGemfile.lockをベースに語るとコンポーネント名とコンポーネントのバージョン、依存関係 、GitHubベースにインストールしているgemは(repositoryのownerがわかるので)かろうじてサプライヤー名がわかりますが、SBOM作成者やタイムスタンプの情報はなさそうです。

少なくとも素朴な出力においてGemfile.lockはNTIAの定めるSBOMではないとは言えそうです。

SBOMの種類

さてそうなるとSBOMが必要な場合、SBOMファイルを生成する必要があるのですが、ややこしいことにSBOM自体は要件を示しているに過ぎず、SBOMのファイルフォーマットには派閥があります。

  • SPDX(Software Package Data Exchange)
  • SPDX-Lite
  • CycloneDX
  • SWID タグ(Software Identification タグ)

SPDX、CycloneDXが2大人気です。

(第7回 サイバー・フィジカル・セキュリティ確保に向けたソフトウェア管理手法等検討タスクフォースの資料より抜粋)

SPDXはLinux Foundation の傘下のプロジェクトによって開発された SBOM フォーマットです。2021年には ISO/IEC 5962:2021 として国際標準化されています。Tag-Value(txt)、RDF、xls、json、YAML、xml をサポート。

SPDX-LiteはSPDXの一部の項目を抽出した日本発のフォーマット。Tag-Value(txt)、RDF、xls、json、YAML、xml をサポート。

CycloneDXはOWASPによって作成されたSBOMのフォーマット。OWASPはOWASP ZAPなどの脆弱性診断ツールも有名ですね。json、xml、protobufをサポート。

SWIDタグはソフトウェア識別 (SWID) タグを作成するための国際標準(ISO/IEC 19770-2)。xmlをサポート。

SBOMを出力する方法

SBOM出力は無料のツールと有償のツールがあります。

2023/3にGitHubがSBOM出力に対応したので対応言語ではそれを使うのが一番簡単かもしれません。SPDXとCycloneDXに対応しています。

言語ごとのライブラリーはもっとあるはずでRubyで言うとCycloneDX限定でgemが存在するようです。

無料のツール

  • Augur
  • BOM Doctor
  • Checkov
  • Daggerboard
  • Dependency- Track
  • FOSSology
  • in-toto
  • OSS Review Toolkit (ORT)
  • SBOM Tool
  • ScanCode.io
  • Scancode Toolkit
  • SW360
  • SwiftBOM
  • Syft & Grype
  • Trivy
  • GitHub
  • 言語ごとのライブラリー

有償のツール

  • Black Duck
  • Checkmarx SCA
  • FOSSA
  • FossID
  • Insignary Clarity
  • MEND SCA
  • Revenera SCA
  • Snyk
  • Sonatype Lifecycle
  • Veracode SCA
  • Yamory

ファイルフォーマットだけでも十分ややこしいのですが、NTIAのSBOMの最小要件は一部でしかないので、自由部分は各社自由に拡張しています。

(第6回 サイバー・フィジカル・セキュリティ確保に向けたソフトウェア管理手法等検討タスクフォースより抜粋)

自動抽出がどこまで有効かも議論のポイントでスクリプト言語のライブラリーで一部Cによる高速化しているとして、CのライブラリーはSBOMに含まれているか?といえば微妙な気もします。

GitHubでSBOMを出力してみる

前述の通りGitHubはSBOM出力をサポートしているので、Dependency graphからExport SBOMを押すとファイルを得られます。出力はSPDX形式でCycloneDXで欲しい場合はcli叩かないとダメみたいですね。

{
  "SPDXID": "SPDXRef-DOCUMENT",
  "spdxVersion": "SPDX-2.3",
  "creationInfo": {
    "created": "2023-08-12T09:59:17Z",
    "creators": [
      "Tool: GitHub.com-Dependency-Graph"
    ]
  },
  "name": "com.github.discourse/discourse",
  "dataLicense": "CC0-1.0",
  "documentDescribes": [
    "SPDXRef-com.github.discourse-discourse"
  ],
  "documentNamespace": "https://github.com/discourse/discourse/dependency_graph/sbom-387a0a4beae6935b",
  "packages": [
    {
      "SPDXID": "SPDXRef-com.github.discourse-discourse",
      "name": "com.github.discourse/discourse",
      "versionInfo": "",
      "downloadLocation": "NOASSERTION",
      "licenseDeclared": "NOASSERTION",
      "licenseConcluded": "NOASSERTION",
      "filesAnalyzed": false,
      "supplier": "NOASSERTION"
    },
    {
      "SPDXID": "SPDXRef-rubygems-actionview-precompiler",
      "name": "rubygems:actionview_precompiler",
      "versionInfo": ">= 0",
      "downloadLocation": "NOASSERTION",
      "filesAnalyzed": false,
      "licenseConcluded": "NOASSERTION",
      "licenseDeclared": "NOASSERTION",
      "supplier": "NOASSERTION"
    },
    {
      "SPDXID": "SPDXRef-rubygems-active-model-serializers",
      "name": "rubygems:active_model_serializers",
      "versionInfo": "~> 0.8.3",
      "downloadLocation": "NOASSERTION",
      "filesAnalyzed": false,
      "licenseConcluded": "NOASSERTION",
      "licenseDeclared": "NOASSERTION",
      "supplier": "NOASSERTION"
    },
    {
      "SPDXID": "SPDXRef-rubygems-debug-inspector-1.1.0",
      "name": "rubygems:debug_inspector",
      "versionInfo": "1.1.0",
      "downloadLocation": "NOASSERTION",
      "filesAnalyzed": false,
      "licenseConcluded": "MIT",
      "licenseDeclared": "NOASSERTION",
      "supplier": "NOASSERTION",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceLocator": "pkg:gem/debug_inspector@1.1.0",
          "referenceType": "purl"
        }
      ]
    }, 
}

まとめ

まとめです。

  • SBOMはソフトウェア部品表で依存関係をまとめたファイル
  • アメリカ、欧州ではすでに規制の流れで日本にも来そう
  • 既存のパッケージマネージャーのlockファイルはSBOMとして使えない
  • SBOMのファイルフォーマットには種類がある
  • SBOM出力は無料/有償のツールででき、GitHubでの出力が比較的簡単

Discussion