7.9 KiB
SPDX 3.0.1 Profile Support
Version: Draft Status: Planned Sprint: SPRINT_20260107_004
This document describes StellaOps support for SPDX 3.0.1 and its profile-based model.
Overview
SPDX 3.0.1 introduces a profile-based model that extends the Core specification with domain-specific metadata. StellaOps implements the following profiles:
| Profile | Status | Description | Integration |
|---|---|---|---|
| Core | Planned | Foundation for all elements | Required |
| Software | Planned | Packages, files, snippets | Scanner |
| Lite | Planned | Minimal CI/CD SBOMs | Scanner |
| Build | Planned | Build provenance | Attestor |
| Security | Planned | Vulnerability assessments | VexLens |
| Licensing | Future | License expressions | Policy |
| AI | Future | AI model artifacts | AdvisoryAI |
| Dataset | Future | Dataset metadata | Future |
Current Support
SPDX 2.x (Current)
StellaOps currently supports SPDX 2.2 and 2.3:
- Parsing: Full support via
SpdxParser - Generation: SPDX 2.3 JSON format
- Integration: AirGap importer, Scanner output
SPDX 3.0.1 (Planned)
Full SPDX 3.0.1 support is planned with:
- Parsing: JSON-LD format with profile detection
- Generation: Profile-conformant output
- Integration: Attestor (Build), VexLens (Security)
Profile Details
Core Profile
The Core profile is the foundation for all SPDX 3.0.1 documents.
Key Elements:
Element- Base for all typed elementsRelationship- Links between elementsCreationInfo- Document metadataExternalRef- References to external resourcesExternalIdentifier- PURL, CPE, SWID identifiersIntegrityMethod- Hash verification
Required Fields:
spdxId- Unique IRI identifiercreationInfo- WithspecVersion: "3.0.1"
Software Profile
The Software profile describes software components.
Key Elements:
Package- Software packageFile- Individual fileSnippet- Code snippetSpdxDocument- Document root
Common Properties:
packageVersion- Version stringpackageUrl- PURL (via ExternalIdentifier)downloadLocation- Source URLhomePage- Project homepage
Example:
{
"@type": "software_Package",
"spdxId": "urn:stellaops:spdx:sha256-abc:Package:xyz",
"name": "example-package",
"software_packageVersion": "1.0.0",
"externalIdentifier": [
{
"@type": "ExternalIdentifier",
"externalIdentifierType": "packageUrl",
"identifier": "pkg:npm/example-package@1.0.0"
}
]
}
Lite Profile
The Lite profile provides minimal SBOMs for CI/CD pipelines.
Minimal Required Fields:
spdxIdcreationInfo(created, createdBy, specVersion)namepackageVersion(for packages)downloadLocationORpackageUrl
Use Cases:
- CI/CD pipeline artifacts
- Quick compliance checks
- Lightweight transmission
Build Profile
The Build profile captures build provenance.
Key Element:
Build- Build process information
Properties:
buildType- Build system URIbuildId- Unique build identifierbuildStartTime/buildEndTime- TimingconfigSourceUri- Build configuration sourcesenvironment- Build environmentparameter- Build parameters
Integration with Attestor:
in-toto/SLSA SPDX 3.0.1 Build
----------- ----------------
buildType --> build_buildType
builder.id --> createdBy (Agent)
invocation.config --> build_configSourceUri
materials --> Relationships (GENERATED_FROM)
Security Profile
The Security profile describes vulnerability assessments.
Key Elements:
Vulnerability- CVE/vulnerability referenceVexAffectedVulnAssessmentRelationshipVexNotAffectedVulnAssessmentRelationshipVexFixedVulnAssessmentRelationshipVexUnderInvestigationVulnAssessmentRelationshipCvssV3VulnAssessmentRelationshipEpssVulnAssessmentRelationship
Integration with VexLens:
OpenVEX SPDX 3.0.1 Security
------- -------------------
status: affected --> VexAffectedVulnAssessmentRelationship
status: not_affected --> VexNotAffectedVulnAssessmentRelationship
status: fixed --> VexFixedVulnAssessmentRelationship
justification --> statusNotes
action_statement --> actionStatement
JSON-LD Structure
SPDX 3.0.1 uses JSON-LD format:
{
"@context": "https://spdx.org/rdf/3.0.1/spdx-context.jsonld",
"@graph": [
{
"@type": "SpdxDocument",
"spdxId": "urn:example:doc",
"creationInfo": {
"@type": "CreationInfo",
"specVersion": "3.0.1",
"created": "2026-01-07T12:00:00Z",
"createdBy": ["urn:example:tool:stellaops"],
"profile": [
"https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/core",
"https://spdx.org/rdf/3.0.1/terms/Software/ProfileIdentifierType/software"
]
},
"rootElement": ["urn:example:pkg:root"],
"element": [
"urn:example:pkg:root",
"urn:example:pkg:dep1"
]
},
{
"@type": "software_Package",
"spdxId": "urn:example:pkg:root",
"name": "my-application",
"software_packageVersion": "2.0.0"
}
]
}
API Usage
Scanner SBOM Generation
GET /api/v1/scan/{id}/sbom?format=spdx3&profile=software
Parameters:
| Parameter | Values | Default |
|---|---|---|
format |
spdx3, spdx2, cyclonedx |
spdx2 |
profile |
software, lite |
software |
Attestor Build Profile
GET /api/v1/attestation/{id}?format=spdx3
VexLens Security Profile
GET /api/v1/vex/consensus/{artifact}?format=spdx3
Profile Conformance
Documents declare profile conformance in CreationInfo.profile:
{
"profile": [
"https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/core",
"https://spdx.org/rdf/3.0.1/terms/Software/ProfileIdentifierType/software",
"https://spdx.org/rdf/3.0.1/terms/Security/ProfileIdentifierType/security"
]
}
StellaOps validates documents against declared profiles when:
- Parsing external documents (opt-in validation)
- Generating documents (automatic conformance)
Migration from SPDX 2.x
Parallel Support
During transition, StellaOps supports both formats:
- SPDX 2.x - Default for backward compatibility
- SPDX 3.0.1 - Opt-in via
format=spdx3
Key Differences
| Aspect | SPDX 2.x | SPDX 3.0.1 |
|---|---|---|
| Format | Flat JSON | JSON-LD |
| Version field | spdxVersion |
specVersion in CreationInfo |
| Packages | packages[] array |
@graph with @type |
| Relationships | relationships[] |
Relationship elements in @graph |
| Checksums | checksums[] |
verifiedUsing IntegrityMethod |
| PURL | externalRefs |
externalIdentifier |
Version Detection
StellaOps auto-detects SPDX version:
// 2.x: Has spdxVersion property
if (root.TryGetProperty("spdxVersion", out _))
return SpdxVersion.V2;
// 3.x: Has @context property
if (root.TryGetProperty("@context", out _))
return SpdxVersion.V3;
Air-Gap Considerations
For air-gapped deployments:
- Bundle contexts locally - SPDX JSON-LD contexts must be available offline
- Configure local context URIs - Point to local context files
- Validate offline - Use bundled schemas for validation
# etc/spdx3.yaml
Spdx3:
ContextResolution:
Mode: Local # or Remote, Cached
LocalContextPath: /etc/stellaops/spdx3-contexts/