Files
wolfssl/scripts/advisory-vex-overlay.schema.json
T
Sameeh Jubran 4ec80d309a feat: SBOM generation and OmniBOR build provenance (CRA compliance)
Add tooling to produce Software Bills of Materials and build provenance
for wolfSSL, supporting EU Cyber Resilience Act (CRA) obligations.

SBOM generation:
- New `make sbom` target producing SPDX 2.3 output with NTIA minimum
  elements, urn:uuid document namespaces, and SPDX LicenseRef compliance.
- Reproducible library discovery across autotools and CMake builds, with
  liboqs recorded as a linked artefact.
- Standalone `scripts/gen-sbom` for embedded / RTOS / custom-builder
  flows that do not use the main build system, plus --srcs-file,
  --no-artifact-hash, and hash-source options.

Build provenance (OmniBOR / bomsh):
- End-to-end bomsh tracing of the built binaries with ArtifactID
  insertion, snapshotting the traced library before libtool relink and
  hashing the bomsh-traced binary.
- `scripts/bomsh_verify.py` to validate provenance against the traced
  gitoid.

Security advisories:
- `scripts/gen-advisory` generating CSAF 2.0 and CycloneDX VEX, with a
  `make` target, VEX overlay schema/example, and CWE name data.

Docs, tests, and CI:
- doc/SBOM.md and doc/CRA.md, plus README/INSTALL updates.
- Unit and regression tests for gen-sbom and gen-advisory.
- New sbom.yml and advisory.yml workflows: SPDX validation via
  pyspdxtools, CSAF validation, bomsh provenance verification, SBOM
  artifact archiving, macOS coverage, and actions pinned to SHAs.

Signed-off-by: Sameeh Jubran <sameeh@wolfssl.com>
2026-07-23 21:51:26 -07:00

119 lines
4.3 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://www.wolfssl.com/schema/advisory-vex-overlay-1.json",
"title": "wolfSSL gen-advisory VEX overlay",
"description": "Human-authored VEX determinations keyed by CVE id, consumed by scripts/gen-advisory. The CVE Program record supplies the structural facts (CWE/CVSS/affected ranges); this overlay supplies what the record cannot express in machine-readable form. Enum values mirror the CycloneDX 1.6 vulnerability analysis vocabulary so the same terms map cleanly into both the CSAF and CycloneDX VEX outputs.",
"type": "object",
"properties": {
"_comment": {
"type": "string",
"description": "Free-text note ignored by gen-advisory."
}
},
"patternProperties": {
"^CVE-[0-9]{4}-[0-9]{4,}$": { "$ref": "#/$defs/overlayEntry" }
},
"additionalProperties": false,
"$defs": {
"analysisState": {
"type": "string",
"description": "CycloneDX 1.6 vulnerability analysis state.",
"enum": [
"resolved",
"resolved_with_pedigree",
"exploitable",
"in_triage",
"false_positive",
"not_affected"
]
},
"justification": {
"type": "string",
"description": "CycloneDX 1.6 impact analysis justification (required by gen-advisory when state is not_affected so a CSAF flag can be emitted).",
"enum": [
"code_not_present",
"code_not_reachable",
"requires_configuration",
"requires_dependency",
"requires_environment",
"protected_by_compiler",
"protected_at_perimeter",
"protected_at_runtime",
"protected_by_mitigating_control"
]
},
"response": {
"type": "array",
"description": "CycloneDX 1.6 vulnerability analysis response.",
"items": {
"type": "string",
"enum": [
"can_not_fix",
"will_not_fix",
"update",
"rollback",
"workaround_available"
]
}
},
"versionList": {
"type": "array",
"items": { "type": "string", "minLength": 1 },
"minItems": 1
},
"fips": {
"type": "object",
"description": "Optional separately-modelled FIPS product entry. FIPS customers cannot freely upgrade and many CVEs fall outside the validated module boundary, so FIPS is modelled as its own product with its own status and remediation.",
"properties": {
"name": { "type": "string", "minLength": 1 },
"module_version": { "type": "string", "minLength": 1 },
"cmvp_cert": {
"type": "string",
"minLength": 1,
"description": "CMVP certificate number, recorded as a CSAF model_number / CycloneDX property."
},
"status": { "$ref": "#/$defs/analysisState" },
"justification": { "$ref": "#/$defs/justification" },
"fixed_versions": { "$ref": "#/$defs/versionList" },
"remediation": { "type": "string", "minLength": 1 }
},
"additionalProperties": false,
"allOf": [
{
"if": { "properties": { "status": { "const": "not_affected" } }, "required": ["status"] },
"then": { "required": ["justification"] }
}
]
},
"overlayEntry": {
"type": "object",
"properties": {
"state": { "$ref": "#/$defs/analysisState" },
"justification": { "$ref": "#/$defs/justification" },
"response": { "$ref": "#/$defs/response" },
"detail": { "type": "string" },
"fixed_versions": { "$ref": "#/$defs/versionList" },
"remediation": { "type": "string", "minLength": 1 },
"requires_defines": {
"type": "array",
"items": { "type": "string", "minLength": 1 },
"description": "Build flags that gate the vulnerable code. Recorded as an informational note only; gen-advisory does NOT compute per-build reachability."
},
"default_status": {
"type": "string",
"enum": ["on", "off", "enabled", "disabled"]
},
"fips": { "$ref": "#/$defs/fips" }
},
"required": ["state"],
"additionalProperties": false,
"allOf": [
{
"if": { "properties": { "state": { "const": "not_affected" } }, "required": ["state"] },
"then": { "required": ["justification"] }
}
]
}
}
}