Software-Stückliste – was ist das?
Überblick über Software-Stücklisten
Der Begriff Stückliste kommt aus der Betriebswirtschaftslehre und entspricht einer Zusammenstellung der Bestandteile eines Produktes. Wir alle kennen Stücklisten aus unserer Kindheit. Hat man zu Weihnachten oder zum Geburtstag Lego oder Fischer-Technik geschenkt bekommen, dann galt es zuerst anhand der „Stückliste“ zu kontrollieren, ob alle Teile im Karton vorhanden sind.
Insofern ist der Begriff Software-Stückliste nicht exakt mit der Stückliste zu vergleichen. Denn die Software-Stückliste, englisch Software Bill of Materials (SBOM), listet nicht auf, wie häufig eine bestimmte Bibliothek in einem Software-Produkt enthalten ist. Die Software-Stückliste entspricht einfach der Auflistung aller im Software-Produkt verwendeter Bibliotheken und Komponenten. Dabei ist die Auflistung der Elemente dieser Stückliste nicht beliebig, sondern genau definiert. Das BSI definiert die Software-Stückliste so: „SBOM ist ein maschinenverarbeitbares Dokument und entspricht einer elektronischen Stück- / Teileliste. Sie inventarisiert eine Codebasis und enthält somit Informationen zu allen verwendeten Komponenten einer Software.“ [1]
Warum sollte Sie das Thema ‚Software-Stückliste‘ interessieren?
Als Manager oder Geschäftsführer, allgemein als Verantwortlicher für die Verwaltung und/oder den Einkauf von Software im Geschäftsumfeld, sind Sie vermutlich nicht oder nur gering daran interessiert, aus welchen Komponenten die von Ihnen eingesetzte Software besteht. Hauptsache, das Programm funktioniert und Ihr Team kann damit arbeiten. Das ist ok, solange alles im grünen Bereich ist. Leider ist nicht immer alles ok. Beispiele dafür sind Fehler oder Schwachstellen. Und diese Probleme müssen noch nicht mal direkt in Ihrer Software auftreten! Selbst bei scheinbar kleinen Anwendungen (z. B. eine App auf dem Smartphone) sind unter Umständen sehr viele Bibliotheken von Drittanbietern eingebunden. Kommt es dann in einer der verwendeten Bibliotheken zu einem Problem, kann Ihre ganze Anwendung betroffen sein. In so einem Fall ist es wichtig zu wissen, welche Bibliothek betroffen ist. Aber es ist noch viel wichtiger zu wissen, ob Ihre Anwendung diese Bibliothek verwendet. Genau für diesen Fall gibt es die Software-Stückliste. Sie würden dann, sobald Sie auf ein Software-Problem aufmerksam werden, in der Software-Stückliste Ihrer Anwendung nachschauen, ob Ihre Anwendung die besagte Bibliothek mit dem Problem verwendet. Eine Software-Stückliste enthält dafür alle benötigten Angaben, siehe Details der Software-Stückliste. Falls der Abgleich von Bibliotheksname und -Version zu keinem Treffer führt, sind Sie mit Ihrer Anwendung auf der sicheren Seite. Ist Ihre Anwendung von dem Software-Problem betroffen, so können Sie entsprechend reagieren (z. B. Anwendung aktualisieren oder Anwendung vorübergehend deaktivieren).
Als Nutzer einer Anwendung (‚Consumer/User‘) haben Sie ab 11. Dezember 2027 das Recht, eine Software-Stückliste für die von Ihnen benutzte Anwendung zu erhalten. Dies gilt, laut Technischer Richtlinie TR-03183 [1], „…für alle Produkte mit digitalen Elementen…“ (‚…apply to all products with digital elements placed on the market…‘). Die Technische Richtlinie bezieht sich dabei immer auf den „Bewertungsgegenstand“ (‚Target of Evaluation (TOE)‘). Im Speziellen werden dort folgende Anforderungen genannt:
- REQ_VH 1.1: „Der Hersteller MUSS alle Softwarekomponenten der TOE in einer Software-Stückliste (SBOM) gemäß BSI TR-03183-2 dokumentieren.” (‚The manufacturer MUST document all software components of the TOE in a Software Bill of Materials (SBOM) according to BSI TR-03183-2.‘).
- REQ_TD 6.1: „Die technische Dokumentation MUSS die gemäß Abschnitt 5.4.1 erstellte SBOM enthalten.“ (‚The technical documentation MUST contain the SBOM created according to section 5.4.1.‘)
Aber warum sollte Sie das Thema interessieren? – Als verantwortungsvoller Nutzer von Anwendungen sollten Sie die aus der Technischen Richtlinie TR-03183 entstehenden Elemente, neben der Software-Stückliste sind dies z. B. auch Risikobewertungen und Informationspflichten, kennen und nutzen! So empfiehlt die Richtlinie (Herstellern) z. B. Software-Stücklisten zu verwenden, um Anwendungen und deren Komponenten mit Schwachstellendatenbanken abzugleichen, z. B. der Common/European/National Vulnerability Database [2] (CVD/EUVD/NVD). Außerdem sollten Sie auch bei Individualsoftware auf die Einhaltung der Richtlinie bestehen und deren resultierende Elemente entsprechend einfordern.
Exemplarischer Aufbau einer Software-Stückliste
Die Technische Richtlinie TR-03183 kennt zwei Formate:
- CycloneDX (CDX), Version 1.5 oder höher und
- Software Package Data eXchange (SPDX), Version 2.2.1 oder höher
Beide Formate können sowohl im JSON-, als auch im XML-Format vorliegen. Beide Formate haben Vor- und Nachteile, auf die ich hier nicht weiter eingehen möchte. Beim Schwachstellen-Abgleich scheint das CDX-Format die Nase vorn zu haben, weshalb ich dieses Format hier vorstelle:
{
"$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"version": 1,
"metadata": {
"tools": {
"components": [
{
"type": "application",
"name": "npm",
"version": "11.4.1"
},
{
"type": "library",
"name": "cyclonedx-library",
"group": "@cyclonedx",
"version": "8.4.0",
"author": "Jan Kowalleck",
"description": "Core functionality of CycloneDX for JavaScript (Node.js or WebBrowser).",
"licenses": [
{
"license": {
"id": "Apache-2.0"
}
}
],
"externalReferences": [
{
"url": "https://github.com/CycloneDX/cyclonedx-javascript-library/issues",
"type": "issue-tracker",
"comment": "as detected from PackageJson property \"bugs.url\""
},
{
"url": "git+https://github.com/CycloneDX/cyclonedx-javascript-library.git",
"type": "vcs",
"comment": "as detected from PackageJson property \"repository.url\""
},
{
"url": "https://github.com/CycloneDX/cyclonedx-javascript-library#readme",
"type": "website",
"comment": "as detected from PackageJson property \"homepage\""
}
]
},
{
"type": "application",
"name": "cyclonedx-npm",
"group": "@cyclonedx",
"version": "3.1.0",
"author": "Jan Kowalleck",
"description": "Create CycloneDX Software Bill of Materials (SBOM) from NPM projects.",
"licenses": [
{
"license": {
"id": "Apache-2.0"
}
}
],
"externalReferences": [
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
"type": "issue-tracker",
"comment": "as detected from PackageJson property \"bugs.url\""
},
{
"url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git",
"type": "vcs",
"comment": "as detected from PackageJson property \"repository.url\""
},
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
"type": "website",
"comment": "as detected from PackageJson property \"homepage\""
}
]
}
]
},
"component": {
"type": "application",
"name": "demo-local-deps",
"version": "0.0.0",
"bom-ref": "demo-local-deps@0.0.0",
"description": "demo: demo-local-deps -- showcase how local dependencies look like",
"licenses": [
{
"license": {
"id": "Apache-2.0",
"acknowledgement": "declared"
}
}
],
"purl": "pkg:npm/demo-local-deps@0.0.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2FCycloneDX%2Fcyclonedx-node-npm.git#demo/local-dependencies/project",
"externalReferences": [
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
"type": "issue-tracker",
"comment": "as detected from PackageJson property \"bugs.url\""
},
{
"url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git#demo/local-dependencies/project",
"type": "vcs",
"comment": "as detected from PackageJson property \"repository.url\" and \"repository.directory\""
},
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
"type": "website",
"comment": "as detected from PackageJson property \"homepage\""
}
],
"properties": [
{
"name": "cdx:npm:package:path",
"value": ""
},
{
"name": "cdx:npm:package:private",
"value": "true"
}
]
}
},
"components": [
{
"type": "library",
"name": "my-local-a",
"version": "0.0.0",
"bom-ref": "demo-local-deps@0.0.0|my-local-a@0.0.0",
"description": "demo: my-local-a",
"licenses": [
{
"license": {
"id": "Apache-2.0",
"acknowledgement": "declared"
}
}
],
"purl": "pkg:npm/my-local-a@0.0.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2FCycloneDX%2Fcyclonedx-node-npm.git#demo/local-deps/project/packages/my-local-a",
"externalReferences": [
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
"type": "issue-tracker",
"comment": "as detected from PackageJson property \"bugs.url\""
},
{
"url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git#demo/local-deps/project/packages/my-local-a",
"type": "vcs",
"comment": "as detected from PackageJson property \"repository.url\" and \"repository.directory\""
},
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
"type": "website",
"comment": "as detected from PackageJson property \"homepage\""
}
],
"properties": [
{
"name": "cdx:npm:package:path",
"value": "node_modules/my-local-a"
},
{
"name": "cdx:npm:package:private",
"value": "true"
}
]
},
{
"type": "library",
"name": "my-local-b-off",
"version": "0.0.0",
"bom-ref": "demo-local-deps@0.0.0|my-local-b-off@0.0.0",
"description": "demo: my-local-b-off - a package with a different name than its dir",
"licenses": [
{
"license": {
"id": "Apache-2.0",
"acknowledgement": "declared"
}
}
],
"purl": "pkg:npm/my-local-b-off@0.0.0?vcs_url=git%2Bssh%3A%2F%2Fgit%40github.com%2FCycloneDX%2Fcyclonedx-node-npm.git#demo/local-dependencies/project/packages/my-local-b",
"externalReferences": [
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
"type": "issue-tracker",
"comment": "as detected from PackageJson property \"bugs.url\""
},
{
"url": "git+ssh://git@github.com/CycloneDX/cyclonedx-node-npm.git#demo/local-dependencies/project/packages/my-local-b",
"type": "vcs",
"comment": "as detected from PackageJson property \"repository.url\" and \"repository.directory\""
},
{
"url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
"type": "website",
"comment": "as detected from PackageJson property \"homepage\""
}
],
"properties": [
{
"name": "cdx:npm:package:path",
"value": "node_modules/my-local-b-off"
},
{
"name": "cdx:npm:package:private",
"value": "true"
}
]
},
{
"type": "library",
"name": "DummyComponent./home/flow/Documents/Coding/node/cyclonedx-node-npm/demo/local-dependencies/project/node_modules/my-noname",
"bom-ref": "demo-local-deps@0.0.0|DummyComponent./home/flow/Documents/Coding/node/cyclonedx-node-npm/demo/local-dependencies/project/node_modules/my-noname",
"description": "This is a dummy component \"/home/flow/Documents/Coding/node/cyclonedx-node-npm/demo/local-dependencies/project/node_modules/my-noname\" that fills the gap where the actual built failed.",
"purl": "pkg:npm/dummycomponent.%2Fhome%2Fflow%2Fdocuments%2Fcoding%2Fnode%2Fcyclonedx-node-npm%2Fdemo%2Flocal-dependencies%2Fproject%2Fnode_modules%2Fmy-noname",
"properties": [
{
"name": "cdx:npm:package:path",
"value": "node_modules/my-noname"
}
]
}
],
"dependencies": [
{
"ref": "demo-local-deps@0.0.0",
"dependsOn": [
"demo-local-deps@0.0.0|DummyComponent./home/flow/Documents/Coding/node/cyclonedx-node-npm/demo/local-dependencies/project/node_modules/my-noname",
"demo-local-deps@0.0.0|my-local-a@0.0.0"
]
},
{
"ref": "demo-local-deps@0.0.0|DummyComponent./home/flow/Documents/Coding/node/cyclonedx-node-npm/demo/local-dependencies/project/node_modules/my-noname"
},
{
"ref": "demo-local-deps@0.0.0|my-local-a@0.0.0",
"dependsOn": [
"demo-local-deps@0.0.0|my-local-b-off@0.0.0"
]
},
{
"ref": "demo-local-deps@0.0.0|my-local-b-off@0.0.0"
}
]
}
Bei dieser Software-Stückliste handelt es sich um das Beispiel local dependencies [3] der CycloneDX Community.
Eine Software-Stückliste lässt sich auf unterschiedlichste Weise darstellen, z. B. in einem Portal:
Zusammenfassung
Komponenten
Schwachstellen
Die beiden oben gezeigten Tabellen Zusammenfassung und Komponenten beruhen auf dem Beispiel local dependencies [3] der CycloneDX Community. Die Tabelle Schwachstellen basiert auf einem anderen Beispiel [4] der CycloneDX Community. Zur Visualisierung wurde das Tool Sunshine [5] verwendet.
Wie wäre der optimale Umgang mit Software-Stücklisten im Betrieb?
In einer idealen Welt beziehen Sie ab Ende 2027 jegliche Software-Produkte, die Sie erwerben, inklusive maschinenverarbeitbarer Software-Stückliste. Sicherlich gibt es schon einen Einkaufs- oder Inventarisierungsprozess. Dieser Prozess muss um die Inventarisierung der Software-Stücklisten erweitert werden. Im schlechtesten Fall speichern Sie sich diese Informationen als JSON- oder XML-Dateien in einem Verzeichnis ab. Genauso schlecht wäre das Einpflegen der Informationen in eine Excel-Datei. Wenn Sie dann auf eine Verwundbarkeit (‚Vulnerability‘) aufmerksam werden, können Sie Ihre Sammlung von JSON- oder XML-Dateien durchsuchen, bzw. F3 in der Excel-Datei drücken und nach der durch die Verwundbarkeit betroffenen Bibliothek suchen.
Um den Umgang mit Software-Stücklisten in Ihrem Betrieb zu optimieren, würden Sie:
- Ein SBOM Management System einführen bzw. Ihre bestehende Software-Verwaltung entsprechend erweitern.
- das SBOM Management System mit einem Vulnerability Tracker oder einer Vulnerability Database verbinden.
- Ihren Inventarisierungsprozess damit verknüpfen und
- Die Inbetriebnahme neuer Anwendungen davon abhängig machen, dass die Software-Stückliste der Anwendung im SBOM Management System erfolgreich hinterlegt wurde.
Wenn Sie alles richtig gemacht haben, informiert Sie Ihr SBOM Management System bei neuen Verwundbarkeiten, falls eine der von Ihnen eingesetzten Anwendungen davon betroffen ist. Und zwar sobald die Verwundbarkeit öffentlich bekannt wird, also u. U. sogar noch bevor der Hersteller der Anwendung Sie darüber informiert. Ein Beispiel für ein SBOM Management System ist Anchore SBOM [6], eine cloudbasierte Anwendung.
Maßgeschneiderte Softwarelösungen für Ihr Unternehmen
Wir bieten:
- Individuelle Softwarelösungen für betriebliche Informationssysteme, die exakt auf die Arbeitsabläufe und Bedürfnisse des Kunden abgestimmt sind.
- Entwicklung erfolgt gemeinsam mit dem Kunden: Feedback wird kontinuierlich integriert.
- Lösungen sind übersichtlich, enthalten nur benötigte Funktionen und sind kosteneffizient.
Auf Wunsch können Sie Ihre individuelle Softwarelösung in einer deutschen oder europäischen Cloud betreiben.
Zusammenfassung: Software-Stücklisten
Software-Stücklisten sind ein wichtiger Baustein, um unsere digitale Widerstandsfähigkeit (‚Cyber Resilience‘) zu erhöhen. Die Einführung der Technischen Richtlinie TR-03183 wird dazu beitragen, dass Software-Stücklisten zum natürlichen Bestandteil von Anwendungen werden. Endanwendern wird bessere Software zur Verfügung gestellt und sie werden über Schwachstellen benachrichtigt. Software-Verantwortliche müssen sich Gedanken machen, wie sie und ihre Prozesse davon optimal profitieren können.
PS: Mein Kollege hat ebenfalls zum Thema Software-Stücklisten gepostet. Denn auch Entwickler möchten Frühzeitig über Sicherheitslücken im Projekt informiert werden.
Links
[1]: Technical Guideline TR-03183: Cyber Resilience Requirements for Manufacturers and Products
[2]: European Union Vulnerability Database
[3]: Integration test: local dependencies
[4]: Visualization of enriched sample SBOM
[5]: Sunshine: actionable CycloneDX visualization tool
[6]: Anchore SBOM