@mitre/hdf-schema 3.7.2 → 3.8.0-next.42532249979.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-evidence-package/v3.7.0",
3
+ "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-evidence-package/v3.8.0",
4
4
  "title": "HDF Evidence Package",
5
5
  "description": "Bundles references to all HDF documents for audit, authorization, and compliance review. Each content entry references a document by type, URI, and checksum for integrity verification.",
6
6
  "type": "object",
@@ -13,7 +13,7 @@
13
13
  "externalReferences": {
14
14
  "type": "array",
15
15
  "items": {
16
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
16
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
17
17
  },
18
18
  "description": "Optional references to external artifacts relevant to this evidence package (CTI/STIX, BOMs, advisories, or any URI-addressable artifact) beyond the document references it already carries. Inert context; see External_Reference."
19
19
  },
@@ -41,7 +41,7 @@
41
41
  "description": "URI to the hdf-plan document that drove this assessment. Used for completeness verification — every baseline in the plan should have a corresponding results document in this package."
42
42
  },
43
43
  "preparedBy": {
44
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
44
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
45
45
  "description": "Identity of who prepared this evidence package."
46
46
  },
47
47
  "preparedAt": {
@@ -69,7 +69,7 @@
69
69
  "description": "Summary of assessment completeness and compliance status."
70
70
  },
71
71
  "signature": {
72
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
72
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
73
73
  "description": "Digital signature covering the entire evidence package."
74
74
  },
75
75
  "labels": {
@@ -80,7 +80,7 @@
80
80
  "description": "Optional key-value labels for grouping and querying evidence packages."
81
81
  },
82
82
  "integrity": {
83
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Integrity",
83
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Integrity",
84
84
  "description": "Cryptographic integrity information for verifying this evidence package has not been tampered with."
85
85
  },
86
86
  "version": {
@@ -88,8 +88,12 @@
88
88
  "description": "Version of this evidence package."
89
89
  },
90
90
  "generator": {
91
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Generator",
91
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Generator",
92
92
  "description": "Information about the tool that generated this document."
93
+ },
94
+ "extensions": {
95
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Extensions",
96
+ "description": "Producer data outside the HDF model, and the pre-converted source artifact(s) this package was assembled from."
93
97
  }
94
98
  },
95
99
  "$defs": {
@@ -108,6 +112,7 @@
108
112
  "title": "Content Type"
109
113
  },
110
114
  "Content_Reference": {
115
+ "$comment": "Examples, in order: 1) the system document at the package root; 2) a results document with a per-entry description; 3) a BOM in a subdirectory, which also shows that checksum is optional. Every example uri is package-relative on purpose — an earlier one was an absolute https URL, which demonstrated a package the tooling refuses to resolve. A remote artifact belongs in externalEvidence[].",
111
116
  "type": "object",
112
117
  "unevaluatedProperties": false,
113
118
  "required": [
@@ -122,10 +127,10 @@
122
127
  "uri": {
123
128
  "type": "string",
124
129
  "format": "uri-reference",
125
- "description": "URI to the document. Can be a relative path or absolute URL."
130
+ "description": "A uri-reference whose DECODED form is a path relative to the package document's own directory — that is what the reference MEANS, independently of any one consumer. Percent-escapes are part of the encoding, not the name: `my%20scans/q4.json` and `my scans/q4.json` name the same file, and the escaped spelling is the one this field's format admits. A consumer decodes before it resolves, never after, because decoding can produce a parent traversal that containment must then see. It is never fetched: there is no network retrieval anywhere in evidence handling. `uri-reference` admits shapes other than a relative path and they stay schema-valid; how a consumer resolves one, and what it does when it cannot, is that consumer's own contract. An artifact deliberately held elsewhere belongs in externalEvidence[], which references it by URI and checksum without retrieving it."
126
131
  },
127
132
  "checksum": {
128
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
133
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
129
134
  "description": "Cryptographic checksum for verifying the referenced document's integrity."
130
135
  },
131
136
  "description": {
@@ -158,7 +163,7 @@
158
163
  },
159
164
  {
160
165
  "type": "bom",
161
- "uri": "https://artifacts.agency.gov/sbom/webtier.cdx.json",
166
+ "uri": "boms/webtier.cdx.json",
162
167
  "description": "WebTier CycloneDX SBOM (bomType=sbom)"
163
168
  }
164
169
  ],
@@ -242,7 +247,7 @@
242
247
  "description": "The native format discriminator of the referenced artifact."
243
248
  },
244
249
  "checksum": {
245
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
250
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
246
251
  "description": "Cryptographic checksum of the referenced artifact for integrity verification.",
247
252
  "$comment": "Strongly recommended for external evidence — a point-in-time reference without an integrity hash is weakly auditable. Kept out of `description` so this usage-specific note does not aggregate into the shared Checksum type's generated Go doc comment (quicktype concatenates $ref-sibling descriptions onto the referenced type)."
248
253
  },
@@ -357,16 +362,16 @@
357
362
  "description": "Informational summary of assessment completeness. Not authoritative — tools should compute these from the referenced documents.",
358
363
  "title": "Completeness Check"
359
364
  },
360
- "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0": {
365
+ "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0": {
361
366
  "$schema": "https://json-schema.org/draft/2020-12/schema",
362
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0",
367
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0",
363
368
  "title": "HDF Common Primitives",
364
369
  "description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
365
370
  "$defs": {
366
371
  "External_Reference": {
367
372
  "type": "object",
368
373
  "title": "External Reference",
369
- "description": "A generalized reference to any external artifact by identity and/or location, modeled on the STIX 2.1 `external_references` common property.\n\nPurpose-agnostic: cite a CVE, an ATT&CK technique, a STIX bundle/object, a BOM, a runbook, or any vendor artifact — including kinds with no dedicated HDF reference category.\n\n`sourceName` names the system; `externalId` cites by id within that system; `href` locates it. `sourceName` + `externalId` is equivalently a URN (`urn:<sourceName>:<externalId>`, RFC 8141), so the by-identity and by-location forms stay interconvertible.\n\nA reference is inert context: it overrides nothing, so it carries only lightweight optional `addedBy`/`addedAt` attribution, never override machinery.",
374
+ "description": "A generalized reference to any external artifact by identity and/or location, modeled on the STIX 2.1 `external_references` common property.\n\nPurpose-agnostic: cite a CVE, an ATT&CK technique, a STIX bundle/object, a BOM, a runbook, or any vendor artifact — including kinds with no dedicated HDF reference category.\n\n`sourceName` names the system; `externalId` cites by id within that system; `href` locates it. `sourceName` + `externalId` is equivalently a URN (`urn:<sourceName>:<externalId>`, RFC 8141), so the by-identity and by-location forms stay interconvertible.\n\nAn entry may also carry the artifact itself rather than point at it: `document` for a JSON object, `content` + `encoding` for anything else. Embedding satisfies the at-least-one rule on its own, so an artifact with no meaningful public location needs no synthetic `href`.\n\nA reference is inert context: it overrides nothing, so it carries only lightweight optional `addedBy`/`addedAt` attribution, never override machinery.",
370
375
  "required": [
371
376
  "sourceName"
372
377
  ],
@@ -385,6 +390,42 @@
385
390
  "required": [
386
391
  "description"
387
392
  ]
393
+ },
394
+ {
395
+ "required": [
396
+ "content"
397
+ ]
398
+ },
399
+ {
400
+ "required": [
401
+ "document"
402
+ ]
403
+ }
404
+ ],
405
+ "allOf": [
406
+ {
407
+ "if": {
408
+ "required": [
409
+ "content"
410
+ ]
411
+ },
412
+ "then": {
413
+ "required": [
414
+ "encoding"
415
+ ]
416
+ }
417
+ },
418
+ {
419
+ "if": {
420
+ "required": [
421
+ "encoding"
422
+ ]
423
+ },
424
+ "then": {
425
+ "required": [
426
+ "content"
427
+ ]
428
+ }
388
429
  }
389
430
  ],
390
431
  "properties": {
@@ -400,7 +441,7 @@
400
441
  "href": {
401
442
  "type": "string",
402
443
  "format": "uri-reference",
403
- "description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs. `checksum`/`mediaType` apply only to a retrievable `href`."
444
+ "description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs. Set it only when the location is meaningful to a reader — never a producer's local filesystem path."
404
445
  },
405
446
  "description": {
406
447
  "type": "string",
@@ -412,11 +453,11 @@
412
453
  },
413
454
  "mediaType": {
414
455
  "type": "string",
415
- "description": "IANA media type of the referenced artifact when retrievable (RFC 6838), e.g., 'application/json'. Meaningful only with `href`."
456
+ "description": "IANA media type of the artifact (RFC 6838), e.g., 'application/json', 'application/xml', 'text/csv'. Applies both to an artifact retrievable at `href` and to one embedded here in `content` or `document`."
416
457
  },
417
458
  "checksum": {
418
459
  "$ref": "#/$defs/Checksum",
419
- "description": "Integrity hash of the referenced artifact. Reuses the HDF `Checksum` primitive (not STIX `hashes`). Meaningful only with a retrievable `href`."
460
+ "description": "Integrity hash of the artifact. Reuses the HDF `Checksum` primitive (not STIX `hashes`). Applies both to an artifact retrievable at `href` and to one embedded here in `content` or `document` — beside embedded bytes it is what makes the copy verifiable rather than merely present."
420
461
  },
421
462
  "addedBy": {
422
463
  "$ref": "#/$defs/Identity",
@@ -435,11 +476,24 @@
435
476
  "document": {
436
477
  "type": "object",
437
478
  "additionalProperties": true,
438
- "description": "Optional lossless embedded copy of the referenced artifact — the raw STIX object, EPSS record, advisory, or annotation payload — preserved verbatim.\n\nComposes with `href`/`externalId` (which point at the artifact) and `checksum` (which ties the copy to the source): a single entry can both point and embed.\n\nHDF stays payload-agnostic — the content is carried untouched, never normalized into HDF fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged)."
479
+ "description": "Optional lossless embedded copy of the referenced artifact as a JSON object — the raw STIX object, EPSS record, advisory, or annotation payload — preserved verbatim.\n\nJSON objects only. An artifact that is not a JSON object (XML, CSV, NDJSON, plain text, a JSON array, or bytes that are not text at all) embeds through `content` + `encoding` instead.\n\nComposes with `href`/`externalId` (which point at the artifact) and `checksum` (which ties the copy to the source): a single entry can both point and embed.\n\nHDF stays payload-agnostic — the content is carried untouched, never normalized into HDF fields — so this does not duplicate the source ontology (e.g. STIX rides here unchanged)."
480
+ },
481
+ "content": {
482
+ "type": "string",
483
+ "description": "Optional lossless embedded copy of the artifact's bytes as a string, for artifacts `document` cannot hold: XML, CSV, NDJSON, plain text, a JSON array, or bytes that are not valid UTF-8 text at all.\n\n`encoding` states how to read it back and is required alongside it. Set `mediaType` so a consumer knows what the bytes are, and `checksum` so the copy can be verified against the source.\n\nCarried verbatim — never reformatted, re-indented, or re-serialized."
484
+ },
485
+ "encoding": {
486
+ "type": "string",
487
+ "title": "External Reference Encoding",
488
+ "enum": [
489
+ "utf-8",
490
+ "base64"
491
+ ],
492
+ "description": "How to read `content` back into the artifact's bytes. 'utf-8' for text (XML, CSV, NDJSON, plain text, JavaScript-wrapped JSON); 'base64' for anything that is not valid UTF-8 text.\n\nRequired whenever `content` is present, and meaningless without it — an embedded copy whose encoding a consumer has to guess is not lossless."
439
493
  }
440
494
  },
441
495
  "unevaluatedProperties": false,
442
- "$comment": "Examples, in order: 1) By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228; 2) By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL; 3) By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution; 4) Enrichment envelope: a STIX threat-intel object embedded losslessly in `document` and classified via `kind`, cited by id and pointed at by href — the pointer and the embedded copy compose. The payload rides verbatim; HDF does not normalize STIX fields.",
496
+ "$comment": "Examples, in order: 1) By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228; 2) By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL; 3) By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution; 4) Enrichment envelope: a STIX threat-intel object embedded losslessly in `document` and classified via `kind`, cited by id and pointed at by href — the pointer and the embedded copy compose. The payload rides verbatim; HDF does not normalize STIX fields; 5) Embed-only, text: an XCCDF results file carried in `content` as utf-8 with its media type and checksum, and no `href` at all — the artifact was read from a local file whose path means nothing to a reader; 6) Embed-only, non-text: a Fortify FPR (a zip) carried in `content` as base64, the case `document` and utf-8 both fail.",
443
497
  "examples": [
444
498
  {
445
499
  "sourceName": "cve",
@@ -485,6 +539,28 @@
485
539
  }
486
540
  ]
487
541
  }
542
+ },
543
+ {
544
+ "sourceName": "openscap",
545
+ "rel": "raw-source",
546
+ "mediaType": "application/xml",
547
+ "encoding": "utf-8",
548
+ "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Benchmark xmlns=\"http://checklists.nist.gov/xccdf/1.2\" id=\"xccdf_org.ssgproject.content_benchmark_RHEL-9\">\n <TestResult id=\"xccdf_org.open-scap_testresult_default-profile\" start-time=\"2026-09-27T12:00:00+00:00\" end-time=\"2026-09-27T12:04:11+00:00\">\n <rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n </rule-result>\n </TestResult>\n</Benchmark>",
549
+ "checksum": {
550
+ "algorithm": "sha256",
551
+ "value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
552
+ }
553
+ },
554
+ {
555
+ "sourceName": "fortify",
556
+ "rel": "raw-source",
557
+ "mediaType": "application/zip",
558
+ "encoding": "base64",
559
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
560
+ "checksum": {
561
+ "algorithm": "sha256",
562
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
563
+ }
488
564
  }
489
565
  ]
490
566
  },
@@ -496,7 +572,7 @@
496
572
  "sha512",
497
573
  "blake3"
498
574
  ],
499
- "description": "Supported cryptographic hash algorithms for checksums and integrity verification. blake3 covers container-image and other artifact digests that use it.",
575
+ "description": "Cryptographic hash algorithms a checksum or integrity record may name. blake3 covers container-image and other artifact digests that use it. HDF tooling verifies every algorithm in this enum, so any of them may be recorded where the checksum needs to be verifiable.",
500
576
  "title": "Hash Algorithm"
501
577
  },
502
578
  "Requirement_Group": {
@@ -654,7 +730,33 @@
654
730
  }
655
731
  ],
656
732
  "description": "A reference to an external document.",
657
- "title": "Reference"
733
+ "title": "Reference",
734
+ "unevaluatedProperties": false,
735
+ "$comment": "Examples, in order: 1) By-locator: a plain URL, the commonest form by far in practice; 2) By-name: a human-meaningful citation with no locator, as InSpec's `ref 'title'` emits; 3) Both together, since this is an anyOf rather than a oneOf; 4) The ref-as-array form, whose items are deliberately open so a source format's own reference record can be carried verbatim — XCCDF's DPMS target identifiers reach HDF this way; 5) uri, accepted as a synonym of url for documents that spell it that way. The object itself is CLOSED: a member none of the three branches declares is rejected. The openness that matters here is one level down, on the items of the ref array, and it is declared there explicitly. This primitive predates External_Reference, which is the STIX-aligned type a new converter should reach for; refs survives because it is InSpec-inherited and HDF consumes InSpec output.",
736
+ "examples": [
737
+ {
738
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
739
+ },
740
+ {
741
+ "ref": "NIST SP 800-53 Rev 5, AC-6"
742
+ },
743
+ {
744
+ "ref": "CIS Benchmark for RHEL 9, 1.1.1",
745
+ "url": "https://www.cisecurity.org/benchmark/red_hat_linux"
746
+ },
747
+ {
748
+ "ref": [
749
+ {
750
+ "identifier": "2921",
751
+ "publisher": "DISA",
752
+ "type": "DPMS Target"
753
+ }
754
+ ]
755
+ },
756
+ {
757
+ "uri": "https://attack.mitre.org/techniques/T1059/"
758
+ }
759
+ ]
658
760
  },
659
761
  "Source_Location": {
660
762
  "type": "object",
@@ -1468,12 +1570,183 @@
1468
1570
  }
1469
1571
  }
1470
1572
  },
1471
- "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0": {
1573
+ "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
1472
1574
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1473
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0",
1575
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
1474
1576
  "title": "HDF Extension Primitives",
1475
- "description": "Extension types for waivers, attestations, generators, and integrity.",
1577
+ "description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
1476
1578
  "$defs": {
1579
+ "Raw_Source_Artifact": {
1580
+ "allOf": [
1581
+ {
1582
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
1583
+ },
1584
+ {
1585
+ "not": {
1586
+ "required": [
1587
+ "document"
1588
+ ]
1589
+ }
1590
+ },
1591
+ {
1592
+ "if": {
1593
+ "required": [
1594
+ "content"
1595
+ ]
1596
+ },
1597
+ "then": {
1598
+ "required": [
1599
+ "encoding",
1600
+ "mediaType"
1601
+ ]
1602
+ }
1603
+ }
1604
+ ],
1605
+ "description": "One artifact exactly as a converter received it, before conversion.\n\nAn External_Reference used for a single purpose, so the same primitive both points and embeds: `sourceName` names the producing tool; `content` + `encoding` carry the bytes; `checksum` is of the exact bytes the converter read; `rel` is 'raw-source'; `href` appears only when the caller supplied a location that means something to a reader, never a producer's local filesystem path.\n\nBYTES, NOT A PARSED COPY. `document` is forbidden here, enforced by the schema rather than described: it holds a parsed JSON object, so embedding through it discards the original whitespace, key order, duplicate keys and trailing bytes — which makes the artifact unreconstructable and the checksum unverifiable against what is stored. A JSON input carries as a `content` string like every other input. This is deliberately stricter than HDF v2, whose `passthrough.raw` held a parsed structure in every converter but one, and which for XML inputs stored a reshaped object whose keys could collide.\n\n`mediaType` is REQUIRED on an entry that embeds — bytes whose type a consumer has to infer are not carriage. It is derived from the converter's declared input family (json → application/json, xml → application/xml, text → text/plain) and overridden by converters that know their bytes more precisely (CSV, NDJSON, JavaScript-wrapped JSON).\n\nAn entry that only points at a location may omit `mediaType`, `content` and `encoding`.",
1606
+ "$comment": "Examples, in order: 1) JSON input embedded as a utf-8 `content` string — the common case, and note it is NOT a parsed object; 2) XML input, which `document` never could have held; 3) CSV input, where `mediaType` overrides the 'text' input family's derived text/plain; 4) non-text input (a Fortify FPR zip) embedded as base64; 5) by-reference only: a scan retrievable at a meaningful URL, with no embedded copy and therefore no required mediaType, encoding or content.",
1607
+ "examples": [
1608
+ {
1609
+ "sourceName": "grype",
1610
+ "rel": "raw-source",
1611
+ "mediaType": "application/json",
1612
+ "encoding": "utf-8",
1613
+ "content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
1614
+ "checksum": {
1615
+ "algorithm": "sha256",
1616
+ "value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
1617
+ }
1618
+ },
1619
+ {
1620
+ "sourceName": "openscap",
1621
+ "rel": "raw-source",
1622
+ "mediaType": "application/xml",
1623
+ "encoding": "utf-8",
1624
+ "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Benchmark xmlns=\"http://checklists.nist.gov/xccdf/1.2\" id=\"xccdf_org.ssgproject.content_benchmark_RHEL-9\">\n <TestResult id=\"xccdf_org.open-scap_testresult_default-profile\" start-time=\"2026-09-27T12:00:00+00:00\" end-time=\"2026-09-27T12:04:11+00:00\">\n <rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n </rule-result>\n </TestResult>\n</Benchmark>",
1625
+ "checksum": {
1626
+ "algorithm": "sha256",
1627
+ "value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
1628
+ }
1629
+ },
1630
+ {
1631
+ "sourceName": "prisma",
1632
+ "rel": "raw-source",
1633
+ "mediaType": "text/csv",
1634
+ "encoding": "utf-8",
1635
+ "content": "Hostname,Distro,CVE ID,Compliance ID,Type,Severity,Packages,Source Package,Package Version\nhost-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1\n",
1636
+ "checksum": {
1637
+ "algorithm": "sha256",
1638
+ "value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
1639
+ }
1640
+ },
1641
+ {
1642
+ "sourceName": "fortify",
1643
+ "rel": "raw-source",
1644
+ "mediaType": "application/zip",
1645
+ "encoding": "base64",
1646
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
1647
+ "checksum": {
1648
+ "algorithm": "sha256",
1649
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
1650
+ }
1651
+ },
1652
+ {
1653
+ "sourceName": "nessus",
1654
+ "rel": "raw-source",
1655
+ "href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
1656
+ "mediaType": "application/xml",
1657
+ "checksum": {
1658
+ "algorithm": "sha256",
1659
+ "value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
1660
+ }
1661
+ }
1662
+ ]
1663
+ },
1664
+ "Extensions": {
1665
+ "type": "object",
1666
+ "additionalProperties": false,
1667
+ "properties": {
1668
+ "passthrough": {
1669
+ "type": "object",
1670
+ "additionalProperties": true,
1671
+ "description": "Catch-all for producer data that HDF does not model — the role heimdall2's `passthrough.auxiliary_data` played: fields a converter deliberately carried but had no home for.\n\nDeliberately permissive: unenumerated properties are accepted by design, with no shape imposed on them. HDF neither reads nor interprets what is here. It is the ONLY permissive surface in `extensions` — everything HDF does not define belongs here rather than beside it.\n\nThis is NOT where the pre-converted source artifact goes. v2 put it here only because nothing else had room; `rawSourceArtifacts` is its home now, and it gives the bytes a checksum, a media type and a reference contract that an untyped object cannot.\n\nFor data that belongs to one requirement rather than to the document, use that object's own fields — a document-level bag cannot say which requirement it describes.",
1672
+ "examples": [
1673
+ {
1674
+ "auxiliary_data": [
1675
+ {
1676
+ "name": "Scoutsuite",
1677
+ "data": {
1678
+ "last_run": {
1679
+ "ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
1680
+ }
1681
+ }
1682
+ }
1683
+ ]
1684
+ },
1685
+ {
1686
+ "audit": {
1687
+ "runId": "r-123"
1688
+ }
1689
+ }
1690
+ ],
1691
+ "$comment": "Examples, in order: 1) heimdall2's auxiliary_data shape, the data a v2 mapper carried with nowhere else to put it; 2) the legacy top-level `passthrough` an HDF document arrived with, relocated here verbatim by the SAF-supplement normalizer."
1692
+ },
1693
+ "rawSourceArtifacts": {
1694
+ "type": "array",
1695
+ "items": {
1696
+ "$ref": "#/$defs/Raw_Source_Artifact"
1697
+ },
1698
+ "description": "The input(s) this document was converted from, verbatim.\n\nAn array because a conversion can consume more than one artifact — the OSCAL profile path takes a profile and a catalog. Every other converter takes one input, and an array of one costs nothing.\n\nPopulating this is required of ingest converters by policy, enforced by the converter contract and test harness rather than by a schema `required`: a tool that emits HDF natively has no source artifact, and requiring the field would make valid native HDF invalid."
1699
+ }
1700
+ },
1701
+ "title": "Extensions",
1702
+ "description": "Carrier for data outside the HDF model: `passthrough` for producer data HDF does not model, `rawSourceArtifacts` for the pre-converted input(s).\n\nCLOSED: these two members are the whole of it. A key HDF does not define goes inside `passthrough` — that is what `passthrough` is for — so `extensions` never becomes a second, unnamed schema that consumers must reverse-engineer from the producers that happen to write it.\n\nClosed with `additionalProperties` rather than the house `unevaluatedProperties` because this definition composes nothing, and the shipped Go validator is a draft-07 engine that does not implement `unevaluatedProperties` — a closure only one of the two validators enforces is not a closure.\n\nDeclared on every HDF document type that carries a producer envelope (`generator` / `integrity`), and on `Evaluated_Baseline`, so one rule governs both sites.",
1703
+ "$comment": "Examples, in order: 1) the whole contract in one object — a converter's input embedded beside the producer data it could not map; 2) carriage alone, the shape a converter emits when it has nothing homeless to record.",
1704
+ "examples": [
1705
+ {
1706
+ "passthrough": {
1707
+ "auxiliary_data": [
1708
+ {
1709
+ "name": "Grype",
1710
+ "data": {
1711
+ "descriptor": {
1712
+ "name": "grype",
1713
+ "version": "0.74.0"
1714
+ }
1715
+ }
1716
+ }
1717
+ ]
1718
+ },
1719
+ "rawSourceArtifacts": [
1720
+ {
1721
+ "sourceName": "grype",
1722
+ "rel": "raw-source",
1723
+ "mediaType": "application/json",
1724
+ "encoding": "utf-8",
1725
+ "content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
1726
+ "checksum": {
1727
+ "algorithm": "sha256",
1728
+ "value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
1729
+ }
1730
+ }
1731
+ ]
1732
+ },
1733
+ {
1734
+ "rawSourceArtifacts": [
1735
+ {
1736
+ "sourceName": "fortify",
1737
+ "rel": "raw-source",
1738
+ "mediaType": "application/zip",
1739
+ "encoding": "base64",
1740
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
1741
+ "checksum": {
1742
+ "algorithm": "sha256",
1743
+ "value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
1744
+ }
1745
+ }
1746
+ ]
1747
+ }
1748
+ ]
1749
+ },
1477
1750
  "Status_Override": {
1478
1751
  "type": "object",
1479
1752
  "unevaluatedProperties": false,
@@ -1500,20 +1773,20 @@
1500
1773
  "externalReferences": {
1501
1774
  "type": "array",
1502
1775
  "items": {
1503
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1776
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
1504
1777
  },
1505
1778
  "description": "Optional references to the external artifacts behind this override (e.g. the STIX bundle/object or CTI feed motivating an E:A riskAdjustment). Inert context distinct from `evidence`; see External_Reference. Symmetric with Standalone_Override.externalReferences for the inline (results-embedded) override carrier."
1506
1779
  },
1507
1780
  "type": {
1508
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Override_Type",
1781
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
1509
1782
  "description": "The type of override applied to this requirement."
1510
1783
  },
1511
1784
  "status": {
1512
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
1785
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
1513
1786
  "description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
1514
1787
  },
1515
1788
  "impact": {
1516
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Impact_Override",
1789
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
1517
1790
  "description": "Override to the requirement's impact score. At least one of status or impact must be set."
1518
1791
  },
1519
1792
  "reason": {
@@ -1521,7 +1794,7 @@
1521
1794
  "description": "Explanation for why this override was applied."
1522
1795
  },
1523
1796
  "appliedBy": {
1524
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1797
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
1525
1798
  "description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
1526
1799
  },
1527
1800
  "appliedAt": {
@@ -1535,27 +1808,27 @@
1535
1808
  "description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
1536
1809
  },
1537
1810
  "signature": {
1538
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1811
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
1539
1812
  "description": "Optional digital signature for enhanced trust and non-repudiation. Supports hardware security tokens (PKCS#11/PKCS#12), Yubikeys, GPG keys, passkeys, and other signing methods."
1540
1813
  },
1541
1814
  "evidence": {
1542
1815
  "type": "array",
1543
1816
  "items": {
1544
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1817
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
1545
1818
  },
1546
1819
  "description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
1547
1820
  },
1548
1821
  "previousChecksum": {
1549
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1822
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
1550
1823
  "description": "SHA-256 checksum of the previous amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment on a requirement."
1551
1824
  },
1552
1825
  "cvss": {
1553
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
1826
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
1554
1827
  "$comment": "When present alongside impact.value on a riskAdjustment override, impact.value should be approximately cvss.computedScore / 10.0. Soft consistency rule — validators may warn but should not error. The cvss block makes Environmental/Threat enrichment auditable.",
1555
1828
  "description": "Structured CVSS scoring data backing this override. Captures the rubric (which Environmental/Threat metrics the consumer modified, the recomputed score) used to justify a riskAdjustment. For other override types this is optional context."
1556
1829
  },
1557
1830
  "justification": {
1558
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Justification",
1831
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
1559
1832
  "description": "Structured controlled-vocabulary classification for why this override applies. Complements (does not replace) the free-text 'reason' field. Most useful on falsePositive and attestation overrides where the structured category enables filtering and lossless round-trip with VEX / OSCAL / FedRAMP DR. See the Justification primitive for the precedent vocabulary and rationale."
1560
1833
  }
1561
1834
  },
@@ -1691,7 +1964,7 @@
1691
1964
  "description": "Detailed explanation of the plan, including what actions will be taken."
1692
1965
  },
1693
1966
  "appliedBy": {
1694
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1967
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
1695
1968
  "description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
1696
1969
  },
1697
1970
  "appliedAt": {
@@ -1707,23 +1980,23 @@
1707
1980
  "milestones": {
1708
1981
  "type": "array",
1709
1982
  "items": {
1710
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
1983
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
1711
1984
  },
1712
1985
  "description": "Optional array of milestones tracking progress toward completion."
1713
1986
  },
1714
1987
  "signature": {
1715
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1988
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
1716
1989
  "description": "Optional digital signature for enhanced trust and non-repudiation."
1717
1990
  },
1718
1991
  "evidence": {
1719
1992
  "type": "array",
1720
1993
  "items": {
1721
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1994
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
1722
1995
  },
1723
1996
  "description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
1724
1997
  },
1725
1998
  "previousChecksum": {
1726
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1999
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
1727
2000
  "description": "SHA-256 checksum of the previous amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment on a requirement."
1728
2001
  }
1729
2002
  },
@@ -1866,17 +2139,9 @@
1866
2139
  "Integrity": {
1867
2140
  "type": "object",
1868
2141
  "unevaluatedProperties": false,
1869
- "dependentRequired": {
1870
- "algorithm": [
1871
- "checksum"
1872
- ],
1873
- "checksum": [
1874
- "algorithm"
1875
- ]
1876
- },
1877
2142
  "properties": {
1878
2143
  "algorithm": {
1879
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Hash_Algorithm",
2144
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
1880
2145
  "description": "The hash algorithm used for the checksum."
1881
2146
  },
1882
2147
  "checksum": {
@@ -1905,13 +2170,39 @@
1905
2170
  }
1906
2171
  ],
1907
2172
  "description": "Cryptographic integrity information for verifying the HDF file has not been tampered with. If algorithm is provided, checksum must also be provided, and vice versa.",
1908
- "title": "Integrity"
2173
+ "title": "Integrity",
2174
+ "allOf": [
2175
+ {
2176
+ "if": {
2177
+ "required": [
2178
+ "algorithm"
2179
+ ]
2180
+ },
2181
+ "then": {
2182
+ "required": [
2183
+ "checksum"
2184
+ ]
2185
+ }
2186
+ },
2187
+ {
2188
+ "if": {
2189
+ "required": [
2190
+ "checksum"
2191
+ ]
2192
+ },
2193
+ "then": {
2194
+ "required": [
2195
+ "algorithm"
2196
+ ]
2197
+ }
2198
+ }
2199
+ ]
1909
2200
  }
1910
2201
  }
1911
2202
  },
1912
- "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0": {
2203
+ "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
1913
2204
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1914
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0",
2205
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
1915
2206
  "title": "HDF Amendment Primitives",
1916
2207
  "description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
1917
2208
  "$defs": {
@@ -2022,7 +2313,7 @@
2022
2313
  "externalReferences": {
2023
2314
  "type": "array",
2024
2315
  "items": {
2025
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
2316
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
2026
2317
  },
2027
2318
  "description": "Optional references to the external artifacts behind this override (e.g. the STIX bundle/object, advisory, or CTI feed that motivated it). Inert context distinct from `evidence`; see External_Reference."
2028
2319
  },
@@ -2040,7 +2331,7 @@
2040
2331
  "description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
2041
2332
  },
2042
2333
  "status": {
2043
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
2334
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
2044
2335
  "description": "The new status this amendment sets. Optional when only impact is being overridden."
2045
2336
  },
2046
2337
  "impact": {
@@ -2052,7 +2343,7 @@
2052
2343
  "description": "Justification for this amendment."
2053
2344
  },
2054
2345
  "appliedBy": {
2055
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
2346
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
2056
2347
  "description": "Identity of who applied this amendment."
2057
2348
  },
2058
2349
  "appliedAt": {
@@ -2068,20 +2359,20 @@
2068
2359
  "evidence": {
2069
2360
  "type": "array",
2070
2361
  "items": {
2071
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
2362
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
2072
2363
  },
2073
2364
  "description": "Supporting evidence (screenshots, logs, URLs, documents)."
2074
2365
  },
2075
2366
  "signature": {
2076
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
2367
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
2077
2368
  "description": "Digital signature for non-repudiation."
2078
2369
  },
2079
2370
  "previousChecksum": {
2080
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
2371
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
2081
2372
  "description": "SHA-256 checksum of the prior amendment in chronological order. Each amendment's checksum is recorded by the NEXT one, so editing an amendment in place is detectable — provided a later amendment is chained to it. It is NOT tamper-proof: the final amendment, the document envelope, deleted trailing amendments, and a chain that has been stripped or recomputed wholesale are all outside what it can detect. Use signature for non-repudiation. Omitted on the first amendment."
2082
2373
  },
2083
2374
  "cvss": {
2084
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
2375
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
2085
2376
  "$comment": "When present alongside impact.value on a riskAdjustment override, impact.value should be approximately cvss.computedScore / 10.0. Soft consistency rule — validators may warn but should not error. The cvss block makes Environmental/Threat enrichment auditable.",
2086
2377
  "description": "Structured CVSS scoring data backing this override. Captures the rubric (which Environmental/Threat metrics the consumer modified, the recomputed score) used to justify a riskAdjustment. For other override types this is optional context."
2087
2378
  },
@@ -2092,7 +2383,7 @@
2092
2383
  "milestones": {
2093
2384
  "type": "array",
2094
2385
  "items": {
2095
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
2386
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
2096
2387
  },
2097
2388
  "description": "Remediation milestones (primarily for POA&M type amendments)."
2098
2389
  },
@@ -2109,7 +2400,7 @@
2109
2400
  "affectedPackages": {
2110
2401
  "type": "array",
2111
2402
  "items": {
2112
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0#/$defs/Affected_Package"
2403
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
2113
2404
  },
2114
2405
  "description": "Software packages this amendment is scoped to, distinct from componentRef (which scopes to an HDF-internal Component by UUID).\n\nUse when the source amendment format references packages by purl/cpe/name+version — e.g., VEX `affects[]` / `products[]`, OSCAL POA&M `subjects[]`, FedRAMP component-aware amendments.\n\nSymmetric with Evaluated_Requirement.affectedPackages, which scopes findings to the same package vocabulary.\n\nWhen omitted, the amendment applies system-wide (or only to componentRef when that is set)."
2115
2406
  }
@@ -2242,9 +2533,9 @@
2242
2533
  }
2243
2534
  }
2244
2535
  },
2245
- "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0": {
2536
+ "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
2246
2537
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2247
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0",
2538
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
2248
2539
  "title": "HDF Result Primitives",
2249
2540
  "description": "Types for representing assessment results and statuses.",
2250
2541
  "$defs": {
@@ -2309,6 +2600,10 @@
2309
2600
  "type": "string"
2310
2601
  },
2311
2602
  "description": "The stacktrace/backtrace of the exception if one occurred."
2603
+ },
2604
+ "rawSourceRecord": {
2605
+ "$ref": "#/$defs/Raw_Source_Record",
2606
+ "description": "The source tool's own record for this result, carrying every field the record had. Complete, not necessarily byte-exact: see Raw_Source_Record.content for the producer and consumer obligations, and extensions.rawSourceArtifacts[] when byte-exact carriage is required."
2312
2607
  }
2313
2608
  },
2314
2609
  "examples": [
@@ -2339,6 +2634,64 @@
2339
2634
  "description": "A test within a requirement and its results and findings such as how long it took to run.",
2340
2635
  "title": "Requirement Result"
2341
2636
  },
2637
+ "Raw_Source_Record": {
2638
+ "type": "object",
2639
+ "additionalProperties": false,
2640
+ "required": [
2641
+ "content",
2642
+ "encoding",
2643
+ "mediaType"
2644
+ ],
2645
+ "properties": {
2646
+ "content": {
2647
+ "type": "string",
2648
+ "description": "The source tool's own record for this result, carrying every field the record had.\n\nCOMPLETE, NOT NECESSARILY BYTE-EXACT. A producer SHOULD write the record's bytes unchanged where it can. A producer that cannot — notably one implemented in two languages whose JSON serializers disagree on key order, HTML escaping and number rendering, and which therefore MUST canonicalize to stay byte-identical with its twin — MAY write a canonically serialized form instead. Such a form preserves every field and value but not the original key order, insignificant whitespace, or duplicate keys. A consumer MUST therefore compare records by parsing them, not by comparing bytes, and MUST NOT checksum this field and expect the result to match a checksum of the input.\n\nFor carriage that IS byte-exact, use `extensions.rawSourceArtifacts[]`, which forbids a parsed `document` precisely so the bytes and their checksum survive; `pointer` ties this record to its position within that artifact."
2649
+ },
2650
+ "encoding": {
2651
+ "type": "string",
2652
+ "enum": [
2653
+ "utf-8",
2654
+ "base64"
2655
+ ],
2656
+ "description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
2657
+ },
2658
+ "mediaType": {
2659
+ "type": "string",
2660
+ "description": "The record's IANA media type — the type of this record, which for a fragment of a larger artifact may be narrower than the artifact's own. Example: 'application/json' for one match object out of a JSON report."
2661
+ },
2662
+ "pointer": {
2663
+ "type": "string",
2664
+ "description": "Where this record sits inside the artifact it came from, as a JSON Pointer (RFC 6901) for JSON sources or an XPath for XML ones. Example: '/matches/3'.\n\nOptional, and the link that makes carriage verifiable rather than merely present: with it a consumer can confirm the record really is the subtree of `extensions.rawSourceArtifacts[]` it claims to be. Omit it when the source's shape gives a record no addressable location."
2665
+ }
2666
+ },
2667
+ "description": "The source tool's own record for this result — the one entry in the converter's input that produced it, complete though not necessarily byte-for-byte (see `content`).\n\nSCOPED TO THE RESULT DELIBERATELY. For a vulnerability scanner the native record is one (vulnerability, package) pair, which is exactly one result: a CVE reported against two packages yields two entries whose records differ only in the package they matched. Held on the requirement instead, those two records would collide, and merging entries that share an id would have to discard one — so the result is not merely an available home but the correct one.\n\nDistinct from `extensions.rawSourceArtifacts[]`, which carries whole input artifacts: this carries the one record inside one of them, and `pointer` ties the two together. A consumer that wants the whole input reads the artifact; one that wants provenance for a single finding reads this.\n\nDistinct from `code`, which means the code that ran to evaluate the requirement — an InSpec control's source, or a check reference. A serialized finding is not code, and putting one there overloaded a field whose meaning came from InSpec.\n\nCLOSED, and deliberately not a passthrough bag: three required members and an optional pointer are the whole of it. Producer data that HDF does not model belongs in `extensions.passthrough`, which is document-scoped and permissive by design; this field is neither.\n\nClosed with `additionalProperties` rather than the house `unevaluatedProperties` because this definition composes nothing, and the shipped Go validator is a draft-07 engine that does not implement `unevaluatedProperties` — a closure only one of the two validators enforces is not a closure.",
2668
+ "$comment": "Examples, in order: 1) one grype match — the shape that moves out of `code` — located in the carried artifact by pointer; 2) an XCCDF rule-result, where the record is XML although the document embedding it is JSON, so mediaType is per record and not per document; 3) a record whose bytes are not text, carried as base64; 4) the minimum: a record whose source shape gives it no addressable location, so pointer is omitted.",
2669
+ "examples": [
2670
+ {
2671
+ "content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
2672
+ "encoding": "utf-8",
2673
+ "mediaType": "application/json",
2674
+ "pointer": "/matches/3"
2675
+ },
2676
+ {
2677
+ "content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
2678
+ "encoding": "utf-8",
2679
+ "mediaType": "application/xml",
2680
+ "pointer": "/Benchmark/TestResult/rule-result[4]"
2681
+ },
2682
+ {
2683
+ "content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
2684
+ "encoding": "base64",
2685
+ "mediaType": "application/octet-stream"
2686
+ },
2687
+ {
2688
+ "content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
2689
+ "encoding": "utf-8",
2690
+ "mediaType": "text/csv"
2691
+ }
2692
+ ],
2693
+ "title": "Raw Source Record"
2694
+ },
2342
2695
  "Requirement_Description": {
2343
2696
  "type": "object",
2344
2697
  "unevaluatedProperties": false,
@@ -2375,9 +2728,9 @@
2375
2728
  }
2376
2729
  }
2377
2730
  },
2378
- "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0": {
2731
+ "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
2379
2732
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2380
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0",
2733
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
2381
2734
  "title": "HDF CVSS Primitives",
2382
2735
  "description": "Types for representing CVSS (Common Vulnerability Scoring System) data attached to assessment findings. Supports CVSS v2.0, v3.0, v3.1, and v4.0 metric groups (Base, Threat, Environmental, Supplemental).",
2383
2736
  "$defs": {
@@ -2574,9 +2927,9 @@
2574
2927
  }
2575
2928
  }
2576
2929
  },
2577
- "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0": {
2930
+ "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
2578
2931
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2579
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0",
2932
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
2580
2933
  "title": "HDF Affected Package Primitives",
2581
2934
  "description": "Types for representing the software package(s) affected by a vulnerability finding.",
2582
2935
  "$defs": {