Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenSSFツール紹介 : protobom

OpenSSFツール紹介 : protobom

下沢拓氏 (日立製作所)
2025年7月30日開催 OSSセキュリティMeetup 講演資料

Avatar for Linux Foundation Japan

Linux Foundation Japan PRO

July 31, 2025
Tweet

More Decks by Linux Foundation Japan

Other Decks in Technology

Transcript

  1. What’s protobom? • OpenSSF Security Tooling WGのプロジェクト • “A universal

    SBOM representation in protocol buffers” • SPDXやCycloneDXのSBOMをprotocol buffer (protobuf) として表現するライブラリ • SPDX・CycloneDXといったフォーマットに中立的で、かつ、ロスなく表現できる • リポジトリ • https://github.com/protobom/protobom • 開発者・経緯 • Adolfo García Veytia (元chainguard, 現Stacklok) • 2023年6月から開発 • 2024年4月16日、OpenSSF・CISA・DHS S&Tが共同でprotobomのlaunchをアナウンス • https://openssf.org/press-release/2024/04/16/cisa-dhs-st-and-openssf-announce-global-launch- of-software-supply-chain-open-source-project/
  2. OpenSSFツール紹介: protobom 4 実行例 (protobom v0.5.2) • 試用したSBOM: SyftをUbuntuのDockerイメージに対して実行したもの (CycloneDX,

    JSON) { "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json", "bomFormat": "CycloneDX", "specVersion": "1.6", "serialNumber": "urn:uuid:ea1f0aa2-d531-4145-bc78- 273f03cf4251", "version": 1, "metadata": { "timestamp": "2025-07-17T12:26:59+09:00", "tools": { "components": [ { "type": "application", "author": "anchore", "name": "syft", "version": "1.28.0" } ] }, "component": { "bom-ref": "f09e7cf53fef712c", "type": "container", "name": "ubuntu", "version": "sha256:4f1db91d9560cf107b5832c0761364ec64f46777aa4ec637cca3008f2 87c975e" }, "properties": [ { "name": "syft:image:labels:org.opencontainers.image.ref.name", "value": "ubuntu" }, { "name": "syft:image:labels:org.opencontainers.image.version", "value": "24.04" } ] }, "components": [ { "bom-ref": "pkg:deb/ubuntu/[email protected]?arch=amd64&distro=ubuntu-24.04&package- id=bfe0855a529838fa", "type": "library", "publisher": "Ubuntu Developers <ubuntu-devel- [email protected]>", "name": "apt", "version": "2.8.3", "licenses": [ { "license": { "id": "BSD-3-Clause" } }, { "license": { "id": "GPL-2.0-only" } }, { "license": { "id": "GPL-2.0-or-later" } }, .// ], "cpe": "cpe:2.3:a:apt:apt:2.8.3:*:*:*:*:*:*:*", "purl": "pkg:deb/ubuntu/[email protected]?arch=amd64&distro=ubuntu-24.04", "properties": [ { "name": "syft:package:foundBy", "value": "dpkg-db-cataloger" }, { "name": "syft:package:type", "value": "deb" },
  3. OpenSSFツール紹介: protobom 5 実行例 package main import ( "fmt" "os"

    "github.com/protobom/protobom/pkg/formats" "github.com/protobom/protobom/pkg/reader" "github.com/protobom/protobom/pkg/writer" ) func main() { reader :/ reader.New() document, err :/ reader.ParseFile("./input.json") if err !/ nil { fmt.Fprintf(os.Stderr, "Error parsing SBOM json¥n") return } writer :/ writer.New(writer.WithFormat(formats.SPDX23JSON)) writer.WriteFile(document, "./output.json") } • Goプログラム例 (1) • 前ページのSBOM (json)を読み込み、SPDX 2.3形式として書き出す • reader.ParseFileの返り値であるdocumentが SBOMをパーズした結果 (protobufでの表現) Go
  4. OpenSSFツール紹介: protobom 6 出力の比較 (1): メタデータとルートコンポーネント { "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json", "bomFormat":

    "CycloneDX", "specVersion": "1.6", "serialNumber": "urn:uuid:ea1f0aa2-d531-4145-bc78- 273f03cf4251", "version": 1, "metadata": { "timestamp": "2025-07-17T12:26:59+09:00", "tools": { "components": [ { "type": "application", "author": "anchore", "name": "syft", "version": "1.28.0" } ] }, "component": { "bom-ref": "f09e7cf53fef712c", "type": "container", "name": "ubuntu", "version": "sha256:4f1db91d9560cf107b5832c0761364ec64f46777aa4ec637cca3008f2 87c975e" }, "properties": [ { "name": "syft:image:labels:org.opencontainers.image.ref.name", "value": "ubuntu" }, { "name": "syft:image:labels:org.opencontainers.image.version", "value": "24.04" } ] }, { "spdxVersion": "SPDX-2.3", "dataLicense": "CC0-1.0", "SPDXID": "SPDXRef-DOCUMENT", "name": "", "documentNamespace": "urn:uuid:ea1f0aa2-d531-4145-bc78- 273f03cf4251", "creationInfo": { "licenseListVersion": "3.20", "creators": [ "Tool: protobom-devel" ], "created": "2025-07-17T05:15:54Z" }, "packages": [ { "name": "ubuntu", "SPDXID": "SPDXRef-f09e7cf53fef712c", "versionInfo": "sha256:4f1db91d9560cf107b5832c0761364ec64f46777aa4ec637cca3008f2 87c975e", "downloadLocation": "NOASSERTION", "filesAnalyzed": false, "primaryPackagePurpose": "CONTAINER" }, Input (CycloneDX) Output (SPDX) [凡例] 保持されている内容 失われている内容 置き換わっている内容
  5. OpenSSFツール紹介: protobom 7 出力の比較 (2): 依存コンポーネント "components": [ { "bom-ref":

    "pkg:deb/ubuntu/[email protected]?arch=amd64&distro=ubuntu-24.04&package- id=bfe0855a529838fa", "type": "library", "publisher": "Ubuntu Developers <ubuntu-devel- [email protected]>", "name": "apt", "version": "2.8.3", "licenses": [ { "license": { "id": "BSD-3-Clause" } }, { "license": { "id": "GPL-2.0-only" } }, { "license": { "id": "GPL-2.0-or-later" } }, .// ], "cpe": "cpe:2.3:a:apt:apt:2.8.3:*:*:*:*:*:*:*", "purl": "pkg:deb/ubuntu/[email protected]?arch=amd64&distro=ubuntu-24.04", "properties": [ { "name": "syft:package:foundBy", "value": "dpkg-db-cataloger" }, { "name": "syft:package:type", "value": "deb" }, { "name": "apt", "SPDXID": "SPDXRef- pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=bfe0855a529838fa", "versionInfo": "2.8.3", "downloadLocation": "NOASSERTION", "filesAnalyzed": false, "licenseConcluded": "BSD-3-Clause(BSD-3-Clause) OR (GPL-2.0-only)(BSD-3-Clause(BSD-3-Clause) OR (GPL-2.0-only)) OR (GPL-2.0-or-later)", "licenseDeclared": "BSD-3-Clause", "externalRefs": [ { "referenceCategory": "PACKAGE-MANAGER", "referenceType": "purl", "referenceLocator": "pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu-24.04" }, { "referenceCategory": "SECURITY", "referenceType": "cpe23Type", "referenceLocator": "cpe:2.3:a:apt:apt:2.8.3:*:*:*:*:*:*:*" } ], "primaryPackagePurpose": "LIBRARY" }, Input (CycloneDX) Output (SPDX) [凡例] 保持されている内容 失われている内容 置き換わっている内容
  6. OpenSSFツール紹介: protobom 8 出力の比較 (3): 依存関係 "dependencies”: [ { “ref”:

    “pkg:deb/ubuntu/[email protected]?arch=amd64&distro=ubuntu-24.04&package- id=bfe0855a529838fa”, “dependsOn”: [ “pkg:deb/ubuntu/base- [email protected]?arch=amd64&distro=ubuntu-24.04&package- id=628f5a2163cf1196”, “pkg:deb/ubuntu/[email protected] 2ubuntu17.3?arch=amd64&distro=ubuntu-24.04&package- id=21d76c4fb81983b3&upstream=gnupg2”, “pkg:deb/ubuntu/libapt- [email protected]?arch=amd64&distro=ubuntu-24.04&package- id=13d506459809d51e&upstream=apt”, ”, “pkg:deb/ubuntu/[email protected] 0ubuntu8.5?arch=amd64&distro=ubuntu-24.04&package- id=7879568dca2ffae6&upstream=glibc .// ] },.// “relationships”: [ { "spdxElementId": "SPDXRef- pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=bfe0855a529838fa", "relatedSpdxElement": "SPDXRef-pkg:deb/ubuntu/base- [email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=628f5a2163cf1196", "relationshipType": "CONTAINS" }, { "spdxElementId": "SPDXRef- pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=bfe0855a529838fa", "relatedSpdxElement": "SPDXRef- pkg:deb/ubuntu/[email protected] 2ubuntu17.3?arch=amd64¥u0026distro=ubuntu-24.04¥u0026package- id=21d76c4fb81983b3¥u0026upstream=gnupg2", "relationshipType": "CONTAINS" }, { "spdxElementId": "SPDXRef- pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=bfe0855a529838fa", "relatedSpdxElement": "SPDXRef-pkg:deb/ubuntu/libapt- [email protected]?arch=amd64¥u0026distro=ubuntu-24.04¥u0026package- id=13d506459809d51e¥u0026upstream=apt", "relationshipType": "CONTAINS" }, { "spdxElementId": "SPDXRef- pkg:deb/ubuntu/[email protected]?arch=amd64¥u0026distro=ubuntu- 24.04¥u0026package-id=bfe0855a529838fa", "relatedSpdxElement": "SPDXRef- pkg:deb/ubuntu/[email protected] 0ubuntu8.5?arch=amd64¥u0026distro=ubuntu-24.04¥u0026package- id=7879568dca2ffae6¥u0026upstream=glibc", "relationshipType": "CONTAINS" },.// Input (CycloneDX) Output (SPDX) [凡例] 保持されている内容 失われている内容 置き換わっている内容 aptがbase-passwd, gpgv, libapt-pkg….に依存してい る syftで直接SPDXを出力すると、関 係が逆で “DEPENDENCY_OF”として出る
  7. OpenSSFツール紹介: protobom 9 出力の比較 (4): ファイル "components”: [ { "bom-ref":

    "47a587f1163f9f0c", "type": "file", "name": "/etc/apt/apt.conf.d/70debconf", "hashes": [ { "alg": "SHA-1", "content": "8d02d7c5507330294f8eba69adc413e35c70225b" }, { "alg": "SHA-256", "content": "db749e19baf3b72ca2c157c70c52522cae23d94bc8b2dc5793fd43d427445367 " } ] }, .// “files”: [ { "fileName": "/etc/apt/apt.conf.d/70debconf", "SPDXID": "SPDXRef-47a587f1163f9f0c", "checksums": [ { "algorithm": "SHA1", "checksumValue": "8d02d7c5507330294f8eba69adc413e35c70225b" }, { "algorithm": "SHA256", "checksumValue": "db749e19baf3b72ca2c157c70c52522cae23d94bc8b2dc5793fd43d427445367 " } ], "copyrightText": "NONE" }, .// “relationship”: [ { "spdxElementId": "SPDXRef-f09e7cf53fef712c", "relatedSpdxElement": "SPDXRef-47a587f1163f9f0c", "relationshipType": "CONTAINS" }, .// Input (CycloneDX) Output (SPDX) [凡例] 保持されている内容 失われている内容 置き換わっている内容 /etc/apt/apt.conf.d/70debconfというファイルが コンテナ内にある コンテナをコンポーネントとしているの で、CONTAINSで関係を出力
  8. OpenSSFツール紹介: protobom 10 protobomでのデータ構造 Document Metadata NodeList Metadata NodeList •

    Id • Version • Name • Date • Tools • Authors • Comment • DocumentTypes • SourceData Nodes Edges RootElements Node Node Node Edge Edge Edge Node Edge • Type: Package / File • Name • Version • FileName • UrlHome • UrlDownload • Licenses • LicenseConcluded • LicenseComments • Copyright • SourceInfo • Comment • Summary • Description • Attribution • Supplier • Originators • ReleaseDate • BuildDate • ValidUntilDate • ExternalReferences • FileTypes • Identifiers • Hashes • PrimaryPurpose • Properties From To To To Type • Contains • Contained_by • Depends_on • Dependency_of • …
  9. protobomでのデータ構造の活用例 document :/ sbom.NewDocument() document.Metadata.Authors = append( document.Metadata.Authors, &sbom.Person{Name: "John

    Doe"}, ) document.Metadata.Tools = append( document.Metadata.Tools, &sbom.Tool{ Name: "ACME SBOM Tool", Version: "1.0", Vendor: "ACME Corporation"}, ) appNode :/ &sbom.Node{ Id: "pkg:generic/[email protected]", PrimaryPurpose: []sbom.Purpose{sbom.Purpose_APPLICATION}, Name: "My Software Name", Version: "v1.0.0", Licenses: []string{"Apache-2.0"}, LicenseConcluded: "Apache-2.0", LicenseComments: "Apache License", } document.NodeList.AddRootNode(appNode) node1 :/ &sbom.Node{ Id: "File-/usr-lib-libsoftware.so", Type: sbom.Node_FILE, Name: "/usr/lib/libsoftware.so", Version: "1", Copyright: "Copyright 2023 The ACME Corporation", Description: "Software Lib", } node1.AddHash(sbom.HashAlgorithm_SHA1, "f3ae11065cafc14e27a1410ae8be28e600bb8336") node1.AddHash(sbom.HashAlgorithm_SHA256, "4f232eeb99e1663d07f0af1af6ea262bf594934b694228e71fd8f159f9a19f32") document.NodeList.AddNode(node1) document.RelateNodeAtID(node1, appNode.Id, sbom.Edge_contains)… Go • Goプログラム例 (2) • SBOMをGoのプログラムで作 成する例 • (README.mdより引用)
  10. OpenSSFツール紹介: protobom 12 bomctl: protobomを利用したツール • OpenSSF Security Tooling WGのプロジェクト

    • フォーマット非依存でSBOMを取り扱うツール • 「SBOM生成ツールとSBOM解析ツールのギャップ」を埋めるツール • https://github.com/bomctl/bomctl SBOM A SBOM B SBOM C ローカル キャッシュ bomctl import bomctl fetch bomctl alias bomctl list bomctl merge bomctl tag Output SBOM bomctl export bomctl push
  11. OpenSSFツール紹介: protobom 13 まとめ • protobom • SBOMをprotobufで表現し、SPDXやCycloneDXといったフォーマットによらずプログラムから扱えるようにするライブ ラリ •

    フォーマットの変換にも利用可能 • 新しいフォーマット (SPDX 3.0など) への対応計画はあるもののまだ進んでいない • ツール依存の細かいプロパティなどは情報が落ちる可能性がある • 何も操作せずに入力→出力した場合でも、同じものは出力されない • bomctlなど、OpenSSFの他のプロジェクトでも活用されている