123% mehr gemeldete CVEs pro Tag in 2026 als im Vorjahr.

SBOM

SBOM-Beispiele

Am schnellsten verstehen Sie eine SBOM, wenn Sie eine lesen. Hier sehen Sie dieselbe kleine Anwendung in CycloneDX und in SPDX, dazu, was jedes Feld bedeutet, wie eine schwache SBOM aussieht und wie Sie Ihre eigene prüfen.

Aktualisiert am

Die Anwendung in diesen Beispielen

Beide Dateien beschreiben example-api 2.4.0, einen beispielhaften Node.js-Dienst mit einer direkten Abhängigkeit, express. Express hängt seinerseits von accepts ab, die Beispiele zeigen also auch eine transitive Abhängigkeit. Eine echte SBOM einer Express-Anwendung listet deutlich mehr Komponenten, die Struktur ist aber dieselbe.

CycloneDX-SBOM-Beispiel

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79",
  "version": 1,
  "metadata": {
    "timestamp": "2026-10-30T09:00:00Z",
    "lifecycles": [{ "phase": "build" }],
    "tools": {
      "components": [
        { "type": "application", "name": "example-sbom-tool", "version": "1.0.0" }
      ]
    },
    "component": {
      "type": "application",
      "bom-ref": "example-api",
      "name": "example-api",
      "version": "2.4.0"
    }
  },
  "components": [
    {
      "type": "library",
      "bom-ref": "pkg:npm/[email protected]",
      "name": "express",
      "version": "4.21.2",
      "purl": "pkg:npm/[email protected]",
      "licenses": [{ "license": { "id": "MIT" } }]
    },
    {
      "type": "library",
      "bom-ref": "pkg:npm/[email protected]",
      "name": "accepts",
      "version": "1.3.8",
      "purl": "pkg:npm/[email protected]",
      "licenses": [{ "license": { "id": "MIT" } }]
    }
  ],
  "dependencies": [
    { "ref": "example-api", "dependsOn": ["pkg:npm/[email protected]"] },
    { "ref": "pkg:npm/[email protected]", "dependsOn": ["pkg:npm/[email protected]"] }
  ]
}
Feld Was es Ihnen sagt
specVersion Welche Version des Formats die Datei nutzt, damit Tools sie parsen können.
serialNumber, version Um welche SBOM es sich handelt und um welche Revision davon.
metadata.lifecycles Wann die SBOM entstanden ist. Hier: während des Builds.
metadata.tools Welches Tool sie erzeugt hat. Zwei Tools können denselben Commit unterschiedlich melden.
metadata.component Das Produkt, das die SBOM beschreibt.
purl Die Package-URL, die Kennung, mit der ein Tool die Komponente Advisories zuordnen kann.
licenses Die deklarierte Lizenz der Komponente.
dependencies Wer wen nachzieht. Dadurch wird accepts als transitive Abhängigkeit sichtbar.

SPDX-SBOM-Beispiel

{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "example-api-2.4.0",
  "documentNamespace": "https://example.com/spdx/example-api-2.4.0",
  "creationInfo": {
    "created": "2026-10-30T09:00:00Z",
    "creators": ["Tool: example-sbom-tool-1.0.0"]
  },
  "packages": [
    {
      "name": "example-api",
      "SPDXID": "SPDXRef-Package-example-api",
      "versionInfo": "2.4.0",
      "downloadLocation": "NOASSERTION"
    },
    {
      "name": "express",
      "SPDXID": "SPDXRef-Package-express",
      "versionInfo": "4.21.2",
      "downloadLocation": "NOASSERTION",
      "licenseDeclared": "MIT",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/[email protected]"
        }
      ]
    },
    {
      "name": "accepts",
      "SPDXID": "SPDXRef-Package-accepts",
      "versionInfo": "1.3.8",
      "downloadLocation": "NOASSERTION",
      "licenseDeclared": "MIT",
      "externalRefs": [
        {
          "referenceCategory": "PACKAGE-MANAGER",
          "referenceType": "purl",
          "referenceLocator": "pkg:npm/[email protected]"
        }
      ]
    }
  ],
  "relationships": [
    {
      "spdxElementId": "SPDXRef-DOCUMENT",
      "relationshipType": "DESCRIBES",
      "relatedSpdxElement": "SPDXRef-Package-example-api"
    },
    {
      "spdxElementId": "SPDXRef-Package-example-api",
      "relationshipType": "DEPENDS_ON",
      "relatedSpdxElement": "SPDXRef-Package-express"
    },
    {
      "spdxElementId": "SPDXRef-Package-express",
      "relationshipType": "DEPENDS_ON",
      "relatedSpdxElement": "SPDXRef-Package-accepts"
    }
  ]
}

Die Informationen sind dieselben, nur anders angeordnet. SPDX führt eine packages-Liste und nennt jede Verbindung zwischen Einträgen in relationships. licenseDeclared ist das, was das Paket über sich selbst angibt, und downloadLocation kann NOASSERTION sein, wenn das Tool den Ort nicht kennt. Wie sich die beiden Formate über das Layout hinaus unterscheiden, lesen Sie unter CycloneDX vs. SPDX.

Woran Sie eine schwache SBOM erkennen

Eine Datei kann gültig und trotzdem fast nutzlos sein. Achten Sie auf Folgendes:

  • Keine Abhängigkeitsbeziehungen. Eine flache Liste zeigt, dass ein Paket vorhanden ist, aber nicht, was es nachgezogen hat, und genau das brauchen Sie, um eine transitive Abhängigkeit zu beheben.
  • Keine Package-URLs. Ohne eine Kennung wie eine purl bleibt für den Abgleich mit Advisories nur das Raten anhand von Namen.
  • Fehlende Lizenzen. Stehen viele Felder auf NOASSERTION, kann die SBOM keine Lizenzfragen beantworten.
  • Verdächtig wenige Komponenten. Eine Handvoll Komponenten für eine große Anwendung bedeutet meist, dass nur direkte Abhängigkeiten erfasst sind oder nur das, was ein einziges Lockfile deklariert hat.
  • Keine Angabe zu Zeitpunkt und Methode. Ohne Tool und Generierungskontext können Sie nicht beurteilen, was die SBOM verlässlich abdeckt.
  • Schweigen über Lücken. Eine gute SBOM sagt, was sie nicht sehen konnte. Die meisten Dateien enden einfach, und Leser gehen davon aus, dass sie vollständig sind.

So prüfen Sie Ihre eigene SBOM

  1. Das Format validieren. Prüfen Sie die Datei mit einem Schema-Validator für ihr Format und ihre Version, denn ein Tool, das die Datei nicht parsen kann, kann sie auch nicht nutzen.
  2. Die Felder prüfen. Vergleichen Sie sie mit den 2026 Minimum Elements oder der Liste, die Ihr Kunde verlangt hat.
  3. Nach etwas Bekanntem suchen. Wählen Sie eine transitive Abhängigkeit, ein Paket aus Ihrem Basis-Image und ein Build-Tool, und sehen Sie nach, welche davon auftauchen.
  4. Zwei Quellen vergleichen. Erzeugen Sie eine zweite SBOM mit einer anderen Methode und sehen Sie sich den Unterschied an. Jede zusätzliche Komponente in der einen Datei ist eine Frage an die andere.

Eine SBOM zur Build-Zeit von CRACI

CRACI exportiert dieselben Formate. Der Unterschied liegt darin, woher der Inhalt kommt: CRACI zeichnet auf, was jeder GitHub-Actions-Job geladen hat, sodass jede Komponente in der SBOM tatsächlich in den Build gelangt ist, und aus CI-Caches wiederhergestellte Pakete sind als solche gekennzeichnet. Die GitHub Actions, die der Workflow ausgeführt hat, erscheinen ebenfalls als Komponenten, gepinnt auf den verwendeten Commit. Die SBOM jedes Jobs trägt außerdem einen Vollständigkeitsstatus, sodass Lücken benannt werden, statt dass Sie sie selbst finden müssen. Siehe SBOM-Generierung zur Build-Zeit oder SBOM-Tools im Vergleich.

SBOM-Beispiele: häufig gestellte Fragen

Wie sieht eine SBOM aus?

Meist ist sie eine JSON-Datei, manchmal XML. Sie beginnt mit Daten über die SBOM selbst, etwa Tool und Zeitstempel, listet dann jede Komponente mit Name, Version, Kennung und Lizenz und beschreibt schließlich, wie die Komponenten voneinander abhängen.

Ist eine SBOM eine JSON-Datei?

Meistens, denn JSON ist die am weitesten verbreitete Kodierung von CycloneDX und SPDX. Beide Formate haben auch andere Kodierungen, und SPDX kennt zusätzlich eine Textform aus Tag-Wert-Paaren.

Was ist eine purl in einer SBOM?

Eine purl, kurz für Package-URL, ist eine standardisierte Kennung für ein Paket, zum Beispiel pkg:npm/[email protected]. Sie nennt Ökosystem, Paket und Version in einer Zeichenkette, sodass Tools die Komponente zuverlässig mit Schwachstellendaten abgleichen können.

Wie viele Komponenten sollte eine SBOM haben?

Eine richtige Zahl gibt es nicht, aber die SBOM sollte transitive Abhängigkeiten enthalten, die die direkten meist deutlich überwiegen. Sehr wenige Komponenten für eine große Anwendung bedeuten meist, dass das Tool nur einen Teil gesehen hat.

Kann man die SBOM eines Open-Source-Projekts einsehen?

Manchmal. Einige Projekte veröffentlichen SBOMs mit ihren Releases, und GitHub kann eine aus dem Abhängigkeitsgraphen eines Repositorys exportieren. Dieser Export spiegelt wider, was das Repository deklariert, nicht, was ein bestimmter Build verwendet hat.

Vergleichen Sie Ihre SBOM mit einer aufgezeichneten

Lassen Sie einen GitHub-Actions-Workflow auf CRACI laufen und sehen Sie, welche Komponenten Ihre aktuelle SBOM nicht auflistet.

Demo buchen