2021年12月のLog4Shell(CVE-2021-44228)で、多くの組織が真っ先に直面したのは「自社の製品にLog4jが入っているか」という単純な問いだった。その答えがすぐ出せなかった事実こそ、SBOMが必要とされる理由を端的に示している。

SBOM(Software Bill of Materials、ソフトウェア部品表)は、ソフトウェアに含まれる全コンポーネントとバージョン、依存関係を機械可読な形式で一覧化した文書だ。サプライチェーン攻撃が常態化したいま、防御の出発点になる。

サプライチェーン攻撃の全体像は サプライチェーンセキュリティ2026|攻撃手法・防御ツール・実践チェックリスト をご覧ください。

この記事のポイント
  • SBOMの本質は「自分が使っているソフトの全成分表を機械可読で持つこと」。脆弱性や汚染パッケージ公表時に影響範囲を秒で特定できる
  • 標準フォーマットはSPDX(Linux Foundation・ISO/IEC 5962)CycloneDX(OWASP・Ecma ECMA-424)の2大勢力。生成ツールはどちらも出力できる
  • 生成はSyft・Trivy・cargo-sbom、CI組み込みはGitHub Actions、改ざん対策はSigstore cosignの署名・検証。生成→署名→検証を自動化して初めて運用が回る

30秒でわかるSBOM——ソフトウェア部品表とサプライチェーン防御の要点

時間がない読者のために、SBOMの要点を先にまとめる。詳細は各セクションで掘り下げる。

SBOMとは:ソフトウェアの依存パッケージ・ライブラリを一覧化した「部品表」。製造業のBOMのソフト版
なぜ必要か:Log4Shellやnpmワーム(Shai-Hulud系)の公表時、影響範囲を即特定するため。リストがなければ手作業の棚卸しになる
2大フォーマット:ライセンス・来歴重視ならSPDX、脆弱性・セキュリティ運用重視ならCycloneDX
生成ツール:コンテナ/ファイルはSyft・Trivy、Rustはcargo-sbom。CIに組み込めば自動生成
改ざん対策:Sigstoreのcosignでattestation署名し、配布側でverify-attestation検証
法規制:米大統領令14028で連邦調達に必須化、EU CRAは2027年12月から本格適用へ

SBOMは「作って終わり」ではなく、生成・保管・署名・検証・更新のライフサイクルで運用する点が要だ。以下で具体的なコマンドと自動化の組み方を示す。

SBOMとは何か——ソフトウェア部品表が解決する依存関係の不可視問題

現代のソフトウェアは、自分で書いたコードよりも依存パッケージのほうが圧倒的に多い。npmの小さなアプリでも、推移的依存を含めれば数百〜千を超えるパッケージが同梱される。

問題は、その全容を誰も把握していないことだ。直接依存はpackage.jsonで見えても、依存の依存(推移的依存)は手作業では追えない。SBOMはこの不可視な依存ツリーを機械可読な一覧に変換する。

NTIAが定めた最小要素

米国のNTIA(国家電気通信情報管理庁)は2021年、SBOMが最低限満たすべき要素を定義した。これは大統領令14028を受けた成果で、いまも事実上の基準になっている。最小要素は3つのカテゴリで構成される。

データフィールド:各コンポーネントについて追跡すべき基本情報
自動化対応:機械可読フォーマットで自動生成・自動処理できること
運用プロセス:SBOMの要求・生成・利用の運用ルール

データフィールドはさらに7項目に分かれる。下表がその全量だ。生成ツールが出力するフィールドが、この7項目を満たしているかが品質の最初のチェックポイントになる。

# データフィールド 内容
1 供給者名(Supplier Name) コンポーネントを作成・提供した個人または組織
2 コンポーネント名(Component Name) 供給者が定めるソフトウェア単位の名前
3 バージョン(Version) 前バージョンからの変更を識別する識別子
4 一意識別子(Other Unique Identifiers) PURL・CPE・SWIDタグなどの機械可読ID
5 依存関係(Dependency Relationship) 上流コンポーネントとの依存の関係
6 SBOM作成者(Author) このSBOMデータを作成した主体
7 タイムスタンプ(Timestamp) SBOM作成日時。ISO 8601・UTC表記

NTIAは自動化対応の前提として、SPDX・CycloneDX・SWIDのいずれかの標準形式に準拠することを求めている。なお2025年8月にはCISAが最小要素の改訂版ドラフトを公開し、ハッシュ値やライセンス情報などフィールドの拡充が議論されている。

コンポーネントを一意に指す識別子

7項目のうち実運用で効いてくるのが「一意識別子」だ。同じ名前のパッケージが別エコシステムに存在するため、名前だけでは特定できない。ここで使われるのがPURL(Package URL)やCPE(Common Platform Enumeration)といった機械可読IDだ。

例えばPURLはpkg:npm/[email protected]のように、エコシステム・パッケージ名・バージョンを1つの文字列で表す。SBOMがこの識別子を持つことで、脆弱性データベースとの自動照合が可能になり、人手の名寄せが不要になる。逆に識別子が欠けたSBOMは、いざ照合する段で使い物にならない。

なぜSBOMが必要か——Log4jとShai-Hulud系ワームが突きつけた現実

SBOMの価値は、インシデント発生時に最も鮮明になる。脆弱性や汚染パッケージが公表された瞬間、対応の速さは「自社が影響を受けるか」を判定する速さで決まる。

Log4Shellが露呈した棚卸しコスト

2021年のLog4Shellは、Apache Log4jという広く使われたロギングライブラリの脆弱性だった。深刻だったのは脆弱性そのものより、「どの製品にLog4jが、どのバージョンで入っているか」を誰も即答できなかった点だ。

多くの組織が手作業のソース調査に数週間を費やした。SBOMが整備されていれば、log4j-coreを含むコンポーネントをクエリ一発で抽出し、対応の優先順位を即座に決められたはずだ。

npmワームが示す「速度」の脅威

依存汚染型の攻撃は年々高速化している。本サイトで追ってきたMini Shai-Hulud系ワームは、正規パッケージのバージョンにマルウェアを混入させ、自己増殖的に拡散する手口だ。

@antv npmに不正コード混入|Mini Shai-HuludがAnt Design可視化323パッケージを22分で汚染 では、汚染がわずか22分で300超のパッケージに波及した
TanStack公式@tanstack/*にマルウェア混入|205パッケージに広がるMini Shai-Huludワーム では公式パッケージ群が標的になった
Shai-Hulud派生「Hades」がMCP開発者を標的に|PyPI汚染とIronWorm併発の供給網ワーム総まとめ ではAI開発ツールの認証情報まで狙われた

これらの攻撃に共通するのは、公表から自社の点検完了までの時間が被害を左右する点だ。SBOMがあれば、汚染が確認されたパッケージ名とバージョンを照合し、影響範囲を数秒で割り出せる。リストがなければ、その場で全リポジトリの棚卸しを始めることになる。

SBOMは攻撃を防ぐ盾ではなく、攻撃が起きた後に「どこを見ればよいか」を即答する地図だ。インシデント対応の初動を、推測から確定情報に変える。

規制がSBOMを義務化へ押し上げている

SBOMはベストプラクティスから法的要件へと移行しつつある。米国では2021年の大統領令14028が、連邦政府に納入するソフトウェアへのSBOM提出を求めた。前述のNTIA最小要素は、この大統領令を実装するための基準として生まれている。

EUのサイバーレジリエンス法(CRA)はさらに踏み込み、デジタル要素を持つ製品にSBOMの作成・維持を義務付ける。主要な義務は2027年12月から本格適用される見込みで、EU市場に製品を出す事業者は対応を迫られる。

・米国:大統領令14028で連邦調達ソフトにSBOM必須化、NTIA最小要素が事実上の基準
・EU:CRAで対象製品にSBOMを義務付け、2027年12月から本格適用
・日本:経産省・IPAがソフトウェア管理手法としてSBOM導入の手引きを公開し、普及を後押し

規制対応として捉えると「面倒な書類仕事」に見えるが、本質は同じだ。何を使っているか分からなければ、守ることも証明することもできない。規制はその当たり前を制度化したにすぎない。

SPDX vs CycloneDX——2大SBOMフォーマットの違いと選び方

SBOMの標準フォーマットは事実上、SPDXとCycloneDXの2つに収束している。どちらも機械可読で、主要な生成ツールは両方を出力できる。違いは「設計思想」にある。

SPDXはLinux Foundationがホストするオープン標準で、ISO/IEC 5962:2021として国際標準化されている。最新のSPDX 3.0.0は2024年4月にリリースされ、Security・Build・Dataset・AIといったプロファイルが追加された。ライセンスや来歴(provenance)の網羅性に強みがある。

CycloneDXはOWASP FoundationとEcma Internationalが共同で維持し、技術委員会TC54のもとでECMA-424として2025年12月に標準化された。仕様バージョンは1.7(2025年10月)。SBOMだけでなくSaaSBOM・HBOM(ハードウェア)・ML-BOM・CBOM(暗号資産)・VEXなど、セキュリティ運用向けの拡張が豊富だ。

観点 SPDX CycloneDX
主管 Linux Foundation OWASP + Ecma International
標準 ISO/IEC 5962:2021 ECMA-424(2025-12)
最新版 3.0.0(2024-04) 1.7(2025-10)
フォーマット JSON / YAML / RDF / tag-value JSON / XML / Protobuf
設計の重心 ライセンス・来歴の網羅 脆弱性・セキュリティ運用
拡張 Security/Build/Dataset/AIプロファイル SaaSBOM/HBOM/ML-BOM/CBOM/VEX
向く用途 コンプライアンス・OSSライセンス管理 脆弱性管理・CI連携・VEX運用

選び方の指針はシンプルだ。OSSライセンス監査や規制対応で網羅性を求めるならSPDX、脆弱性スキャンやVEX(影響評価)とつなぐセキュリティ運用ならCycloneDXが扱いやすい。

迷う場合は両方生成しておけばよい。後述するSyftやTrivyは、1回のスキャンで両形式を同時に出力できる。フォーマット選定でプロジェクトを止める必要はない。

VEXで「影響なし」を伝える

SBOMがあっても、含まれるパッケージに脆弱性が見つかるたびに大量のアラートが出る。だが、その脆弱性が実際に悪用可能とは限らない。呼び出されない関数の脆弱性や、攻撃経路が塞がれているケースは多い。

ここで使うのがVEX(Vulnerability Exploitability eXchange)だ。VEXは「このCVEは自社製品では悪用不可」といった影響評価を機械可読で配布する仕組みで、CycloneDXはこのVEXをネイティブに表現できる。SBOMが「何が入っているか」を示すのに対し、VEXは「そのうちどれが本当に危ないか」を示す。両者を組み合わせると、利用側は無意味なアラート対応に時間を奪われずに済む。

SBOM生成ツール——Syft・Trivy・cargo-sbomの使い方

SBOMは手書きするものではなく、ツールがソースやコンテナをスキャンして自動生成する。ここでは定番の3ツールを、実際のコマンド付きで紹介する。

Syft——コンテナ・ファイルシステムの定番

Anchoreが開発するSyftは、コンテナイメージやファイルシステムからSBOMを生成するCLIだ。Alpine・Debian・RPMといったOSパッケージから、Go・Python・Java・JavaScript・Ruby・Rust・PHP・.NETなど数十のエコシステムに対応する。

# コンテナイメージの中身を一覧表示
syft alpine:latest

# プロジェクトディレクトリをスキャン
syft ./my-project

# CycloneDX JSON形式で標準出力へ
syft <image> -o cyclonedx-json

# SPDXとCycloneDXを同時にファイル出力
syft <image> -o spdx-json=./spdx.json -o cyclonedx-json=./cdx.json

-oフラグでフォーマットを指定し、=パスを付ければファイルに保存できる。Syftは脆弱性スキャナのGrypeと組み合わせると、生成したSBOMをそのまま脆弱性照合に回せる。

Trivy——脆弱性スキャンとSBOMを一体運用

Aqua SecurityのTrivyは脆弱性スキャナとして広く使われるが、SBOM生成も担う。スキャンとSBOMを同じツールで完結できるのが強みだ。

# CycloneDX形式でSBOM生成
trivy image --format cyclonedx --output result.json alpine:3.15

# SPDX-JSON形式で生成
trivy image --format spdx-json --output result.json alpine:3.15

# 脆弱性情報も含めたCycloneDXを生成
trivy image --scanners vuln --format cyclonedx --output result.json alpine:3.15

# 既存のSBOMファイルを入力に脆弱性スキャン
trivy sbom ./sbom.spdx

CycloneDX出力はデフォルトでは脆弱性を含まないため、--scanners vulnを明示する。trivy sbomは生成済みSBOMを入力として受け取り、新たな脆弱性が公表されたときの再評価に使える。

cargo-sbom——Rustプロジェクト向け

Rustエコシステムではcargo-sbomcargo-cyclonedxが定番だ。cargo-sbomはSPDXとCycloneDXの両方を、cargo-cyclonedxはCargo.lockcargo metadataからCycloneDXを出力する。

# cargo-sbom のインストールと実行
cargo install cargo-sbom
cargo sbom --output-format=cyclone_dx_json_1_6

# cargo-cyclonedx で JSON 出力
cargo install cargo-cyclonedx
cargo cyclonedx --format json --output sbom.json

cargo-cyclonedxはCargo.lockだけに依存するツールでは扱えないフィーチャーフラグの組み合わせやクロスコンパイル対象も反映できる。下表に3ツールの特徴を整理する。

ツール 主な対象 出力形式 開発元
Syft コンテナ・ファイルシステム SPDX / CycloneDX / Syft-JSON Anchore
Trivy コンテナ・FS・既存SBOM SPDX / CycloneDX Aqua Security
cargo-sbom Rust(Cargo) SPDX / CycloneDX OSS(crates.io)

GitHub ActionsとSigstoreでSBOM生成・署名・検証を自動化する

SBOMは一度作って満足するものではない。依存は更新のたびに変わるため、ビルドのたびに自動生成し、署名して成果物に残し、配布側で検証する——この一連をCI/CDで自動化して初めて運用が回る。まずはGitHub Actionsでの生成から見ていく。

GitHub ActionsでSBOM生成を自動化する

下記はAnchore公式のsbom-actionを使い、ビルドしたイメージからSBOMを生成してアーティファクトに残すワークフローの例だ。

name: generate-sbom
on:
  push:
    tags: ["v*"]

jobs:
  sbom:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write   # keyless署名のOIDCに必要
    steps:
      - uses: actions/checkout@v4

      - name: Build image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Generate SBOM (CycloneDX)
        uses: anchore/sbom-action@v0
        with:
          image: myapp:${{ github.sha }}
          format: cyclonedx-json
          output-file: sbom.cdx.json

      - name: Upload SBOM artifact
        uses: actions/upload-artifact@v4
        with:
          name: sbom
          path: sbom.cdx.json

ポイントは2つある。リリースタグのpushを契機にすること、そしてid-token: write権限を付けておくことだ。後者は次のSigstore署名でkeyless方式を使うために必要になる。

運用のコツ:SBOMはリリース成果物(GitHub Releasesやコンテナレジストリ)に添付して配布する。CI内に置きっぱなしにすると、配布先の利用者が検証できない。生成したSBOMを「製品に同梱する成果物」として扱うことが、サプライチェーン透明性の前提になる。

GitHub Actionsの権限設計やCI/CDの安全化は、サプライチェーン防御の重要な一部だ。タグのSHA固定や最小権限の徹底とあわせて運用したい。

Sigstoreでの署名連携とSBOM検証フロー

SBOM自体が改ざんされれば、安心するための文書がむしろ危険になる。そこで生成したSBOMに署名し、利用側で検証する仕組みが要る。これを担うのがSigstoreのcosignだ。

cosignはSBOMを「attestation(証明)」としてコンテナイメージに添付する。署名はDSSE仕様に従い、検証側は署名と証明書の正当性を確認できる。

# SBOMをattestationとして署名・添付(鍵あり方式)
cosign attest --predicate sbom.cdx.json --type cyclonedx \
  --key cosign.key <image>

# attestationを検証
cosign verify-attestation --key cosign.pub <image>

--predicateに署名対象のSBOMを、--typeにその種別を指定する。検証側はcosign verify-attestationで署名と証明書をチェックし、信頼できるSBOMだけを採用できる。

keyless署名でCIから鍵を排除する

鍵ファイルの管理は漏洩リスクを伴う。Sigstoreのkeyless署名は、CI環境のOIDC認証から一時証明書をFulcioが発行し、署名記録をRekor透明性ログに残す方式だ。長期保管する秘密鍵が不要になる。

# keyless署名(CI環境のOIDC IDを利用、--keyを省略)
COSIGN_EXPERIMENTAL=1 cosign attest \
  --predicate sbom.cdx.json --type cyclonedx <image>

# keyless検証(証明書のIDと発行元を指定)
cosign verify-attestation --type cyclonedx \
  --certificate-identity-regexp ".*" \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com <image>

先のGitHub Actionsでid-token: writeを付けたのは、この一時IDを取得するためだ。CI内で完結し、鍵を一切持たずに署名できる。

生成から検証までのフロー

ここまでの工程を1枚の図にまとめる。生成・署名・配布・検証が一本のパイプラインでつながることが、SBOM運用のゴールだ。

flowchart TD A[ソースコード / コンテナイメージ] --> B[SBOM生成
Syft / Trivy / cargo-sbom] B --> C{フォーマット選択} C -->|ライセンス・来歴重視| D[SPDX] C -->|脆弱性・運用重視| E[CycloneDX] D --> F[cosign attest で署名
keyless / OIDC] E --> F F --> G[Rekor 透明性ログに記録] F --> H[成果物に添付して配布
レジストリ / Releases] H --> I[利用側で cosign verify-attestation] I --> J{署名・証明書は正当か} J -->|Yes| K[SBOMを信頼して脆弱性照合] J -->|No| L[破棄・調査] K --> M[Trivy sbom で再スキャン
新規CVE公表時に再評価]

検証に通ったSBOMは、新たな脆弱性が公表されるたびにtrivy sbomで再スキャンすれば、過去にビルドした成果物の影響範囲も後追いで判定できる。SBOMは生成して保管し、署名で守り、検証して使い、CVE公表のたびに再評価する——この循環で初めて防御の道具になる。

まとめ——SBOMは「作る」より「運用する」

SBOMの価値は、文書を1枚作ることではなく、依存の全量を機械可読で持ち続け、インシデント時に即座にクエリできる体制にある。Log4Shellやnpmワームが繰り返し示したのは、影響範囲を即答できるかどうかが被害を左右するという現実だ。

フォーマットはSPDXとCycloneDXの2択。迷えば両方生成
生成はSyft・Trivy・cargo-sbomをCIに組み込み、ビルドごとに自動化
署名はSigstore cosignのkeyless方式で鍵管理を排除
検証は配布側でverify-attestation、CVE公表時はtrivy sbomで再スキャン

まずは手元のコンテナにsyft <image> -o cyclonedx-jsonを一度走らせ、自分が何を使っているのかを可視化するところから始めたい。攻撃の地図を持つ第一歩になる。

参照ソース

NTIA — The Minimum Elements For a Software Bill of Materials (SBOM), 2021
CISA — 2025 Minimum Elements for a Software Bill of Materials (PDF)
SPDX — Overview(Linux Foundation / ISO/IEC 5962:2021)
CycloneDX — Specification Overview(OWASP / Ecma ECMA-424)
Anchore Syft — GitHub リポジトリ
Aqua Trivy — SBOM ドキュメント
Sigstore cosign — Attestation ドキュメント