BOMs
Stücklisten (Bills of Materials, BOMs) stehen im Mittelpunkt der Funktionalität und des Namens von BOMnipotents. Eine BOM ist eine Liste aller Komponenten, aus denen ein Produkt besteht. Im Kontext der Cybersicherheit ist die Software-BOM (SBOM) die bekannteste Variante, BOMs ermöglichen aber auch allgemeinere Überlegungen.
Für BOM-Interaktionen, die über das Lesen hinausgehen, benötigen Sie die Berechtigung BOM_MANAGEMENT. Im Abschnitt zur Verwaltung von Zugriffsrechten
wird beschrieben, wie diese erteilt wird.
Hochladen
Um eine BOM hochzuladen, rufen Sie Folgendes auf:
Eingabe
bomnipotent_client bom upload /home/your_project/sbom.cdx.json
Ausgabe
[INFO] Uploaded BOM 'Your Project:1.0.0'.
BOMnipotent erwartet seine BOM im strukturierten CycloneDX
JSON-Format.
Im Syft-Tutorial
erfahren Sie, wie Sie eine BOM für Ihr Produkt erstellen.
Der BOMnipotent Client ließt die Datei unter dem angegebenen Pfad und lädt ihren Inhalt hoch. Die BOM kann dann von Konsumenten mit entsprechenden Berechtigungen eingesehen werden.
BOMs für Konsumenten
beschreibt, wie die BOMs auf dem Server aufgelistet und heruntergeladen werden.
Um eine BOM zur Datenbank hinzuzufügen, benötigt der BOMnipotent Client einige zusätzliche Informationen: einen Namen, eine Version und optional ein TLP-Label. Name und Version können entweder abgeleitet (empfohlen) oder wie unten beschrieben überschrieben werden.
Name und Version
Ableitung (empfohlen)
BOMnipotent verwendet Name und Version zur Identifizierung einer Stückliste. Diese werden aus den bereitgestellten CycloneDX-JSON-Feldern “metadata.component.name” und “metadata.component.version” abgeleitet. Gemäß der CycloneDX-Spezifikation
ist das Feld “metadata.component” jedoch optional.
Wenn keine Version angegeben ist, verwendet BOMnipotent stattdessen das Datum von “metadata.timestamp”, sofern verfügbar.
Um Komplikationen zu vermeiden, wird empfohlen, beim Generieren der Stückliste Name und Version anzugeben, wie im Syft-Tutorial
beschrieben.
Überschreiben (nicht besonders empfohlen)
Falls Ihrer BOM aus irgendeinem Grund ein Name oder eine Version fehlt oder diese fehlerhaft ist, bietet der BOMnipotent Client die Möglichkeit, dies über Befehlszeilenargumente zu beheben:
Eingabe (lange Variante)
bomnipotent_client bom upload /home/your_project/dev_env_sbom.cdx.json --name-overwrite="Other Project" --version-overwrite="2.7.1"
Eingabe (kurze Variante)
bomnipotent_client bom upload /home/your_project/dev_env_sbom.cdx.json -n "Other Project" -v "2.7.1"
Ausgabe
[WARN] Warning: Overwriting name with 'Other Project'. The data stored on the server will differ from the provided file.
[WARN] Warning: Overwriting version with '2.7.1'. The data stored on the server will differ from the provided file.
[INFO] Uploaded BOM 'Other Project:2.7.1'.
Wichtig: Der BOMnipotent Client ändert in diesem Fall die Daten, bevor sie an den Server gesendet werden. Die lokale Datei wird nicht geändert, da dies zu weit gehen würde. Das bedeutet, dass Ihre lokale Datei und die Daten auf dem Server nicht mehr synchron sind. Schlimmer noch: Falls Sie Ihre BOM signiert haben, ist Ihre Signatur nun ungültig.
Falls Sie diese Option nutzen, wird daher empfehlen, die BOM umgehend vom Server herunterzuladen (wie in BOMs für Verbraucher
beschrieben) und Ihre lokale Datei durch das Ergebnis zu ersetzen.
TLP-Klassifizierung
Für Konsumenten verwaltet BOMnipotent den Datenzugriff über das Traffic Light Protocol (TLP)
. Das
CycloneDX-Format
unterstützt derzeit keine Dokumentklassifizierung.
Um BOMnipotent mitzuteilen, wie ein Dokument klassifiziert werden soll, haben Sie zwei Möglichkeiten:
- Legen Sie in der Serverkonfiguration ein Default-TLP-Label
fest. Dieses wird dann für alle BOMs ohne weitere Spezifikationen verwendet.
- Geben Sie eine TLP-Klassifizierung per Kommandozeilenargument an:
Eingabe (lange Variante)
bomnipotent_client bom upload /home/your_project/container_sbom.cdx.json --tlp=WHITE # This makes the BOM public.
Eingabe (kurze Variante)
bomnipotent_client bom upload /home/your_project/container_sbom.cdx.json -t WHITE # This makes the BOM public.
Ausgabe
[INFO] Uploaded BOM 'Your Project Container:1.2.3'.
Falls Sie keines von beiden tun, behandelt BOMnipotent alle nicht klassifizierten Dokumente so, als wären sie mit dem Label TLP:RED gekennzeichnet, und gibt jedes Mal eine Warnung aus, wenn dies erforderlich ist.
Konfliktbehandlung
Die Kombination aus Name und Version der Hauptkomponente einer BOM muss eindeutig sein. Der Versuch, ein weiteres Dokuement mit derselben Kombination hochzuladen, resultiert in einem Fehler.
Eingabe
bomnipotent_client bom upload /home/your_project/sbom.cdx.json
Ausgabe
[ERROR] Received response:
409 Conflict
BOM 'Your Project:1.0.0' already exists in the database.
Sie können dieses Verhalten mit der “on-existing” Option überschreiben, und BOMnipotent anweisen, Dokumente im Konfliktfall entweder zu überspringen oder zu ersetzen:
Eingabe (lange Variante)
bomnipotent_client bom upload /home/your_project/sbom.cdx.json --on-existing=skip
Eingabe (kurze Variante)
bomnipotent_client bom upload /home/your_project/sbom.cdx.json -o skip
Ausgabe
Eingabe (lange Variante)
bomnipotent_client bom upload /home/your_project/sbom.cdx.json --on-existing=replace
Eingabe (kurze Variante)
bomnipotent_client bom upload /home/your_project/sbom.cdx.json -o replace
Ausgabe
[INFO] Modified BOM 'Your Project:1.0.0'.
Ändern
Im einfachsten Fall funktioniert das Ändern einer vorhandenen Stückliste ähnlich wie das Hochladen einer neuen.
Eingabe
bomnipotent_client bom modify /home/your_project/sbom.cdx.json
Ausgabe
[INFO] Modified BOM 'Your Project:1.0.0'.
Dadurch werden Name und Version des Dokuments abgeleitet und der vorhandene Inhalt auf dem Server überschrieben. Sollten die Daten auf dem Server nicht vorhanden sein, wird ein 404-Fehler “Nicht gefunden” zurückgegeben.
TLP-Label ändern
Wenn der Stückliste zuvor ein TLP-Label zugewiesen wurde, wird dieses durch eine Änderung des Inhalts nicht automatisch geändert.
Wenn Sie ein neues TLP-Label angeben möchten, können Sie dies über das folgende Argument tun:
Eingabe (lange Variante)
bomnipotent_client bom modify /home/your_project/sbom.cdx.json --tlp=AMBER
Eingabe (kurze Variante)
bomnipotent_client bom modify /home/your_project/sbom.cdx.json -t AMBER
Ausgabe
[INFO] Modified BOM 'Your Project:1.0.0'.
Wenn sich der Inhalt der Stückliste nicht geändert hat und Sie nur das TLP-Label ändern möchten, müssen Sie das Dokument nicht erneut hochladen. Anstatt einen Dateipfad anzugeben, können Sie Name und Version der neu zu klassifizierenden BOM angeben:
Eingabe (lange Variante)
bomnipotent_client bom modify --name="Other Project" --version="2.7.1" --tlp=GREEN
Eingabe (kurze Variante)
bomnipotent_client bom modify -n "Other Project" -v "2.7.1" -t GREEN
Ausgabe
[INFO] Modified BOM 'Other Project:2.7.1'.
Wenn Sie als TLP-Label “none”, “default” oder “unlabelled” angeben, wird jede vorhandene Klassifizierung entfernt und der Server greift auf das Default-TLP-Label
der Serverkonfiguration zurück:
Eingabe (lange Variante)
bomnipotent_client bom modify /home/your_project/sbom.cdx.json --tlp=none
bomnipotent_client bom modify /home/your_project/sbom.cdx.json --tlp=default # Does the same
bomnipotent_client bom modify /home/your_project/sbom.cdx.json --tlp=unlabeled # Does the same
Eingabe (kurze Variante)
bomnipotent_client bom modify /home/your_project/sbom.cdx.json -t none
bomnipotent_client bom modify /home/your_project/sbom.cdx.json -t default # Does the same
bomnipotent_client bom modify /home/your_project/sbom.cdx.json -t unlabeled # Does the same
Ausgabe
[INFO] Modified BOM 'Your Project:1.0.0'.
[INFO] Modified BOM 'Your Project:1.0.0'.
[INFO] Modified BOM 'Your Project:1.0.0'.
Name oder Version ändern
Wenn das hochgeladene Dokument einen anderen Namen oder eine andere Version hat als die zu ändernden Daten, müssen Sie diese Informationen dem BOMnipotent-Client mithilfe der folgenden Befehlszeilenargumente mitteilen:
Eingabe (lange Variante)
bomnipotent_client bom modify /home/your_project/dev_env_sbom.cdx.json --name="Other Project" --version="2.7.1"
Eingabe (kurze Variante)
bomnipotent_client bom modify /home/your_project/dev_env_sbom.cdx.json -n "Other Project" -v "2.7.1"
Ausgabe
[INFO] Modified BOM 'Your Development Environment:1.2.3'.
BOMnipotent leitet die neuen Daten aus dem von Ihnen bereitgestellten Dokument ab und ändert die Datenbankeinträge entsprechend.
Name oder Version überschreiben (nicht empfohlen)
Wie beim Hochladen können Sie den im lokalen Dokument gespeicherten Namen und/oder die Version überschreiben:
Eingabe
bomnipotent_client bom modify /home/your_project/dev_env_sbom.cdx.json --name-overwrite="Fearsome Breadcrump" --version-overwrite="6.2.8"
Ausgabe
[WARN] Warning: Overwriting name with 'Fearsome Breadcrump'. The data stored on the server will differ from the provided file.
[WARN] Warning: Overwriting version with '6.2.8'. The data stored on the server will differ from the provided file.
[INFO] Modified BOM 'Fearsome Breadcrump:6.2.8'.
Wichtig: Wie beim Hochladen werden die JSON-Daten vor dem Hochladen auf den Server geändert! Es gelten die gleichen Dinge zu bedenken.
Wenn die Daten auf dem Server einen anderen Namen und/oder eine andere Version haben als im Dokument angegeben, können Sie die Angabe mit einem Überschreiben der Daten kombinieren:
Eingabe (lange Variante)
bomnipotent_client bom modify /home/your_project/dev_env_sbom.cdx.json --name="Fearsome Breadcrump" --version="6.2.8" --name-overwrite="Best Project" --version-overwrite="3.1.4"
Eingabe (kurze Variante)
bomnipotent_client bom modify /home/your_project/dev_env_sbom.cdx.json -n "Fearsome Breadcrump" -v "6.2.8" --name-overwrite="Best Project" --version-overwrite="3.1.4"
Ausgabe
[WARN] Warning: Overwriting name with 'Best Project'. The data stored on the server will differ from the provided file.
[WARN] Warning: Overwriting version with '3.1.4'. The data stored on the server will differ from the provided file.
[INFO] Modified BOM 'Best Project:3.1.4'.
Das Ändern von Name und/oder Version ohne Angabe des vollständigen Dokuments ist nicht unterstützt.
Löschen
Das Löschen einer BOM ist sehr einfach:
Eingabe
bomnipotent_client bom delete "Best Project" "3.1.4"
Ausgabe
[INFO] Successfully deleted BOM 'Best Project:3.1.4'.
Falls die BOM nicht existiert, gibt der Server den Fehler 404 “Nicht gefunden” zurück. Ist sie vorhanden, wird sie aus der Datenbank entfernt.
Alle Komponenten und Sicherheitslücken, die mit der BOM assoziiert sind, werden ebenfalls gelöscht.
Sicherheitslücken
Ein zentraler Bestandteil der Lieferkettensicherheit ist der Abgleich des Inhalts einer Stückliste (BOM), also aller Komponenten eines Produkts, mit Datenbanken bekannter Schwachstellen.
Für Schwachstelleninteraktionen, die über das Lesen hinausgehen, benötigen Sie die Berechtigung VULN_MANAGEMENT. Im Abschnitt zur Verwaltung von Zugriffsrechten
wird beschrieben, wie diese erteilt wird.
Erkennen
BOMnipotent erkennt selbst keine neuen Schwachstellen. Ein Tool, das in Kombination mit BOMnipotent verwendet werden kann, ist grype
. Es verwendet eine BOM als Eingabe und erstellt eine Liste der Schwachstellen als Ausgabe. Das grype-Tutorial
enthält weitere Informationen zur Verwendung. Es können aber auch andere Tools verwendet werden, solange sie Output im CycloneDX JSON Format
erstellen können.
Mit dem BOMnipotent-Client können Sie den Inhalt einer BOM direkt ausgeben und an grype weiterleiten.
Eingabe (lange Variante)
bomnipotent_client bom get "Your Project" "1.0.0" | grype --output cyclonedx-json=/home/vuln.cdx.json
Eingabe (kurze Variante)
bomnipotent_client bom get "Your Project" "1.0.0" | grype -o cyclonedx-json=/home/vuln.cdx.json
Dadurch werden die Softwarekomponenten anhand mehrerer Datenbanken geprüft und die Ergebnisse in das CycloneDX eingepflegt. Anschließend werden alle Ergebnisse in einer Datei namens “vuln.cdx.json” (oder einem anderen von Ihnen angegebenen Namen) gespeichert.
Grype hat derzeit einen kleinen bekannten Fehler
, der dazu führt, dass die Version der Hauptkomponente beim Hinzufügen der Schwachstellen vergessen wird. Dies ist problematisch, da BOMnipotent die Version zur eindeutigen Identifizierung eines Produkts benötigt. Eine mögliche Problemumgehung besteht darin, die Version erneut zum Dokument hinzuzufügen, beispielsweise über jq '.metadata.component.version = "<VERSION>"' "vuln.cdx.json" > "vuln_with_version.cdx.json"
. Ab BOMnipotent v0.3.1 können Sie die Version stattdessen direkt beim Hochladen der Schwachstelle angeben, wie unten beschrieben.
Aktualisieren
Der Befehl zum Aktualisieren der mit einer BOM verknüpften Schwachstellen lautet:
Eingabe
bomnipotent_client vulnerability update /home/your_project/vuln.cdx.json
Ausgabe
[INFO] Updated vulnerabilities of BOM 'Your Project:1.0.0'.
Das Argument “<VULNERABILITIES>” muss ein Pfad zu einer Datei im CycloneDX JSON-Format
sein.
Idealerweise enthält diese Datei den Namen und die Version der zugehörigen BOM. In diesem Fall werden diese automatisch gelesen. Falls einer der Werte fehlt (z. B. aufgrund eines bekannten Fehlers
in grype/), können Sie ihn mit einem optionalen Argument angeben:
Eingabe (lange Variante)
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json --name="Your Project" --version="1.0.0"
Eingabe (kurze Variante)
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json -n "Your Project" -v "1.0.0"
Ausgabe
[INFO] Updated vulnerabilities of BOM 'Your Project:1.0.0'.
Schwachstellen sollten regelmäßig aktualisiert werden. Dadurch werden alle vorherigen Schwachstellen, die mit einer BOM verknüpft sind, vollständig ersetzt. Das hochgeladene CycloneDX-Dokument muss daher eine vollständige Liste aller bekannten Schwachstellen enthalten.
Sie können Schwachstellen nur für eine BOM aktualisieren, die auf dem Server vorhanden ist:
Eingabe (lange Variante)
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json --name=Schlagsahne --version=2.7.1;
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json --version=1.0.1;
Eingabe (kurze Variante)
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json -n Schlagsahne -v 2.7.1;
bomnipotent_client vulnerability update /home/your_project/vuln_wrong_metadata.cdx.json -v 1.0.1;
Ausgabe
[ERROR] Received response:
404 Not Found
BOM 'Schlagsahne:2.7.1' not found in database.
[ERROR] Received response:
404 Not Found
BOM 'Your Project:1.0.1' not found in database.
Auflisten
Der Abschnitt zum Auflisten von Schwachstellen
in der Dokumentation für Verbraucher behandelt die meisten Aspekte der Auflistung von Schwachstellen.
Ein Aspekt, der dort nicht erwähnt wird, ist die Option “–unassessed”. Damit listet der BOMnipotent-Client nur Schwachstellen auf, denen kein CSAF-Dokument mit Status “final” zugeordnet ist.
Damit diese Zuordnung geschehen kann, muss das CSAF Dokument Produktname und Produktversion
für die BOM in seinen Branches enthalten.
Eingabe (lange Variante)
bomnipotent_client vulnerability list --unassessed
Eingabe (kurze Variante)
bomnipotent_client vulnerability list -u
Ausgabe
[INFO]
╭──────────────┬─────────────────┬─────────────────────┬────────────────────────────┬───────┬──────────┬───────────┬──────────────────╮
│ Product Name │ Product Version │ Vulnerability │ Description │ Score │ Severity │ TLP │ CSAF Assessments │
├──────────────┼─────────────────┼─────────────────────┼────────────────────────────┼───────┼──────────┼───────────┼──────────────────┤
│ Best Project │ 3.1.4 │ GHSA-qg5g-gv98-5ffh │ rustls network-reachable p │ │ medium │ TLP:GREEN │ │
│ │ │ │ anic in `Acceptor::accept` │ │ │ │ │
╰──────────────┴─────────────────┴─────────────────────┴────────────────────────────┴───────┴──────────┴───────────┴──────────────────╯
[ERROR] Found 1 unassessed vulnerabilities.
In diesem Modus beendet der BOMnipotent Client den Vorgang mit einem Fehlercode genau dann wenn nicht bewertete Schwachstellen vorliegen. Dies erleichtert die Integration dieses Aufrufs in Ihre regelmäßige CI/CD.
Sie können diese Option frei mit der Angabe eines Produktnamens oder einer Version kombinieren:
Eingabe (lange Variante)
bomnipotent_client vulnerability list --name="Your Project" --version="1.0.0" --unassessed
Eingabe (kurze Variante)
bomnipotent_client vulnerability list -n "Your Project" -v "1.0.0" -u
Ausgabe
[INFO] No unassessed vulnerabilities found
CSAF Dokumente
Ein Common Security Advisory Framework
(CSAF)-Dokument ist die Antwort eines Herstellers auf eine neu entdeckte Sicherheitslücke. Es ist ein maschinenlesbares Format, welches Informationen darüber verbreitet, wie Nutzer Ihres Produkts reagieren sollten: Muss auf eine neuere Version aktualisiert werden? Muss eine Konfiguration geändert werden? Ist Ihr Produkt überhaupt betroffen oder ruft es den betroffenen Teil der anfälligen Bibliothek möglicherweise nie auf?
Für CSAF-Interaktionen, die über das Lesen hinausgehen, benötigen Sie die Berechtigung CSAF_MANAGEMENT. Im Abschnitt über die Verwaltung von Zugriffsrechten
wird beschrieben, wie diese erteilt wird.
Hochladen
Um ein CSAF-Dokument hochzuladen, rufen Sie
Eingabe
bomnipotent_client csaf upload /home/your_project/advisory.json
Ausgabe
[INFO] Uploaded CSAF with id 'ghsa-qg5g-gv98-5ffh_advisory'.
Bevor Ihr CSAF-Dokument hochgeladen wird, prüft der BOMnipotent Client, ob es gemäß dem OASIS CSAF-Standard
gültig ist.
Konfliktbehandlung
CSAF Dokumente werden durch ihren, nun ja, Identifikator identifiziert, welcher eindeutig sein muss. Der Versuch, ein weiteres Dokuement mit derselben ID hochzuladen, resultiert in einem Fehler:
Eingabe
bomnipotent_client csaf upload /home/your_project/advisory.json
Ausgabe
[ERROR] Received response:
409 Conflict
CSAF with id 'ghsa-qg5g-gv98-5ffh_advisory' already exists in the database.
Sie können dieses Verhalten mit der “on-existing” Option überschreiben, und BOMnipotent anweisen, Dokumente im Konfliktfall entweder zu überspringen oder zu ersetzen:
Eingabe (lange Variante)
bomnipotent_client csaf upload /home/your_project/advisory.json --on-existing=skip
Eingabe (kurze Variante)
bomnipotent_client csaf upload /home/your_project/advisory.json -o skip
Ausgabe
Eingabe (lange Variante)
bomnipotent_client csaf upload /home/your_project/advisory.json --on-existing=replace
Eingabe (kurze Variante)
bomnipotent_client csaf upload /home/your_project/advisory.json -o replace
Ausgabe
[INFO] Modified CSAF with id 'ghsa-qg5g-gv98-5ffh_advisory'.
Auflisten
Sie können das Ergebnis des Vorgangs mit
Eingabe
bomnipotent_client csaf list
Ausgabe
[INFO]
╭────────────────────────────┬────────────────────────────┬─────────────────────────┬─────────────────────────┬────────┬───────────╮
│ ID │ Title │ Initial Release │ Current Release │ Status │ TLP │
├────────────────────────────┼────────────────────────────┼─────────────────────────┼─────────────────────────┼────────┼───────────┤
│ ghsa-qg5g-gv98-5ffh_adviso │ Network-reachable panic in │ 2025-01-01 10:11:12 UTC │ 2025-01-01 10:11:12 UTC │ final │ TLP:AMBER │
│ ry │ Your Product │ │ │ │ │
╰────────────────────────────┴────────────────────────────┴─────────────────────────┴─────────────────────────┴────────┴───────────╯
Alle Daten stammen aus dem CSAF-Dokument.
Falls das Dokument nicht den optionalen TLP-Labeleintrag enthält, wird es mit dem für den Server konfigurierten Default-TLP
behandelt.
...┬────────┬─────────╮
...│ Status │ TLP │
...┼────────┼─────────┤
...│ final │ Default │
...┴────────┴─────────╯
Ändern
Wenn sich der Status Ihres Dokuments ändert, Sie es neu klassifizieren möchten oder neue Informationen vorliegen, können Sie es ändern. Um die neue Version hochzuladen, rufen Sie Folgendes auf:
Eingabe
bomnipotent_client csaf modify /home/your_project/advisory.json
Ausgabe
[INFO] Modified CSAF with id 'ghsa-qg5g-gv98-5ffh_advisory'.
Der Befehl kann sogar die ID vom CSAF Dokument modifizieren. Da die bisheriger ID in diesem Fall nicht aus dem neuen Dokument abgeleitet werden kann, muss sie als optionales Argument angegeben werden:
Eingabe (lange Variante)
bomnipotent_client csaf modify <PATH/TO/CSAF> --id=<OLD-ID>
Eingabe (kurze Variante)
bomnipotent_client csaf modify <PATH/TO/CSAF> -i <OLD-ID>
Löschen
Um ein CSAF-Dokument von Ihrem Server zu löschen (was Sie wirklich nur tun sollten, falls etwas komplett schiefgelaufen ist), rufen Sie einfach Folgendes auf:
Eingabe
bomnipotent_client csaf delete ghsa-qg5g-gv98-5ffh_advisory
Ausgabe
[INFO] Deleted CSAF with id 'ghsa-qg5g-gv98-5ffh_advisory'.