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: CONTAINER や FILE はスキャン対象そのもの・ファイルを表すため、依存パッケージとしては取り込まれません。
各パッケージの実際のソフトウェア種別(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_OF(RUNTIME_DEPENDENCY_OF 等) |
依存関係として取り込む |
| メタ・来歴・系譜 | DESCRIBES / GENERATES / ANCESTOR_OF など |
取り込まない |
依存関係として取り込んだものは、CycloneDX の dependencies と同様に解釈されます。
- 親が OS の場合、その配下のパッケージは OS パッケージとして取り入れます。
- 親がアプリケーションの場合、その配下のパッケージは依存ライブラリとして取り入れます。
- ネストされた依存関係は、再帰的に取り入れます。
- どの
relationshipsにも現れないSPDXIDは、PURL を参照し、OS パッケージと依存ライブラリに分けて取り入れます。