Skip to content

Commit 5787559

Browse files
rnjudgegoneall
authored andcommitted
Port 2.x Annexes to 3.0 spec
This commit adds two annexes to the 3.0 spec: 1) How to include security information using SPDX-3.0 2) How to comply with various requirements (i.e. NTIA minimums) using SPDX-3.0 Signed-off-by: Rose Judge <[email protected]> Signed-off-by: Karsten Klein <[email protected]>
1 parent 6e7fdd8 commit 5787559

3 files changed

+108
-46
lines changed

docs/annexes/including-security-information-in-SPDX.md

+100-40
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,46 @@
1-
# 1. Including security information in a SPDX document
1+
# Annex G: Including Security Information in a SPDX document
22

3-
SPDX 3.0 has the concept of an [__External Reference__](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Classes/ExternalRef.md) for an Element which points to "a resource outside the scope of the SPDX-3.0 content that provides additional characteristics of an Element."
3+
The flexibility of SPDX 3.0 allows users to either link SBOMs to external security vulnerability data or to embed security vulnerability information in the SPDX 3.0 data format. For more details about the differences, read ["Capturing Software Vulnerability Data in SPDX 3.0"](https://spdx.dev/capturing-software-vulnerability-data-in-spdx-3-0/).
4+
5+
## G.1 External References and External Identifiers
6+
SPDX 3.0 has the concept of an [__External Reference__](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Classes/ExternalRef.md) for an Element which points to a general resource outside the scope of the SPDX-3.0 content that provides additional context or information about an Element.
47

58
The specification for External Reference types has many [type options](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Vocabularies/ExternalRefType.md), a large handful of which pertain specifically to security use cases:
69

7-
* secureSoftwareAttestation: A reference to information assuring that the software is developed using security practices as defined by [NIST SP 800-218 Secure Software Development Framework (SSDF)](https://csrc.nist.gov/publications/detail/sp/800-218/final) or [CISA Secure Software Development Attestation Form](https://www.cisa.gov/sites/default/files/2023-04/secure-software-self-attestation_common-form_508.pdf).
8-
* securityAdvisory: A reference to a published security advisory (where advisory as defined per ISO 29147:2018) that may affect one or more elements, e.g., vendor advisories or specific NVD entries.
9-
* securityAdversaryModel: A reference to the security adversary model for a package.
10-
* securityFix: A reference to the patch or source code that fixes a vulnerability.
11-
* securityOther: A reference to related security information of unspecified type.
12-
* securityPenTestReport: A reference to a [penetration test](https://en.wikipedia.org/wiki/Penetration_test) report for a package.
13-
* securityPolicy: A reference to instructions for reporting newly discovered security vulnerabilities for a package.
14-
* securityThreatModel: A reference the [security threat model](https://en.wikipedia.org/wiki/Threat_model) for a package.
15-
* vulnerabilityDisclosureReport: A reference to a Vulnerability Disclosure Report (VDR) which provides the software supplier's analysis and findings describing the impact (or lack of impact) that reported vulnerabilities have on packages or products in the supplier's SBOM as defined in [NIST SP 800-161](https://csrc.nist.gov/publications/detail/sp/800-161/rev-1/final).
16-
* vulnerabilityExploitabilityAssessment: A reference to a Vulnerability Exploitability eXchange (VEX) statement which provides information on whether a product is impacted by a specific vulnerability in an included package and, if affected, whether there are actions recommended to remediate.
10+
* cwe
11+
* secureSoftwareAttestation
12+
* securityAdvisory
13+
* securityAdversaryModel
14+
* securityFix
15+
* securityOther
16+
* securityPenTestReport
17+
* securityPolicy
18+
* securityThreatModel
19+
* vulnerabilityDisclosureReport
20+
* vulnerabilityExploitabilityAssessment
1721

1822

19-
SPDX 3.0 also has the concept of [__External Identifier__](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Classes/ExternalIdentifier.md) which should be used to "...".
23+
SPDX 3.0 also has the concept of [__External Identifier__](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Classes/ExternalIdentifier.md) which should be used in cases where an identifier scheme exists and is already defined for an Element outside of SPDX-3.0.
2024

2125
There are several External Identifier [types](https://github.com/spdx/spdx-3-model/blob/main/model/Core/Vocabularies/ExternalIdentifierType.md) that may be used in a security context:
2226

23-
* cpe22: https://cpe.mitre.org/files/cpe-specification_2.2.pdf
24-
* cpe23: https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7695.pdf
25-
* cve: An identifier for a specific software flaw defined within the official CVE Dictionary and that conforms to the CVE specification as defined by https://csrc.nist.gov/glossary/term/cve_id.
26-
* securityOther: Used when there is a security related identifier of unspecified type.
27+
* cpe22
28+
* cpe23
29+
* cve
30+
* packageUrl
31+
* securityOther
2732

2833

2934
This section provides usage scenarios of how to leverage the Security External References and External Identifiers specified above to refer to external security information. Examples of how to use each category can be found in the [Security/Classes](https://github.com/spdx/spdx-3-model/tree/main/model/Security/Classes) pages. Multiple instances and types of external security information may be included within a SPDX document.
3035

31-
## 1.1 Linking to an advisory
36+
## G.1.1 Linking to an Advisory
3237

3338
To reference a Common Vulnerabilities and Exposures (CVE) advisory applicable to a package, you must first create a [Vulnerability Element](https://github.com/spdx/spdx-3-model/blob/main/model/Security/Classes/Vulnerability.md). You can then use ExternalIdentifiers or ExternalRefs to supplement the CVE with associated external metadata.
3439

3540
```json
3641
{
3742
"@type": "Vulnerability",
38-
"@id": "urn:spdx.dev:vuln-1",
43+
"@id": "urn:spdx.dev:cve-2020-2849",
3944
"summary": "Use of a Broken or Risky Cryptographic Algorithm",
4045
"description": "The npm package `elliptic` before version 6.5.4 are vulnerable to Cryptographic Issues via the secp256k1 implementation in elliptic/ec/key.js. There is no check to confirm that the public key point passed into the derive function actually exists on the secp256k1 curve. This results in the potential for the private key used in this implementation to be revealed after a number of ECDH operations are performed.",
4146
"modified": "2021-03-08T16:06:43Z",
@@ -53,7 +58,7 @@ To reference a Common Vulnerabilities and Exposures (CVE) advisory applicable to
5358
},
5459
{
5560
"type": "ExternalIdentifier",
56-
"externalIdentifierType": "securityOther",
61+
"externalIdentifierType": "securityAdvisory",
5762
"identifier": "GHSA-r9p9-mrjm-926w",
5863
"identifierLocator": "https://github.com/advisories/GHSA-r9p9-mrjm-926w"
5964
}
@@ -78,15 +83,69 @@ To reference a Common Vulnerabilities and Exposures (CVE) advisory applicable to
7883
}
7984
```
8085

81-
## 1.2 Linking to a CSAF
86+
## G.1.2 Linking to a CSAF Document
87+
88+
To reference [CSAF](https://docs.oasis-open.org/csaf/csaf/v2.0/cs01/csaf-v2.0-cs01.html) formatted security information see below for examples.
89+
90+
### G.1.2.1 Linking to a CSAF VEX
91+
To reference a CSAF VEX document, include an external reference of type `vulnerabilityExploitabilityAssessment` on the Vulnerability Element that encapsulates the CVE described in the CSAF VEX document.
92+
93+
94+
```json
95+
{
96+
"@type": "Vulnerability",
97+
"@id": "urn:spdx.dev:vuln-2",
98+
"name": "cve-2021-44228",
99+
"description": "Apache Log4j2 2.0-beta9 through 2.15.0 (excluding security releases 2.12.2, 2.12.3, and 2.3.1) JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled.",
100+
"modifiedTime": "2021-03-08T16:02:43Z",
101+
"publishedTime": "2021-03-08T16:06:50Z",
102+
"externalIdentifiers": [
103+
{
104+
"@type": "ExternalIdentifier",
105+
"externalIdentifierType": "cve",
106+
"identifier": "CVE-2021-44228",
107+
"identifierLocator": [
108+
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228",
109+
"https://www.cve.org/CVERecord?id=CVE-2021-44228"
110+
],
111+
"issuingAuthority": "urn:spdx.dev:agent-cve.org"
112+
}
113+
]
114+
"externalRefs": [
115+
{
116+
"@type": "ExternalRef",
117+
"externalRefType": "vulnerabilityExploitabilityAssessment",
118+
"locator": "https://github.com/oasis-tcs/csaf/blob/master/csaf_2.0/examples/csaf/csaf_vex/2022-evd-uc-01-a-001.json"
119+
}
120+
]
121+
}
122+
```
123+
124+
### G.1.2.2 Linking to a CSAF Advisory
125+
To reference a CSAF Advisory document, include the document locator as an external reference of type `securityAdvisory` on a Package Element.
126+
127+
```json
128+
{
129+
"@type": "Package",
130+
"@id": "urn:spdx.dev:pkg-rh-open-shift",
131+
"name": "Red Hat OpenShift Enterprise",
132+
"packageVersion": "3.6",
133+
"externalRefs": [
134+
{
135+
"@type": "ExternalRef",
136+
"externalRefType": "securityAdvisory",
137+
"locator": "https://github.com/oasis-tcs/csaf/blob/master/csaf_2.0/examples/csaf/rhsa-2019_1862.json"
138+
}
139+
]
140+
}
141+
```
82142

83-
To reference [CSAF](https://docs.oasis-open.org/csaf/csaf/v2.0/cs01/csaf-v2.0-cs01.html) formatted security information, you would
84-
applicable to a package see the example below.
85143

144+
## G.1.3 Linking to CycloneDX Security Data
86145

87-
## 1.3 Linking to a CycloneDX
146+
To reference to [CycloneDX](https://cyclonedx.org) formatted security information applicable to a package you need to first create a Package Element.
88147

89-
To reference to [CycloneDX](https://cyclonedx.org) formatted security information applicable to a package you need to first create a Package Element. Then use an External Reference to link to the CycloneDX document which contains information about the package.
148+
Using an External Reference, link the package to the matching component in the CycloneDX BOM. Link to it using its [BOM link](https://cyclonedx.org/capabilities/bomlink/), a URN formed by combining the CycloneDX serial number, version and bom-ref which contains the security information about the package.
90149

91150
```json
92151
{
@@ -98,14 +157,13 @@ To reference to [CycloneDX](https://cyclonedx.org) formatted security informatio
98157
{
99158
"@type": "ExternalRef",
100159
"externalRefType": "securityOther",
101-
"locator": "https://raw.githubusercontent.com/CycloneDX/bom-examples/ed522d1f051c364e045b87c20665003a0c4ea777/SBOM/laravel-7.12.0/bom.json"
160+
"locator": "urn:cdx:17cfc349-c637-4685-856c-81196420c7f5/2#componentRef"
102161
}
103162
]
104163
}
105164
```
106165

107-
## 1.4 Linking to an OSV
108-
**TODO: Do we create a vulnerability element from the OSV then use ExternalRef on the vulnerability or do we create a package and reference the OSV from there?**
166+
## G.1.4 Linking to an OSV
109167

110168
To include a reference to [Open Source Vulnerability](https://github.com/google/osv) (OSV) formatted security information applicable to a package you need to first create a Package Element. Then use an External Reference to link to the OSV advisory.
111169

@@ -126,10 +184,10 @@ To include a reference to [Open Source Vulnerability](https://github.com/google/
126184
```
127185

128186

129-
## 1.5 Linking to an OmniBOR (formerly known as GitBOM)
187+
## G.1.5 Linking to an OmniBOR (formerly known as GitBOM)
188+
189+
To identify a Package with an [OmniBOR](https://omnibor.io/) (Universal Bill Of Receipts, formerly known as GitBOM) gitoid, use an External Identifier to add gitoid to the package.
130190

131-
To reference an [OmniBOR](https://omnibor.io/) (Universal Bill Of Receipts) formatted security information applicable to a package you must first create a Package Element. Then use an External Identifier to link to the OmniBOR document.
132-
**TODO: Why do we use External Identifier vs Ref here? and what's the identifier locator? do we want a different example here?**
133191

134192
```json
135193
{
@@ -147,14 +205,14 @@ To reference an [OmniBOR](https://omnibor.io/) (Universal Bill Of Receipts) form
147205
}
148206
```
149207

150-
## 1.6 Linking to a vulnerability disclosure document
208+
## G.1.6 Linking to a vulnerability disclosure document
151209

152-
To express a reference to a vulnerability disclosure document for a package such Cisco’s response to Apache log4j vulnerability. First create a package element, then use an External Reference to refer to the vulnerability disclosure document.
210+
To express a reference to a vulnerability disclosure document for a package, use an External Reference for a Package Element. The example below shows Cisco’s response to Apache log4j vulnerability.
153211

154212
```json
155213
{
156214
"@type": "Package",
157-
"@id": "urn:spdx.dev:apache-log4j",
215+
"@id": "urn:spdx.dev:pkg-apache-log4j",
158216
"name": "log4j",
159217
"packageVersion": "2.14.0",
160218
"externalRefs": [
@@ -187,7 +245,6 @@ To communicate that a package is not vulnerable to a specific vulnerability it i
187245

188246
To refer to a security disclosure feed, such as the security bulletins from [CERT-EU](https://cert.europa.eu), include an External Reference in the package Element.
189247

190-
**TODO: is this on the package element? We also need a new link as current one is invalid**
191248

192249
```json
193250
{
@@ -205,7 +262,7 @@ To refer to a security disclosure feed, such as the security bulletins from [CER
205262
}
206263
```
207264

208-
## 1.7 Linking to a code fix for a security issue
265+
## G.1.7 Linking to a Code Fix for a Security Issue
209266

210267
You can include a reference to a code fix for a security issue applicable to a Package or Vulnerability Element.
211268

@@ -247,7 +304,7 @@ Alternatively, it may also link to a landing page with patches for a variety of
247304
```
248305

249306

250-
## 1.8 Linking to any security related document
307+
## G.1.8 Linking to any Security Related Document
251308

252309
If you want to reference any security information related to a package but cannot or do not wish to specify its kind, use the `securityOther` externalRefType.
253310

@@ -269,10 +326,13 @@ If you want to reference any security information related to a package but canno
269326
```
270327

271328
One can also use it to refer to guidance related to a vulnerability such as CISA guidance for Apache Log4j.
272-
**TODO: Is this still for the pakage element?**
273329

274330
```json
275-
"externalRefs": [
331+
"@type": "Package",
332+
"@id": "urn:spdx.dev:pkg-apache-log4j",
333+
"name": "log4j",
334+
"packageVersion": "2.14.0",
335+
"externalRefs": [
276336
{
277337
"@type": "ExternalRef",
278338
"externalRefType": "securityOther",
@@ -281,7 +341,7 @@ One can also use it to refer to guidance related to a vulnerability such as CISA
281341
]
282342
```
283343

284-
## 1.9 Linking to an SBOM vulnerability report for a Software Product (per NIST Executive Order 14028)
344+
## G.1.9 Linking to a Vulnerability Disclosure Report (VDR)
285345

286346
The National Institute of Standards and Technology (NIST) describes the concept of correlating vulnerability and SBOM information for a software product at the component level in “[Software Security in Supply Chains: Software Bill of Materials (SBOM)](https://www.nist.gov/itl/executive-order-14028-improving-nations-cybersecurity/software-security-supply-chains-software-1)”. Use the External Reference `vulnerabilityDisclosureReport` type to report on vulnerabilities related to the components contained in a software product’s SBOM.
287347

docs/annexes/using-SPDX-to-comply-with-industry-guidance.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Annex F Using SPDX to comply with Norms, Standards and Regulation (Informative)
1+
# Annex F: Using SPDX to comply with Norms, Standards and Regulation (Informative)
22

3-
# F.1 Satisfying NTIA Minimum Elements for an SBOM using SPDX / US Executive Order 14028 <a name="F.1"></a>
3+
## F.1 Satisfying NTIA Minimum Elements for an SBOM using SPDX / US Executive Order 14028 <a name="F.1"></a>
44

55
US Executive Order 14028 in conjunction with the National Telecommunications and Information Administration (NTIA) outlined minimum elements for an SBOM. The minimum elements are detailed in [NTIA's Framing Software Component Transparency: Establishing a Common Software Bill of Maternials](https://www.ntia.gov/files/ntia/publications/framingsbom_20191112.pdf) and [The Minimum Elements for a SBOM](https://www.ntia.doc.gov/files/ntia/publications/sbom_minimum_elements_report.pdf) documents and summarized below:
66

@@ -22,14 +22,14 @@ The SPDX Specification contains fields able to address each of the NTIA minimum
2222
| ----------- | :----------- |
2323
| Author Name | [Core/Classes/CreationInfo.createdBy](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/CreationInfo/) |
2424
| Supplier Name | [Core/Classes/Artifact.suppliedBy ](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Artifact/) |
25-
| Component Name | [Software/Classes/Package.name](https://spdx.github.io/spdx-spec/v3.0/model/Software/Classes/Package/) |
25+
| Component Name | [Software/Classes/Package.name](https://spdx.github.io/spdx-spec/v3.0/model/Software/Classes/Package/) inherited from [Core/Classes/Element.name](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Element/) |
2626
| Version String | [Software/Classes/Package.packageVersion](https://spdx.github.io/spdx-spec/v3.0/model/Software/Classes/Package/) |
27-
| Component Hash | [Core/Classes/Hash](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Hash/) |
28-
| Unique Identifier | [Core/Properties/spdxId](https://spdx.github.io/spdx-spec/v3.0/model/Core/Properties/spdxId/) for SPDX Elements <br>or [Core/Classes/ExternalIdentifier](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/ExternalIdentifier/) for resources outside the scope of SPDX-3.0 content </br> |
27+
| Component Hash | [Core/Classes/Element.verifiedUsing](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Element/) |
28+
| Unique Identifier | [Software/Classes/SoftwareArtifact.contentIdentifier](https://spdx.github.io/spdx-spec/v3.0/model/Software/Classes/SoftwareArtifact/) for SPDX Software Artifacts or [Software/Classes/Package.packageUrl](https://spdx.github.io/spdx-spec/v3.0/model/Software/Classes/Package/) if the packageUrl is considered to be unique,<br>or [Core/Classes/Element.externalIdentifier](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Element/) for resources outside the scope of SPDX-3.0 content </br> |
2929
| Relationship | [Core/Classes/Relationship](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/Relationship/) |
3030
| Timestamp | [Core/Classes/CreationInfo.created](https://spdx.github.io/spdx-spec/v3.0/model/Core/Classes/CreationInfo/) |
3131

32-
# F.2 BSI TR-03183 - Technical Guideline Cyber Resilience Requirements for Manufacturers and Products <a name="F.2"></a>
32+
## F.2 BSI TR-03183 - Technical Guideline Cyber Resilience Requirements for Manufacturers and Products <a name="F.2"></a>
3333

3434
The German BSI is actively propagating its technical guideline in preparation for adopting and detailing the
3535
requirements of the [EU Cyber Resilience Act](https://www.europarl.europa.eu/doceo/document/TA-9-2024-0130_EN.html)

mkdocs.yml

+2
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,12 @@ nav:
305305
- model/Extension/Classes/Extension.md
306306
- annexes:
307307
- 'Diffs from Previous Editions': annexes/diffs-from-previous-editions.md
308+
- 'Including Security Information in SPDX': annexes/including-security-information-in-SPDX.md
308309
- 'RDF Object Model and Identifier Syntax': annexes/RDF-object-model-and-identifier-syntax.md
309310
- 'SPDX License Expressions': annexes/SPDX-license-expressions.md
310311
- 'Using SPDX short identifiers in Source Files': annexes/using-SPDX-short-identifiers-in-source-files.md
311312
- 'Getting started with SPDX 3': annexes/getting-started.md
313+
- 'Using SPDX to comply with norms, standards and regulation': annexes/using-SPDX-to-comply-with-industry-guidance.md
312314
- licenses:
313315
- 'Creative Commons Attribution License 3.0 Unported': licenses/CC-BY-3.0.md
314316
- 'Community Specification License 1.0': licenses/Community-Spec-1.0.md

0 commit comments

Comments
 (0)