コンテンツにスキップ

SPDX形式のインポート仕様#

Linux Foundation の SPDX(v2.x)形式の SBOM について、FutureVuls がどのフィールドをどう解釈してインポートするかを説明します。

コンポーネントの種別判定や OS・依存ライブラリの取り込みといった形式に依存しない共通仕様は「SBOMのインポート仕様」を参照してください。本ページでは SPDX 固有のフィールド対応 を説明します。

FutureVuls は、SPDX の以下の情報を読み取ります。

creationInfo#

  "creationInfo": {
    "creators": [
      "Organization: aquasecurity",
      "Tool: trivy-0.43.0"
    ],
    "created": "2023-08-08T08:01:33Z"
  }

creators により生成されたツールを検知します。

packages#

  "packages": [
    {
      "name": "ami-xxxxxxxxxxxxxxxxx",
      "SPDXID": "SPDXRef-Vm-888578fefc6f6735",
      "primaryPackagePurpose": "SOURCE"
    },
    {
      "name": "amazon",
      "SPDXID": "SPDXRef-OperatingSystem-541077021f563a3e",
      "versionInfo": "2023",
      "primaryPackagePurpose": "OPERATING-SYSTEM"
    },
    {
      "name": "bash",
      "SPDXID": "SPDXRef-Package-2a97fe8298d3deed",
      "versionInfo": "4.2.46-34.amzn2023",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:rpm/amazon/bash@4.2.46-34.amzn2023?arch=x86_64"
        }
      ],
      "primaryPackagePurpose": "LIBRARY"
    },
    {
      "name": "opt/vuls-saas/vuls",
      "SPDXID": "SPDXRef-Application-d72df2bc81701c51",
      "attributionTexts": [
        "Type: gobinary"
      ],
      "primaryPackagePurpose": "APPLICATION"
    },
    {
      "name": "github.com/vulsio/go-exploitdb",
      "SPDXID": "SPDXRef-Package-59634f967256ffb1",
      "versionInfo": "v0.4.2",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:golang/github.com/vulsio/go-exploitdb@v0.4.2"
        }
      ],
      "primaryPackagePurpose": "LIBRARY"
    },
    ...
  ]

SPDX のソフトウェア一覧を表す packages の種類は、primaryPackagePurpose を優先して判別します。

primaryPackagePurpose が指定されていない場合は、SPDXID のプレフィックス(例: SPDXRef-OperatingSystem-xxxx)を利用してソフトウェアの種類を判別します。

primaryPackagePurpose SPDXID プレフィックス 取り込み
OPERATING-SYSTEM SPDXRef-OperatingSystem-... OS 情報として取り入れます
APPLICATION SPDXRef-Application-... アプリケーション情報として取り入れます
LIBRARY など上記以外 SPDXRef-Package-... OS パッケージ、もしくは言語ライブラリ情報として取り入れます

なお、primaryPackagePurpose: CONTAINERFILE はスキャン対象そのもの・ファイルを表すため、依存パッケージとしては取り込まれません。

各パッケージの実際のソフトウェア種別(os / library / private)は、externalRefs に記載された PURL(referenceType: purl)や CPE(referenceType: cpe23 / cpe22)の情報をもとに判定されます。判定ルールは「コンポーネントの種別判定」を参照してください。 また、licenseConcluded / licenseDeclared に記載されたライセンス情報も取り込みます。

relationships#

  "relationships": [
    {
      "spdxElementId": "SPDXRef-DOCUMENT",
      "relatedSpdxElement": "SPDXRef-Vm-888578fefc6f6735",
      "relationshipType": "DESCRIBES"
    },
    {
      "spdxElementId": "SPDXRef-Vm-888578fefc6f6735",
      "relatedSpdxElement": "SPDXRef-OperatingSystem-541077021f563a3e",
      "relationshipType": "CONTAINS"
    },
    {
      "spdxElementId": "SPDXRef-OperatingSystem-541077021f563a3e",
      "relatedSpdxElement": "SPDXRef-Package-2a97fe8298d3deed",
      "relationshipType": "CONTAINS"
    },
    {
      "spdxElementId": "SPDXRef-Vm-888578fefc6f6735",
      "relatedSpdxElement": "SPDXRef-Application-d72df2bc81701c51",
      "relationshipType": "CONTAINS"
    },
    {
      "spdxElementId": "SPDXRef-Application-d72df2bc81701c51",
      "relatedSpdxElement": "SPDXRef-Package-59634f967256ffb1",
      "relationshipType": "CONTAINS"
    },
    ...
  ]

まず、relationshipType によって依存関係として扱うかどうかが決まります。

区分 relationshipType の例 扱い
依存・包含・リンク DEPENDS_ON / CONTAINS / STATIC_LINK / DYNAMIC_LINK、逆方向の CONTAINED_BY / DEPENDENCY_OF、各種 *_DEPENDENCY_OFRUNTIME_DEPENDENCY_OF 等) 依存関係として取り込む
メタ・来歴・系譜 DESCRIBES / GENERATES / ANCESTOR_OF など 取り込まない

依存関係として取り込んだものは、CycloneDX の dependencies と同様に解釈されます。

  • 親が OS の場合、その配下のパッケージは OS パッケージとして取り入れます。
  • 親がアプリケーションの場合、その配下のパッケージは依存ライブラリとして取り入れます。
  • ネストされた依存関係は、再帰的に取り入れます。
  • どの relationships にも現れない SPDXID は、PURL を参照し、OS パッケージと依存ライブラリに分けて取り入れます。