Knowledge · SBOM

BSI TR-03183-2 explained: what the guideline requires of an SBOM

CycloneDX 1.6 or SPDX 3.0.1 or higher, in JSON or XML, with fixed required fields. The current version is 2.1.0.

The Cyber Resilience Act requires an SBOM (Annex I, Part II, point 1) but does not name the TR.

As of 23 October 2026 · 11 min readYou make the conformity statement. This page and our reports provide technical findings as its basis.

The test subject
Document
BSI TR-03183-2, Part 2: Software Bill of Materials (SBOM)
Version
2.1.0 of 20 August 2025, English, 37 pages
SHA-256
dda0ccd9b6148571d1d12241a1618b30027f22bc15e24248fdd21a011e62845c

BSI: TR-03183-2 version 2.1.0 (PDF)

The test subject: BSI: TR-03183-2 version 2.1.0 (PDF)

What is TR-03183-2?

TR-03183 is titled “Cyber Resilience Requirements for Manufacturers and Products” and has several parts: part 1 general requirements, part 2 the SBOM, part 3 vulnerability reports and notifications, and part H on Module H. According to the BSI, part 2 “describes formal and technical requirements for Software Bill of Materials (SBOM)”. The current versions are part 1 version 1.0.0, part 2 version 2.1.0, part 3 version 1.0.0 and part H version 1.1.0.

The TR is not binding. The BSI writes: “This document is meant to be a guide and is not binding or mandatory. It cannot be used as presumption of conformity.” It is to be replaced by the corresponding harmonised European standards as soon as they become available.

In section 1 the TR states that under the CRA the compilation of an SBOM is mandatory. In section 3.2.9 it explains why it uses terms other than the CRA's: the CRA is a market access regulation, the TR sets technical requirements.

The CRA itself requires a software bill of materials “in a commonly used and machine-readable format covering at the very least the top-level dependencies of the products” (Annex I, Part II, point 1). The Commission may specify format and elements by implementing acts (Article 13(24)). The regulation does not name the TR.

Only version 1.0 of 12 July 2023 was published in German. The BSI lists it as outdated. Version 1.1 of 28 November 2023 was the English translation, with changed requirements for creator, version and licence information. Since then the TR has been published in English.

Does the CRA name the TR? (Official Journal, English text)
curl -sL -H "Accept: application/xhtml+xml" -H "Accept-Language: eng" http://publications.europa.eu/resource/celex/32024R2847 | grep -c "03183"
Output
0

Which formats and versions does it require? (section 4)

A newly generated or updated SBOM must be JSON or XML and valid against one of these specifications in one of the listed versions: CycloneDX 1.6 or higher, or SPDX 3.0.1 or higher. Only officially released versions of the specifications may be used.

Version 2.0.0 of the TR still required CycloneDX 1.5 or higher and SPDX 2.2.1 or higher (table 1). So SPDX 2.3 is no longer enough for a new SBOM.

The most recent version of the TR applies. The immediately preceding one may still be used for up to six months after the new one is issued. An SBOM that matched the version in force on its delivery date stays valid (section 7).

The format requirement in the PDF
pdftotext BSI-TR-03183-2_v2_1_0.pdf - | grep -E "version 1.6 or higher|version 3.0.1 or higher"

Output

CycloneDX9, version 1.6 or higherSystem Package Data Exchange (SPDX)10, version 3.0.1 or higher

Which required fields does the SBOM itself have? (5.2.1, 5.2.3)

Field (name in the TR)Content
Creator of the SBOMEmail address of the entity that created the SBOM. If there is none, a URL, for example the home page or the project page.
TimestampDate and time of compilation, in the format of the specification used. UTC is recommended.
SBOM-URI (additional)URI of this SBOM. Required if it exists and meets the format's requirements for this field.

Which required fields does each component have? (5.2.2)

Each component needs at least these ten fields. Information that is not available because of the way a component is assembled is left out, even if the field is required, for example the hash or the filename (3.2.1).

Per table 7 a firmware image is an executable, unstructured file. Binaries containing statically linked libraries count as “unstructured, executable files” (8.1.6).

Field (name in the TR)Content
Component creatorEmail address of the entity that created and, if applicable, maintains the component, otherwise a URL.
Component nameThe name the creator assigned, otherwise the actual filename.
Component versionThe creator's identifier. Existing identifiers must not be changed. Without a version, the file's modification date per RFC 3339, section 5.6.
Filename of the componentThe actual filename, without its path.
Dependencies on other componentsAll components this one directly depends on or contains. Whether the list is complete must be clearly indicated.
Distribution licencesThe licences under which a licensee can use the component.
Hash value of the deployable componentSHA-512 of the deployable component as a file.
Executable property“executable” or “non-executable”.
Archive property“archive” or “no archive”.
Structured property“structured” or “unstructured”. If a component contains both, “structured” applies.
The BSI properties for CycloneDX in the mapping (8.2)
pdftotext BSI-TR-03183-2_v2_1_0.pdf - | grep -o '"bsi:component:[a-zA-Z]*"' | sort -u

Output

"bsi:component:archive"
"bsi:component:effectiveLicense"
"bsi:component:executable"
"bsi:component:filename"
"bsi:component:structured"

Additional and optional fields for each component (5.2.4, 5.2.5)

The additional fields are required if the information exists and meets the format's requirements for the field. The optional ones may be given. Licences are named with SPDX licence identifiers or expressions (6.1).

Field (name in the TR)Content
Source code URI (additional)URI of the source code, for example the version used in its repository.
URI of the deployable form of the component (additional)URI that points directly to the deployable form, for example the download.
Other unique identifiers (additional)Further identifiers, for example CPE or Package URL (purl).
Original licences (additional)The licences assigned by the creator of the component.
Effective licence (optional)The licence under which the creator of the SBOM uses the component.
Hash value of the source code of the component (optional)Hash of the source code. According to the TR, a method for it has not yet been determined.
URL of the security.txt (optional)URL of the creator's security.txt.

Where do the required fields sit in CycloneDX and SPDX? (8.2)

Since version 2.1.0 the TR maps its fields to SPDX 3.0.1 and CycloneDX 1.6, each in JSON (Tables 8 and 9). According to the TR, both formats lack some of the required values; these go into the SBOM as key-value pairs of the BSI taxonomy. Fields the format itself requires stay in as well.

FieldCycloneDX 1.6 and SPDX 3.0.1
Creator of the SBOMCycloneDX: metadata.manufacturer with url or contact with email. SPDX: CreationInfo.createdBy, pointing to a Person or Organization with an externalIdentifier of type email or urlScheme.
TimestampCycloneDX: metadata.timestamp. SPDX: CreationInfo.created.
Component creatorCycloneDX: the component's manufacturer. SPDX: originatedBy on the software_Package.
Name and versionCycloneDX: name and version. SPDX: name and software_packageVersion.
FilenameCycloneDX: property bsi:component:filename. SPDX: a software_File with name, linked through the relationship hasDistributionArtifact.
DependenciesCycloneDX: dependencies, completeness in compositions with aggregate complete, incomplete or unknown. SPDX: relationship contains or dependsOn with completeness complete, incomplete or noAssertion.
Distribution licencesCycloneDX: licenses with expression and acknowledgement concluded. SPDX: relationship hasConcludedLicense to a licence expression.
HashCycloneDX: externalReferences of type distribution with hashes, alg SHA-512. SPDX: verifiedUsing with algorithm sha512 on the software_File.
Executable, archive, structuredCycloneDX: properties bsi:component:executable, bsi:component:archive, bsi:component:structured. SPDX: entries in software_additionalPurpose, namely executable, archive and container, and firmware for an unstructured file.

What applies to components that are only identified? (3.2.2, 3.2.4, 3.2.5)

Not every component has to carry all ten required fields. The TR sets which fields apply in this order: referenced component, identified component, fully described component (5.1).

Kind of componentRequired fields
Identified component (3.2.4), for example the first one outside the scope of deliveryCreator, name, version and other unique identifiers such as CPE or purl.
Referenced component (3.2.5), described in another BOMCreator, name and version taken from the referenced BOM, plus the reference. If the two disagree, the referenced BOM prevails. The referencing SBOM should record nothing beyond that.
Logical component (3.2.2), combining several components, for example a productCreator, name, version, dependencies, distribution licences, other unique identifiers, original licences, effective licence and the URL of the security.txt. Filename, hash and the three properties do not apply.

Must the SBOM hold the same information as the build? (5.1, 3.2.1)

Section 5.1 requires the SBOM to contain the same information as available during the build process, or equivalent information where there is no build process.

For compiled code, section 3.2.1 sets out: the component used during the linker run must be listed, even if an alternative could have been used. This applies to statically and dynamically linked libraries. For firmware this means: every library the linker took into the image must be in the SBOM.

Section 5.1 in the PDF
pdftotext BSI-TR-03183-2_v2_1_0.pdf - | tr '\n' ' ' | grep -o "MUST contain the same information as available during the build process[^(]*"

Output

MUST contain the same information as available during the build process or equivalent information where the build process does not exist
Section 3.2.1 in the PDF
pdftotext BSI-TR-03183-2_v2_1_0.pdf - | grep -A1 "The component that was used during the execution of the linker"

Output

The component that was used during the execution of the linker MUST be listed, even if alternativecomponents or implementation could have been used.

What is a build SBOM, and which types exist? (8.4)

The appendix distinguishes six kinds of SBOM by the moment they are created. It is explanatory; the requirements are in sections 3 to 5 (section 8). On the Build SBOM it says: “creating a Build SBOM focuses on the linker run for translated code, not the compiler run”. For hash values to identify components unambiguously, reproducible builds are needed (8.4.3).

TypeWhat it is created from
Design SBOMThe planned set of components, which do not have to exist yet.
Source SBOMThe development environment, the source files and their dependencies.
Build SBOMThe build process, for example source files, dependency information, components already created, build process data and other SBOMs.
Analysed SBOMAfter the build, by analysing artefacts such as executables, packages, containers and virtual machine images. Also called “3rd party SBOM”.
Deployed SBOMAn inventory of the software on a system.
Runtime SBOMThe running system, with the components in memory. Also called “Dynamic SBOM”.

How deep must the SBOM go? (5.1, 8.3)

Dependencies are resolved recursively: for each component in the scope of delivery, on each path downward, up to and including the first component outside the scope of delivery. That first component must at least be identified, with creator, name, version and other unique identifiers (3.2.4).

The appendix calls this depth “Delivery item SBOM” (8.3.4). Beside it, it describes the top-level, n-level, transitive and complete SBOM. This goes beyond the CRA, which asks for at least the top-level dependencies.

Several instances of a component with different metadata are listed separately. SBOMs of components may be referenced instead of merged if they themselves match the TR; the provider of the product's SBOM is responsible for their availability (5.1). Each software version gets its own SBOM (3.1).

What stays out of the SBOM?

Vulnerabilities: an SBOM must not contain vulnerability information. A document with both SBOM and vulnerability information does not match the TR (3.1). For that, the TR recommends CSAF, with VEX as a profile (8.1.14).

Signature: the TR writes “Ideally, SBOMs should be digitally signed” (8.1.15). The word is in lower case; per section 2 only the key words in capitals are requirements.

Roles: the TR does not use CRA terms such as economic operator, distributor or importer. Its requirements apply regardless of who implements them (3.2.9).

The TR is written so that conformance can be checked deterministically; tools can flag deviations, the creator of the SBOM decides (3.1).

How do I check an SBOM against the TR by hand?

  1. 1

    Check the format: CycloneDX 1.6 or higher or SPDX 3.0.1 or higher, as JSON or XML.

  2. 2

    Check the SBOM fields: creator with email or URL, and timestamp, in CycloneDX under metadata.manufacturer and metadata.timestamp (table 8).

  3. 3

    Check the ten required fields for each component. In CycloneDX the filename and the three properties are the properties bsi:component:filename, bsi:component:executable, bsi:component:archive and bsi:component:structured.

  4. 4

    Check the hash: SHA-512 of the deployable file.

  5. 5

    Check the depth: every component in the scope of delivery resolved, the first one outside at least identified.

  6. 6

    Move vulnerabilities out: CVE information belongs in a separate document, such as CSAF or VEX.

  7. 7

    Check against the build: is every library the linker took into the image in the SBOM?

Can this run automatically?

Microcontroller builds from Keil MDK, IAR or GNU Arm. It finds the libraries built in, with their versions, for example CMSIS packs, RTX5, FreeRTOS, lwIP, mbedTLS and STM32Cube. Plus hardening (stack canary, MPU, privilege separation) and embedded keys.

SBOM export: CycloneDX 1.6 JSON, SPDX 2.3 and SPDX 3.0.1 JSON, plus CSV. Every component says where in the image it was read.

Every component with an evidenced version is matched against the vulnerability sources and says where in the build it sits. If the binary evidences no version, the field stays blank.

Questions

Is there a German version of TR-03183-2?

Only version 1.0 of 12 July 2023, which the BSI lists as outdated. The current version 2.1.0 of 20 August 2025 is in English.

Is TR-03183-2 mandatory?

Not under the CRA: the CRA requires an SBOM and does not name the TR. The BSI calls it a guide that is not binding or mandatory and cannot be used as presumption of conformity. It describes formats and fields in detail. The Commission may specify format and elements of the CRA's SBOM by implementing acts (Article 13(24)).

Which version of TR-03183-2 is current?

Version 2.1.0 of 20 August 2025, as of 23 October 2026. The preceding version 2.0.0 could still be used for six months after the new one was issued (section 7); that period ended in February 2026.

Is an SBOM in SPDX 2.3 enough?

For a new or updated SBOM it is not: version 2.1.0 requires SPDX 3.0.1 or higher, or CycloneDX 1.6 or higher (section 4). An SBOM that matched the version in force on its delivery date stays valid (section 7).

Does SPDX 3.1 count?

Not yet. The TR admits only officially released versions (section 4), and as of 23 October 2026 SPDX 3.1 exists only as a release candidate.

May the SBOM contain CVEs?

No. Section 3.1 rules out vulnerability information in the SBOM. The TR recommends CSAF for it, with VEX as a profile.

What about a statically linked library without a file of its own?

It is in the SBOM, because the linker used it (3.2.1). Fields that do not exist because of how the component is assembled, such as hash and filename, are left out.

Sources

  1. [1]BSI TR-03183-2, version 2.1.0 (PDF)
  2. [2]BSI: Technical Guideline TR-03183
  3. [3]BSI: CycloneDX property taxonomy for TR-03183
  4. [4]Regulation (EU) 2024/2847, Cyber Resilience Act, Official Journal
  5. [5]CycloneDX: specification
  6. [6]SPDX: specifications

Check your own image

Upload one firmware image, an AXF or a supplier SBOM in your own LegacyMind account. Report and SBOM within three working days, NDA on request. The app and the reports are in German; questions in English are welcome.