目次
SBOM とは
SBOM(Software Bill of Materials)とは、ソフトウェアコンポーネントやそれらの依存関係、ライセンスデータなどの情報を持つ「ソフトウェアの部品表」です。
食品のパッケージを見ると、原材料表示が書かれていますが、それをイメージしていただくと良いかと思います。
なぜ SBOM が必要なのか
オープンソースソフトウェア(OSS)の利用が一般化する中で、製品においてどのようなソフトウェアが含まれているのかを把握することが困難になっています。
2021 年にロギングライブラリで脆弱性が報告されましたがとても広く利用されており、自ら組み込んでいなくても実は OSS に組み込まれていました、といったことも考えられます。
ソフトウェアの構成を SBOM で管理することで、どこでどのようなソフトウェアが使われているかを把握でき、万が一脆弱性が発覚した場合でも、対応を取りやすくなります。
SBOM のメリット
SBOM の導入における一番のメリットは脆弱性管理のメリットです。
- 脆弱性残留リスクの低減
脆弱性に関する情報を収集し、SBOM の情報と突合して脆弱性を検出することで、ソフトウェアにおいて脆弱性が残留するリスクを低減することができます。
食品を例にすると、
1. あるケーキに健康上のリスクが発覚しました
2. 原因は牛乳です
3. 牛乳を別のものに変えて対応しました
しかし、バターにも原因の牛乳が使用されているため、リスクは解消されていませんといったことが起こりえます。
SBOM でどのように構成されているかを管理することで脆弱性に対応することができます。
- 脆弱性対応期間の短縮
SBOM ツール等を用いることにより新たな脆弱性をリアルタイムで検出して、迅速に初動対応を行うことができます。
SBOM で管理することで、問題の牛乳がどこに使われているが即座に把握でき、対応することができます。
- 脆弱性管理にかかるコストの低減
SBOM を使わなくても、どこに牛乳が使われているかを把握していれば対応は可能です。
しかし、色々な材料を使ったケーキの場合や、何種類ものケーキを作っている場合、全てを把握することは難しいのではないでしょうか。
SBOM ツールを用いた自動管理により、手動での管理と比較して、管理コストを低減することができます。
SBOM ツールを動かしてみる
mac で SBOM を生成してみます。
SBOM ツールには「Trivy」を使います。
homebrew でインストールできます。
$ brew install trivy
スキャン用のテストのリポジトリが用意されているので git clone しましょう。
$ git clone git@github.com:aquasecurity/trivy-test.git
スキャンを実行してみます。
今回は単一のファイルを指定しましたがディレクトリも指定できます。
$ trivy fs trivy-test/integration/testdata/fixtures/repo/trivy-ci-test/Pipfile.lock
2025-01-20T16:32:16+09:00 INFO [vuln] Vulnerability scanning is enabled
2025-01-20T16:32:16+09:00 INFO [secret] Secret scanning is enabled
2025-01-20T16:32:16+09:00 INFO [secret] If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2025-01-20T16:32:16+09:00 INFO [secret] Please see also https://aquasecurity.github.io/trivy/v0.58/docs/scanner/secret#recommendation for faster secret detection
2025-01-20T16:32:16+09:00 INFO Number of language-specific files num=1
2025-01-20T16:32:16+09:00 INFO [pipenv] Detecting vulnerabilities...
Pipfile.lock (pipenv)
Total: 50 (UNKNOWN: 0, LOW: 2, MEDIUM: 24, HIGH: 19, CRITICAL: 5)
┌─────────────────────┬─────────────────────┬──────────┬──────────┬───────────────────┬────────────────────────┬──────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │
├─────────────────────┼─────────────────────┼──────────┼──────────┼───────────────────┼────────────────────────┼──────────────────────────────────────────────────────────────┤
│ babel │ CVE-2021-42771 │ HIGH │ fixed │ 2.6.0 │ 2.9.1 │ python-babel: Relative path traversal allows attacker to │
│ │ │ │ │ │ │ load arbitrary locale files and... │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-42771 │
├─────────────────────┼─────────────────────┤ │ ├───────────────────┼────────────────────────┼──────────────────────────────────────────────────────────────┤
│ celery │ CVE-2021-23727 │ │ │ 4.3.0 │ 5.2.2 │ celery: stored command injection vulnerability may allow │
│ │ │ │ │ │ │ privileges escalation │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-23727 │
├─────────────────────┼─────────────────────┤ │ ├───────────────────┼────────────────────────┼──────────────────────────────────────────────────────────────┤
│ certifi │ CVE-2023-37920 │ │ │ 2019.3.9 │ 2023.7.22 │ python-certifi: Removal of e-Tugra root certificate │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-37920 │
│ ├─────────────────────┼──────────┤ │ ├────────────────────────┼──────────────────────────────────────────────────────────────┤
│ │ CVE-2022-23491 │ MEDIUM │ │ │ 2022.12.07 │ python-certifi: untrusted root certificates │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-23491 │
├─────────────────────┼─────────────────────┼──────────┤ ├───────────────────┼────────────────────────┼──────────────────────────────────────────────────────────────┤
│ django │ CVE-2019-19844 │ CRITICAL │ │ 2.0.9 │ 1.11.27, 2.2.9, 3.0.1 │ Django: crafted email address allows account takeover │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-19844 │
│ ├─────────────────────┤ │ │ ├────────────────────────┼──────────────────────────────────────────────────────────────┤
│ │ CVE-2020-7471 │ │ │ │ 1.11.28, 2.2.10, 3.0.3 │ django: potential SQL injection via StringAgg(delimiter) │
│ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2020-7471 │
長いので省略します。
デフォルトでは脆弱性とシークレットを検出しますが、ライセンスや、Terraform などの IaC のファイルの誤った設定も検出してくれます。
ドキュメントを拝見すると色々な設定が可能です。
SBOM のフォーマットで出力先ファイルを指定して実行します。
$ trivy fs trivy-test/integration/testdata/fixtures/repo/trivy-ci-test/Pipfile.lock --format cyclonedx --output ./output.json
これが SBOM です。
{
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"serialNumber": "urn:uuid:8a37c649-32cd-412a-8d38-660e94154183",
"version": 1,
"metadata": {
"timestamp": "2025-01-20T07:45:45+00:00",
"tools": {
"components": [
{
"type": "application",
"group": "aquasecurity",
"name": "trivy",
"version": "0.58.2"
}
]
},
"component": {
"bom-ref": "4d3bdf97-e544-4553-ab7e-0d923fb2011e",
"type": "application",
"name": "trivy-test/integration/testdata/fixtures/repo/trivy-ci-test/Pipfile.lock",
"properties": [
{
"name": "aquasecurity:trivy:SchemaVersion",
"value": "2"
}
]
}
},
"components": [
{
"bom-ref": "7a08d21a-e095-4cab-a268-5efe0bacdb4b",
"type": "application",
"name": "Pipfile.lock",
"properties": [
{
"name": "aquasecurity:trivy:Class",
"value": "lang-pkgs"
},
{
"name": "aquasecurity:trivy:Type",
"value": "pipenv"
}
]
},
長いので省略します。
これを自動で生成することで、常に最新の SBOM を作成して構成を把握することが可能になります。
クラウドサーバーを監視する構成を考える
Trivy を使ってクラウドサーバーをスキャンする構成を考えてみます。
基本的な構成としては
- ディレクトリを監視します
- 変更を検知したら Trivy を動かします
- Trivy で対象をスキャンします
- SBOM を生成します

しかし、監視したいサーバー全てに Trivy を入れて動かすということは難しいです。
なので Trivy を動かすサーバーと監視するサーバーを分けます。
- 監視対象のサーバーの監視したいディレクトリを Trivy を動かすサーバーにマウントします
- 監視対象のサーバーでディレクトリを監視します
- 変更を検知したら Trivy を動かすサーバーに通知します
- Trivy で対象をスキャンする。この時のスキャン先はマウントしたディレクトリです
- SBOM を生成します

こうすることで対象のサーバーではスキャンを実行せずに SBOM を生成することができます。
SBOM ツールには有償/無償問わず、さまざまなツールがあります。
価格、導入や運用コスト、対応フォーマット、解析可能な情報…など、選定におけるポイントは多く、ご自身の環境に合ったツールを選択しましょう。
まとめ
SBOM に注目が集まって、世界的に普及が進みつつあります。
ゆくゆくはソフトウェア開発における必須要素になるかもしれません。
導入のハードルは高いかもしれませんが、セキュリティ強化のためにも SBOM を取り入れてみましょう。

