What Is SBOM (Software Bill of Materials)
A Software Bill of Materials (SBOM) is a complete, machine-readable inventory of all components in your software. It functions as an ingredient list for code, documenting every library, framework, module, and package that your application depends on, including transitive dependencies.
An SBOM records the component name, version, supplier, license, and cryptographic hash for every dependency in your project. For a typical Node.js application with 150 direct dependencies, the SBOM enumerates 800-1,200 total components, tracing the dependency tree to its full depth.
SBOMs are mandated by US Executive Order 14028 for software vendors selling to the federal government. Beyond compliance, SBOMs are essential for incident response. When Log4Shell (CVE-2021-44228) was disclosed in December 2021, organizations with SBOMs answered "Do we use Log4j?" in seconds. Those without SBOMs spent days or weeks manually auditing code.
Why SBOM Matters: Executive Order 14028
On May 12, 2021, President Biden signed Executive Order 14028 on Improving the Nation's Cybersecurity. Section 4e of the order requires software vendors selling to the US government to provide an SBOM with every product. The requirement stems from supply chain attacks like SolarWinds (2020), where compromised dependencies went undetected because organizations lacked visibility into their software components.
The order does not mandate a specific format but references NTIA Minimum Elements for an SBOM: Supplier Name, Component Name, Version, Dependency Relationships, SBOM Author, and Timestamp. Two formats have emerged as industry standards: SPDX and CycloneDX.
Who Must Comply
The mandate applies to software vendors with government contracts, but compliance is expanding beyond federal procurement. Enterprise buyers increasingly require SBOMs from their vendors, aligning with frameworks like NIST SSDF and the EU Cyber Resilience Act. SBOM is rapidly becoming a baseline expectation for any software product.
Regulatory Context
SBOM requirements appear across multiple regulations:
- NIST SSDF (Secure Software Development Framework): Requires dependency inventory and vulnerability monitoring
- EU Cyber Resilience Act: Mandates transparency on software components for products sold in the EU
- ISO/IEC 5962:2021: Establishes SPDX as an international standard for SBOM
- SOC 2 and FedRAMP: Auditors increasingly request SBOMs as evidence of supply chain controls
SPDX vs CycloneDX Formats
Two SBOM formats dominate the industry: SPDX and CycloneDX. Both are machine-readable, support JSON and XML serialization, and meet NTIA minimum elements. The choice depends on your primary use case.
SPDX (Software Package Data Exchange)
SPDX was created by the Linux Foundation in 2010 and became ISO/IEC 5962:2021 in 2021. It is optimized for license compliance and legal use cases. SPDX includes granular license tracking with support for SPDX License List identifiers, license expressions (AND, OR), and custom license text.
SPDX is preferred by government contractors and organizations with complex licensing requirements. The format is verbose, which increases file size but provides exhaustive metadata.
{
"SPDXID": "SPDXRef-Package-lodash",
"name": "lodash",
"versionInfo": "4.17.21",
"licenseDeclared": "MIT",
"externalRefs": [{
"referenceCategory": "PACKAGE-MANAGER",
"referenceType": "purl",
"referenceLocator": "pkg:npm/lodash@4.17.21"
}]
}
CycloneDX
CycloneDX was created by OWASP in 2017 for security and vulnerability management. It is optimized for DevSecOps workflows, with native support for vulnerability tracking, service definitions, and dependency graphs.
CycloneDX is more compact than SPDX (20-30% smaller file size) and integrates seamlessly with vulnerability databases like OSV.dev and NVD. Security teams prefer CycloneDX because it includes fields for vulnerability identifiers, CVSS scores, and remediation advice directly in the SBOM.
{
"bomFormat": "CycloneDX",
"components": [{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21",
"hashes": [{
"alg": "SHA-256",
"content": "e62a4a3b..."
}]
}],
"dependencies": [{
"ref": "pkg:npm/my-app@1.0.0",
"dependsOn": ["pkg:npm/lodash@4.17.21"]
}]
}
Format Comparison
| Feature | SPDX | CycloneDX |
|---|---|---|
| Primary Use Case | License compliance | Security / DevSecOps |
| Standard Status | ISO/IEC 5962:2021 | OWASP project |
| File Size | Verbose (larger) | Compact (20-30% smaller) |
| Vulnerability Tracking | External integration | Native support |
| Dependency Graph | Relationship annotations | Built-in dependencies block |
| Government Preference | Widely accepted | Growing acceptance |
| Tool Support | Mature (10+ years) | Rapidly expanding |
Which Format to Choose
For government contracts and license compliance, SPDX is the safer choice. For security-focused teams and DevSecOps integration, CycloneDX provides better tooling. Many organizations generate both formats—storage is cheap, and different consumers prefer different formats. CodeSlick generates both SPDX 2.3 and CycloneDX 1.5.
Real-World SBOM Use Cases
1. Vulnerability Response (Log4Shell Example)
When Log4Shell (CVE-2021-44228) was disclosed on December 9, 2021, organizations faced a single question: Do we use Log4j? Those with SBOMs queried their inventory and identified affected systems within minutes. Those without SBOMs spent days manually searching codebases, build artifacts, and Docker images.
# Query SBOM for Log4j usage
grep -r "log4j-core" sboms/*.json
# Results:
api-service.json: log4j-core 2.14.1 (VULNERABLE)
analytics.json: log4j-core 2.12.2 (VULNERABLE)
frontend.json: No match (SAFE)
Organizations with automated SBOM generation and centralized storage answered this question across thousands of services in under an hour. The time saved translates directly to reduced exposure: every hour of investigation is another hour the vulnerability remains exploitable.
2. Supply Chain Attack Detection
When the npm package ua-parser-js was compromised in October 2021 (versions 0.7.29, 0.8.0, 1.0.0), attackers injected cryptominers and password stealers. Organizations monitoring SBOM diffs detected the unauthorized package update immediately:
# SBOM diff between releases
New dependency: malicious-package@1.0.0
Maintainer: unknown-dev (previously: trusted-maintainer)
Published: 2 hours ago (suspiciously recent)
Hash mismatch: Package modified post-publication
Automated SBOM comparison flags changes in maintainers, new dependencies, and hash mismatches—all indicators of supply chain compromise.
3. License Compliance Audit
Organizations that forbid copyleft licenses (GPL, AGPL) due to licensing restrictions can enforce this policy automatically with SBOM queries:
# Find GPL-licensed components
jq '.packages[] | select(.licenseDeclared | contains("GPL"))' sbom.json
# Result:
{
"name": "readline",
"version": "1.3.0",
"licenseDeclared": "GPL-3.0",
"usedBy": ["cli-tool"]
}
Legal teams use SBOMs to generate license reports for compliance audits, M&A due diligence, and open-source policy enforcement.
4. Incident Response and Forensics
When a production compromise is detected, SBOM provides a historical record of every component in every release. Incident responders compare SBOMs across versions to identify when a malicious component was introduced:
# Compare SBOM from compromised release to previous clean release
diff sbom-v1.2.0.json sbom-v1.3.0.json
# Suspicious change:
+ flatmap-stream@0.1.1
Maintainer changed: user1 → user2
New dependency not in previous release
This forensic capability accelerates root cause analysis and scope determination during incident response.
How SBOM Prevents Supply Chain Attacks
SBOM does not prevent attacks directly—it provides the visibility needed to detect them. Supply chain attacks exploit the trust relationship between software and its dependencies. When that trust is breached, detection speed determines impact.
SolarWinds (2020)
Attackers compromised SolarWinds' build system, injecting malware into Orion updates delivered to 18,000 customers. SBOM verification would have flagged the hash mismatch between the expected build artifacts and the compromised versions. Automated SBOM comparison across builds detects unauthorized component injection.
event-stream (npm, 2018)
A malicious maintainer added the dependency flatmap-stream to the popular event-stream package. The new dependency contained cryptocurrency-stealing code. SBOM diff monitoring would have alerted on the new dependency, the maintainer change, and the suspicious package publication timeline.
Dependency Confusion Attacks
Attackers publish malicious packages on public registries with the same names as internal private packages but higher version numbers. Package managers may prefer the public (malicious) version. SBOM comparison across environments detects when a dependency source changes from private to public registry.
The common thread: SBOM provides the baseline for detecting anomalies. Without an inventory of expected components, detecting unexpected components is impossible.
How CodeSlick Generates SBOM
CodeSlick automatically generates SBOM in both SPDX 2.3 and CycloneDX 1.5 formats during every code analysis. The SBOM includes all direct and transitive dependencies for JavaScript (npm, yarn, pnpm), Python (pip, poetry, pipenv), Java (Maven, Gradle), and Go (go.mod).
What CodeSlick SBOM Includes
- Component inventory: Every package name, version, and supplier (npm, PyPI, Maven Central, Go modules)
- Dependency relationships: Complete dependency graph showing which components depend on which others
- Cryptographic hashes: SHA-256 checksums for integrity verification
- License information: SPDX license identifiers for compliance tracking
- Package URLs (purl): Universal identifiers for cross-tool compatibility
- Vulnerability cross-reference: Integration with OSV.dev for known CVEs
SBOM Generation Workflow
Web Tool: Upload code at codeslick.dev/analyze, click Analyze, navigate to SBOM tab, download SPDX or CycloneDX format.
CLI: Run codeslick analyze --format sbom-spdx or --format sbom-cyclonedx to generate SBOM and save to file.
GitHub App: SBOM is generated automatically on every pull request and stored as a build artifact accessible from the PR comment and GitHub Security tab.
SBOM in CI/CD
# GitHub Actions example
- name: Generate SBOM
run: |
npm install -g codeslick-cli
codeslick analyze --format sbom-cyclonedx --output sbom.json
- name: Upload SBOM artifact
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom.json
- name: Check for vulnerable dependencies
run: |
codeslick sbom query --file sbom.json --check-vulnerabilities
SBOM generation completes in under 3 seconds for projects with up to 1,000 dependencies. The output is deterministic: the same codebase produces the same SBOM, enabling reliable diff comparison across builds.
Generate SBOM automatically for your dependencies in SPDX and CycloneDX formats in under 3 seconds.