SBOM
Příklady SBOM
Nejrychlejší způsob, jak pochopit SBOM, je jednu si přečíst. Tady je stejná malá aplikace v CycloneDX i v SPDX, s vysvětlením, co jednotlivá pole znamenají, jak vypadá slabá SBOM a jak zkontrolovat tu vlastní.
Aktualizováno
Aplikace v těchto příkladech
Oba soubory popisují example-api 2.4.0, ilustrativní službu v Node.js s jednou přímou závislostí,
express. Express dále závisí na accepts, takže příklady ukazují i jednu tranzitivní
závislost. Skutečná SBOM aplikace v Expressu uvádí mnohem více komponent, ale struktura je stejná.
Příklad SBOM v CycloneDX
{
"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]"] }
]
}
| Pole | Co vám říká |
|---|---|
specVersion |
Jakou verzi formátu soubor používá, aby ho nástroje dokázaly zpracovat. |
serialNumber, version |
O kterou SBOM jde a o kterou její revizi. |
metadata.lifecycles |
Kdy SBOM vznikla. Zde během buildu. |
metadata.tools |
Který nástroj ji vytvořil. Dva nástroje mohou stejný commit popsat různě. |
metadata.component |
Produkt, který SBOM popisuje. |
purl |
Package URL, identifikátor, díky kterému nástroj spáruje komponentu s bezpečnostními upozorněními. |
licenses |
Deklarovaná licence komponenty. |
dependencies |
Kdo koho stahuje. Právě díky tomu je accepts vidět jako tranzitivní závislost. |
Příklad SBOM v SPDX
{
"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"
}
]
}
Informace jsou stejné, jen jinak uspořádané. SPDX vede seznam packages a každou vazbu mezi položkami
uvádí v relationships. licenseDeclared je to, co balíček uvádí sám o sobě, a
downloadLocation může mít hodnotu NOASSERTION, když ji nástroj nezná. Jak se oba formáty
liší nad rámec uspořádání, popisuje CycloneDX vs SPDX.
Jak vypadá slabá SBOM
Soubor může být platný, a přesto téměř nepoužitelný. Dávejte pozor na tyto znaky:
- Žádné vztahy mezi závislostmi. Plochý seznam vám řekne, že balíček je přítomen, ale ne, co ho stáhlo, a to potřebujete, abyste mohli opravit tranzitivní závislost.
- Žádné package URL. Bez identifikátoru, jako je purl, se párování komponenty s bezpečnostními upozorněními omezí na odhady podle názvů.
-
Chybějící licence. Mnoho polí ponechaných jako
NOASSERTIONznamená, že SBOM nedokáže odpovědět na otázky k licencím. - Podezřele málo komponent. Hrstka komponent u velké aplikace obvykle znamená jen přímé závislosti nebo jen to, co deklaroval jeden lockfile.
- Ani slovo o tom, kdy a jak. Bez nástroje a kontextu generování nepoznáte, čemu lze v SBOM věřit, že pokrývá.
- Mlčení o mezerách. Dobrá SBOM říká, co nemohla vidět. Většina souborů prostě skončí a čtenář předpokládá, že jsou úplné.
Jak zkontrolovat vlastní SBOM
- Ověřte formát. Projděte soubor validátorem schématu pro jeho formát a verzi, protože nástroj, který soubor nedokáže zpracovat, ho nemůže použít.
- Zkontrolujte pole. Porovnejte je s 2026 Minimum Elements nebo se seznamem, který požaduje váš zákazník.
- Vyhledejte něco, co znáte. Vyberte tranzitivní závislost, balíček ze základního image a nástroj pro build a podívejte se, které z nich se objeví.
- Porovnejte dva zdroje. Vygenerujte druhou SBOM jinou metodou a podívejte se na rozdíl. Každá komponenta navíc v jednom souboru je otázkou na ten druhý.
Všechny kontroly namapované na seznamy polí NTIA, CISA a BSI najdete v kontrolním seznamu kvality SBOM.
SBOM z doby buildu od CRACI
CRACI exportuje stejné formáty. Liší se to, odkud obsah pochází: zaznamenává, co každý job GitHub Actions stáhl, takže každá komponenta v SBOM byla do buildu skutečně stažena a balíčky obnovené z cache CI jsou tak označeny. GitHub Actions, které workflow spustil, se také objevují jako komponenty, připnuté na použitý commit. SBOM každého jobu navíc nese stav úplnosti, takže mezery jsou uvedené a nemusíte je hledat sami. Viz generování SBOM z doby buildu nebo srovnání nástrojů SBOM.
Příklady SBOM: časté dotazy
Jak vypadá SBOM?
Obvykle je to soubor JSON, někdy XML. Začíná údaji o samotné SBOM, například o nástroji a časovém razítku, pak uvádí každou komponentu s jejím názvem, verzí, identifikátorem a licencí a nakonec popisuje, jak na sobě komponenty závisejí.
Je SBOM soubor JSON?
Obvykle ano, protože JSON je nejpoužívanější kódování CycloneDX i SPDX. Oba formáty mají i jiná kódování a SPDX má navíc textovou podobu tag-value.
Co je purl v SBOM?
Purl neboli package URL je standardní identifikátor balíčku, například pkg:npm/[email protected]. V jednom řetězci pojmenovává ekosystém, balíček a verzi, což nástrojům umožňuje spolehlivě spárovat komponentu s daty o zranitelnostech.
Kolik komponent by měla SBOM mít?
Správné číslo neexistuje, ale měla by zahrnovat tranzitivní závislosti, kterých bývá obvykle mnohem víc než přímých. Velmi málo komponent u velké aplikace obvykle znamená, že nástroj viděl jen její část.
Můžete si prohlédnout SBOM open source projektu?
Někdy. Některé projekty zveřejňují SBOM spolu se svými vydáními a GitHub umí jednu exportovat z grafu závislostí repozitáře. Takový export odráží, co repozitář deklaruje, ne co použil konkrétní build.
Porovnejte svou SBOM se zaznamenanou
Spusťte jeden workflow GitHub Actions na CRACI a zjistěte, které komponenty vaše současná SBOM neuvádí.
Rezervujte si demo