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

OpenSSFツール紹介 : protobom

OpenSSFツール紹介 : protobom

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

Linux Foundation Japan PRO

July 31, 2025

Transcript

13 slides
  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の他のプロジェクトでも活用されている

More Decks by Linux Foundation Japan

Other Decks in Technology