SBOM – Software Bill of Materials
„Was ist eigentlich in dieser Software drin?" – Die Frage, die nach Log4Shell jeder stellen musste.
Sinn & Zweck
Ein SBOM ist das Zutatenliste deiner Software. Genau wie ein Lebensmittelhersteller auflisten muss, was in seinen Produkten steckt, listet ein SBOM alle Komponenten einer Software auf:
- Welche Libraries werden genutzt?
- In welchen Versionen?
- Unter welchen Lizenzen?
- Mit welchen bekannten Vulnerabilities?
Nach Log4Shell im Dezember 2021 wurde schmerzhaft klar: Die meisten Unternehmen wissen nicht, wo überall Log4j steckt. Ein SBOM hätte die Antwort in Minuten statt Wochen geliefert.
Warum SBOM jetzt wichtig ist
Regulatorischer Druck
USA:
- Executive Order 14028 (Mai 2021): SBOM-Pflicht für Software, die an US-Behörden verkauft wird
- CISA/NTIA Guidelines
EU:
- Cyber Resilience Act: SBOM-Anforderungen für CE-Kennzeichnung
- NIS2-Richtlinie: Supply-Chain-Security
Industrie:
- Automotive: ISO/SAE 21434
- Medical Devices: FDA Guidance
- Finance: Zunehmende Anforderungen
Business-Treiber
Kunde: "Sind Sie von Log4Shell betroffen?"
Ohne SBOM:
Developer: "Äh... ich muss nachschauen...
dauert ein paar Tage... oder Wochen..."
Mit SBOM:
Developer: *query* "Nein, wir nutzen Log4j nicht." (5 Sekunden)
SBOM-Formate
CycloneDX
OWASP-Standard. Fokus auf Security.
{
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
"version": 1,
"metadata": {
"timestamp": "2024-01-15T10:00:00Z",
"tools": [{ "name": "syft", "version": "0.100.0" }],
"component": {
"type": "application",
"name": "my-app",
"version": "1.0.0"
}
},
"components": [
{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21",
"licenses": [{ "license": { "id": "MIT" } }],
"hashes": [
{ "alg": "SHA-256", "content": "abc123..." }
]
}
],
"vulnerabilities": [
{
"id": "CVE-2021-23337",
"source": { "name": "NVD" },
"ratings": [{ "score": 7.2, "severity": "high" }],
"affects": [
{ "ref": "pkg:npm/lodash@4.17.21" }
]
}
]
}
SPDX
Linux Foundation Standard. Fokus auf Lizenzen.
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "my-app-sbom",
"documentNamespace": "https://example.com/my-app-1.0.0",
"creationInfo": {
"created": "2024-01-15T10:00:00Z",
"creators": ["Tool: syft-0.100.0"]
},
"packages": [
{
"SPDXID": "SPDXRef-Package-npm-lodash",
"name": "lodash",
"versionInfo": "4.17.21",
"downloadLocation": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"licenseConcluded": "MIT",
"externalRefs": [
{
"referenceCategory": "PACKAGE-MANAGER",
"referenceType": "purl",
"referenceLocator": "pkg:npm/lodash@4.17.21"
}
]
}
],
"relationships": [
{
"spdxElementId": "SPDXRef-DOCUMENT",
"relatedSpdxElement": "SPDXRef-Package-npm-lodash",
"relationshipType": "DESCRIBES"
}
]
}
SWID Tags
ISO/IEC 19770-2. Älterer Standard, weniger verbreitet.
Format-Vergleich
| Aspekt | CycloneDX | SPDX | SWID |
|---|---|---|---|
| Fokus | Security | Lizenz | Asset Management |
| Vulnerabilities | Native | Via Extension | Nein |
| Adoption | Steigend | Etabliert | Gering |
| Tooling | Gut | Gut | Begrenzt |
| JSON/XML | Beide | Beide | XML |
SBOM-Generierung
Tools
| Tool | Typ | Unterstützt | Besonderheit |
|---|---|---|---|
| Syft | CLI/Library | Container, Filesystems | Sehr umfassend |
| Trivy | Scanner | Container, IaC, SBOM | Vuln-Scanning integriert |
| CycloneDX Tools | Ecosystem | Sprach-spezifisch | Official CycloneDX |
| SPDX Tools | Ecosystem | Sprach-spezifisch | Official SPDX |
| Snyk | Commercial | Alles | Integration mit Fix-Vorschlägen |
| FOSSA | Commercial | Fokus Compliance | License-Management |
Syft (Anchore)
# Installation
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh
# SBOM für Container-Image
syft alpine:latest -o cyclonedx-json > sbom.json
# SBOM für Verzeichnis
syft dir:./my-project -o spdx-json > sbom.json
# SBOM für spezifisches Manifest
syft file:./package-lock.json -o cyclonedx-json
# Verschiedene Formate
syft alpine:latest -o spdx-tag-value # SPDX Tag-Value
syft alpine:latest -o spdx-json # SPDX JSON
syft alpine:latest -o cyclonedx-json # CycloneDX JSON
syft alpine:latest -o cyclonedx-xml # CycloneDX XML
syft alpine:latest -o json # Syft JSON
syft alpine:latest -o table # Human-readable
Sprach-spezifische Tools
Node.js:
# CycloneDX
npx @cyclonedx/cyclonedx-npm --output-file sbom.json
# Mit npm audit info
npm sbom --sbom-format cyclonedx
Python:
# CycloneDX
cyclonedx-py -r requirements.txt -o sbom.json
# Mit Poetry
cyclonedx-py poetry -o sbom.json
Java/Maven:
<!-- pom.xml -->
<plugin>
<groupId>org.cyclonedx</groupId>
<artifactId>cyclonedx-maven-plugin</artifactId>
<version>2.7.9</version>
<executions>
<execution>
<goals>
<goal>makeBom</goal>
</goals>
</execution>
</executions>
</plugin>
mvn cyclonedx:makeBom
Go:
# CycloneDX
cyclonedx-gomod mod -json > sbom.json
# Mit Syft
syft dir:. -o cyclonedx-json
SBOM in CI/CD
GitHub Actions
name: Generate SBOM
on: [push]
jobs:
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
path: .
format: cyclonedx-json
output-file: sbom.json
- name: Upload SBOM
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom.json
- name: Scan for vulnerabilities
uses: anchore/scan-action@v3
with:
sbom: sbom.json
fail-build: true
severity-cutoff: high
GitLab CI
generate-sbom:
image: anchore/syft:latest
script:
- syft dir:. -o cyclonedx-json > sbom.json
artifacts:
paths:
- sbom.json
reports:
cyclonedx: sbom.json # Native GitLab Integration
Container Build
# Multi-stage mit SBOM
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
FROM node:18-slim
COPY --from=builder /app/node_modules /app/node_modules
COPY . /app
WORKDIR /app
# SBOM als Label (Docker BuildKit)
# docker build --sbom=true -t myapp .
SBOM-Analyse & Nutzung
Vulnerability Scanning
# Grype (Anchore) mit SBOM
grype sbom:./sbom.json
# Trivy mit SBOM
trivy sbom sbom.json
# Output:
# NAME INSTALLED VULNERABILITY SEVERITY
# lodash 4.17.20 CVE-2021-23337 HIGH
# minimist 1.2.5 CVE-2021-44906 CRITICAL
License Compliance
# Lizenz-Report aus SBOM
# Finde alle GPL-Komponenten
jq '.components_old[] | select(.licenses[].license.id | test("GPL"))' sbom.json
# Lizenz-Übersicht
jq '.components_old[].licenses[].license.id' sbom.json | sort | uniq -c
Dependency Graph
my-app@1.0.0
├── express@4.18.2
│ ├── accepts@1.3.8
│ │ ├── mime-types@2.1.35
│ │ └── negotiator@0.6.3
│ ├── body-parser@1.20.1
│ │ ├── bytes@3.1.2
│ │ └── content-type@1.0.5
│ └── ...
└── lodash@4.17.21 (VULNERABLE!)
SBOM-Datenbank
# SBOM in Datenbank speichern für Suche
# "Welche Produkte nutzen Log4j 2.14.1?"
# Schema (vereinfacht)
CREATE TABLE products (
id UUID PRIMARY KEY,
name VARCHAR,
version VARCHAR,
sbom_generated_at TIMESTAMP
);
CREATE TABLE components (
id UUID PRIMARY KEY,
product_id UUID REFERENCES products(id),
name VARCHAR,
version VARCHAR,
purl VARCHAR,
license VARCHAR
);
-- Query: Alle Produkte mit Log4j
SELECT p.name, p.version, c.version
FROM products p
JOIN components c ON p.id = c.product_id
WHERE c.name LIKE '%log4j%' AND c.version < '2.17.0';
SBOM-Sharing
Wo speichern?
| Option | Beschreibung | Zugriff |
|---|---|---|
| Im Produkt | Als Datei mitgeliefert | Einfach |
| Registry | OCI Registry, npm, etc. | Automatisiert |
| SBOM Repository | Zentrale Datenbank | Enterprise |
| Dependency-Track | OWASP Tool | Umfassend |
OCI Registry
# SBOM als OCI Artifact
oras push myregistry.com/myapp:v1.0.0-sbom \
--artifact-type application/vnd.cyclonedx+json \
sbom.json:application/vnd.cyclonedx+json
Dependency-Track (OWASP)
# SBOM hochladen
curl -X POST https://dependency-track.example.com/api/v1/bom \
-H "Content-Type: application/vnd.cyclonedx+json" \
-H "X-Api-Key: $API_KEY" \
-d @sbom.json
Risiken & Grenzen
Unvollständigkeit
SBOM zeigt: lodash@4.17.21
Reality: Build-Prozess patcht lodash mit Custom-Fixes
SBOM zeigt: 47 Dependencies
Reality: 3 davon werden gar nicht genutzt (dead code)
Aktualität
Ein SBOM ist ein Snapshot. Morgen können neue CVEs entdeckt werden.
Qualität variiert
Gutes SBOM:
- Vollständige Dependency-Tree
- Korrekte Versionen
- Hashes für Integrität
- Lizenz-Informationen
Schlechtes SBOM:
- Nur Top-Level Dependencies
- Keine Versionen
- Keine Hashes
- "License: Unknown"
Tooling-Inkonsistenz
Verschiedene Tools generieren unterschiedliche SBOMs für dasselbe Projekt.
False Sense of Security
"Wir haben ein SBOM!" bedeutet nicht automatisch Sicherheit.
Vorteile
Transparenz
Du weißt endlich, was in deiner Software steckt. Alle 1.247 Dependencies.
Schnelle Incident Response
Breaking News: Kritische Vulnerability in XYZ Library!
Mit SBOM:
$ grep -l "XYZ" */sbom.json
product-a/sbom.json
product-c/sbom.json
# 2 Produkte betroffen, Rest ist safe
# Zeit: 30 Sekunden
Compliance
- Open-Source-Lizenz-Compliance
- Export-Kontrollen
- Regulatorische Anforderungen
Supply Chain Visibility
Verstehe deine Abhängigkeiten:
- Wer maintained sie?
- Wie alt sind sie?
- Welche Risiken bestehen?
Kunden-Vertrauen
Kunden fragen zunehmend nach SBOMs als Teil der Due Diligence.
Best Practices
1. Automatische Generierung
# Bei jedem Release automatisch SBOM erstellen
on:
release:
types: [published]
jobs:
sbom:
steps:
- uses: anchore/sbom-action@v0
2. Signieren
# SBOM mit Cosign signieren
cosign sign-blob --key cosign.key sbom.json > sbom.json.sig
3. Versionieren
sbom-myapp-v1.0.0-20240115.json
sbom-myapp-v1.0.1-20240120.json
4. Zentral speichern
Alle SBOMs an einem Ort für schnelle Suche.
5. Kontinuierlich scannen
SBOMs regelmäßig gegen aktuelle CVE-Datenbanken prüfen.
6. Mit Kunden teilen
SBOM als Teil der Dokumentation oder auf Anfrage.
SBOM Maturity Model
| Level | Beschreibung |
|---|---|
| 0 | Keine SBOMs |
| 1 | Manuelle SBOM-Erstellung bei Bedarf |
| 2 | Automatische SBOM-Generierung in CI/CD |
| 3 | Zentrales SBOM-Repository mit Vuln-Scanning |
| 4 | Kontinuierliches Monitoring, automatische Alerts |
| 5 | SBOM-Integration in Procurement, Customer-Facing |
Fazit
SBOM ist die Antwort auf die Frage: "Was ist in meiner Software?" Nach Log4Shell ist klar, dass diese Antwort in Minuten verfügbar sein muss, nicht in Wochen.
Die Regulierung kommt. Die Tools sind da. Die Frage ist nur: Bist du bereit?
Eine Software ohne SBOM ist wie ein Lebensmittel ohne Zutatenliste: Du weißt nicht, was drin ist, bis du allergisch reagierst.
Weiterführende Ressourcen: