@mitre/hdf-schema 3.7.2 → 3.8.0-next.42533588944.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.
- package/README.md +9 -0
- package/dist/go/hdf.go +1470 -1276
- package/dist/helpers.d.ts +7 -5
- package/dist/helpers.js +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +28 -28
- package/dist/schemas/hdf-amendments.schema.json +562 -112
- package/dist/schemas/hdf-baseline.schema.json +570 -118
- package/dist/schemas/hdf-comparison.schema.json +997 -242
- package/dist/schemas/hdf-evidence-package.schema.json +566 -115
- package/dist/schemas/hdf-plan.schema.json +568 -118
- package/dist/schemas/hdf-requirement-change-event.schema.json +658 -211
- package/dist/schemas/hdf-results.schema.json +644 -197
- package/dist/schemas/hdf-system.schema.json +604 -147
- package/dist/ts/hdf.d.ts +284 -56
- package/dist/ts/hdf.js +24 -9
- package/dist/ts/hdf.ts +285 -50
- package/package.json +3 -3
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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": "
|
|
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.
|
|
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,29 @@
|
|
|
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.
|
|
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.
|
|
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": {
|
|
371
|
+
"External_Reference_Encoding": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"enum": [
|
|
374
|
+
"utf-8",
|
|
375
|
+
"base64"
|
|
376
|
+
],
|
|
377
|
+
"description": "How an embedded copy's bytes are read back: 'utf-8' for text, 'base64' for anything that is not valid UTF-8 text.",
|
|
378
|
+
"title": "External Reference Encoding",
|
|
379
|
+
"examples": [
|
|
380
|
+
"base64"
|
|
381
|
+
],
|
|
382
|
+
"$comment": "Examples, in order: 1) a binary artifact, embedded base64-encoded."
|
|
383
|
+
},
|
|
366
384
|
"External_Reference": {
|
|
367
385
|
"type": "object",
|
|
368
386
|
"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.",
|
|
387
|
+
"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
388
|
"required": [
|
|
371
389
|
"sourceName"
|
|
372
390
|
],
|
|
@@ -385,6 +403,42 @@
|
|
|
385
403
|
"required": [
|
|
386
404
|
"description"
|
|
387
405
|
]
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"required": [
|
|
409
|
+
"content"
|
|
410
|
+
]
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"required": [
|
|
414
|
+
"document"
|
|
415
|
+
]
|
|
416
|
+
}
|
|
417
|
+
],
|
|
418
|
+
"allOf": [
|
|
419
|
+
{
|
|
420
|
+
"if": {
|
|
421
|
+
"required": [
|
|
422
|
+
"content"
|
|
423
|
+
]
|
|
424
|
+
},
|
|
425
|
+
"then": {
|
|
426
|
+
"required": [
|
|
427
|
+
"encoding"
|
|
428
|
+
]
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"if": {
|
|
433
|
+
"required": [
|
|
434
|
+
"encoding"
|
|
435
|
+
]
|
|
436
|
+
},
|
|
437
|
+
"then": {
|
|
438
|
+
"required": [
|
|
439
|
+
"content"
|
|
440
|
+
]
|
|
441
|
+
}
|
|
388
442
|
}
|
|
389
443
|
],
|
|
390
444
|
"properties": {
|
|
@@ -400,7 +454,7 @@
|
|
|
400
454
|
"href": {
|
|
401
455
|
"type": "string",
|
|
402
456
|
"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.
|
|
457
|
+
"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
458
|
},
|
|
405
459
|
"description": {
|
|
406
460
|
"type": "string",
|
|
@@ -412,11 +466,11 @@
|
|
|
412
466
|
},
|
|
413
467
|
"mediaType": {
|
|
414
468
|
"type": "string",
|
|
415
|
-
"description": "IANA media type of the
|
|
469
|
+
"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
470
|
},
|
|
417
471
|
"checksum": {
|
|
418
472
|
"$ref": "#/$defs/Checksum",
|
|
419
|
-
"description": "Integrity hash of the
|
|
473
|
+
"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
474
|
},
|
|
421
475
|
"addedBy": {
|
|
422
476
|
"$ref": "#/$defs/Identity",
|
|
@@ -435,11 +489,19 @@
|
|
|
435
489
|
"document": {
|
|
436
490
|
"type": "object",
|
|
437
491
|
"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)."
|
|
492
|
+
"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)."
|
|
493
|
+
},
|
|
494
|
+
"content": {
|
|
495
|
+
"type": "string",
|
|
496
|
+
"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."
|
|
497
|
+
},
|
|
498
|
+
"encoding": {
|
|
499
|
+
"$ref": "#/$defs/External_Reference_Encoding",
|
|
500
|
+
"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
501
|
}
|
|
440
502
|
},
|
|
441
503
|
"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.",
|
|
504
|
+
"$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
505
|
"examples": [
|
|
444
506
|
{
|
|
445
507
|
"sourceName": "cve",
|
|
@@ -485,6 +547,28 @@
|
|
|
485
547
|
}
|
|
486
548
|
]
|
|
487
549
|
}
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"sourceName": "openscap",
|
|
553
|
+
"rel": "raw-source",
|
|
554
|
+
"mediaType": "application/xml",
|
|
555
|
+
"encoding": "utf-8",
|
|
556
|
+
"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>",
|
|
557
|
+
"checksum": {
|
|
558
|
+
"algorithm": "sha256",
|
|
559
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"sourceName": "fortify",
|
|
564
|
+
"rel": "raw-source",
|
|
565
|
+
"mediaType": "application/zip",
|
|
566
|
+
"encoding": "base64",
|
|
567
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
568
|
+
"checksum": {
|
|
569
|
+
"algorithm": "sha256",
|
|
570
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
571
|
+
}
|
|
488
572
|
}
|
|
489
573
|
]
|
|
490
574
|
},
|
|
@@ -496,7 +580,7 @@
|
|
|
496
580
|
"sha512",
|
|
497
581
|
"blake3"
|
|
498
582
|
],
|
|
499
|
-
"description": "
|
|
583
|
+
"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. md5 and sha1 are excluded deliberately: a checksum or integrity record exists to detect tampering, and both are collision-broken, so a digest in either would look verifiable while proving nothing. A source tool digest in an excluded algorithm is not recorded as a checksum. Admitting weak hashes as an application-level accept/reject decision was considered and rejected; widening this enum is a schema decision, not an oversight.",
|
|
500
584
|
"title": "Hash Algorithm"
|
|
501
585
|
},
|
|
502
586
|
"Requirement_Group": {
|
|
@@ -654,7 +738,33 @@
|
|
|
654
738
|
}
|
|
655
739
|
],
|
|
656
740
|
"description": "A reference to an external document.",
|
|
657
|
-
"title": "Reference"
|
|
741
|
+
"title": "Reference",
|
|
742
|
+
"unevaluatedProperties": false,
|
|
743
|
+
"$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.",
|
|
744
|
+
"examples": [
|
|
745
|
+
{
|
|
746
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
|
|
747
|
+
},
|
|
748
|
+
{
|
|
749
|
+
"ref": "NIST SP 800-53 Rev 5, AC-6"
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"ref": "CIS Benchmark for RHEL 9, 1.1.1",
|
|
753
|
+
"url": "https://www.cisecurity.org/benchmark/red_hat_linux"
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
"ref": [
|
|
757
|
+
{
|
|
758
|
+
"identifier": "2921",
|
|
759
|
+
"publisher": "DISA",
|
|
760
|
+
"type": "DPMS Target"
|
|
761
|
+
}
|
|
762
|
+
]
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"uri": "https://attack.mitre.org/techniques/T1059/"
|
|
766
|
+
}
|
|
767
|
+
]
|
|
658
768
|
},
|
|
659
769
|
"Source_Location": {
|
|
660
770
|
"type": "object",
|
|
@@ -1172,6 +1282,10 @@
|
|
|
1172
1282
|
"type": "string",
|
|
1173
1283
|
"description": "The title - should be human readable."
|
|
1174
1284
|
},
|
|
1285
|
+
"description": {
|
|
1286
|
+
"type": "string",
|
|
1287
|
+
"description": "Prose description of the baseline, more detailed than summary. Carried verbatim, like every HDF prose field."
|
|
1288
|
+
},
|
|
1175
1289
|
"maintainer": {
|
|
1176
1290
|
"type": "string",
|
|
1177
1291
|
"description": "The maintainer(s)."
|
|
@@ -1250,7 +1364,7 @@
|
|
|
1250
1364
|
},
|
|
1251
1365
|
"id": {
|
|
1252
1366
|
"type": "string",
|
|
1253
|
-
"description": "The requirement identifier. Example: 'SV-238196'."
|
|
1367
|
+
"description": "The requirement identifier, naming the requirement itself rather than one finding of it. Example: 'SV-238196'. Several entries in one baseline may legitimately carry the same id (one scanner reporting one CVE against several packages, or an overlay restating what it inherits), so an id is not an instance key: index requirements as id to list, never id to one, and an amendment addressing an id applies to every entry carrying it."
|
|
1254
1368
|
},
|
|
1255
1369
|
"title": {
|
|
1256
1370
|
"type": "string",
|
|
@@ -1468,12 +1582,183 @@
|
|
|
1468
1582
|
}
|
|
1469
1583
|
}
|
|
1470
1584
|
},
|
|
1471
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1585
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
|
|
1472
1586
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1473
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1587
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
|
|
1474
1588
|
"title": "HDF Extension Primitives",
|
|
1475
|
-
"description": "Extension types for waivers, attestations, generators, and
|
|
1589
|
+
"description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
|
|
1476
1590
|
"$defs": {
|
|
1591
|
+
"Raw_Source_Artifact": {
|
|
1592
|
+
"allOf": [
|
|
1593
|
+
{
|
|
1594
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"not": {
|
|
1598
|
+
"required": [
|
|
1599
|
+
"document"
|
|
1600
|
+
]
|
|
1601
|
+
}
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
"if": {
|
|
1605
|
+
"required": [
|
|
1606
|
+
"content"
|
|
1607
|
+
]
|
|
1608
|
+
},
|
|
1609
|
+
"then": {
|
|
1610
|
+
"required": [
|
|
1611
|
+
"encoding",
|
|
1612
|
+
"mediaType"
|
|
1613
|
+
]
|
|
1614
|
+
}
|
|
1615
|
+
}
|
|
1616
|
+
],
|
|
1617
|
+
"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`.",
|
|
1618
|
+
"$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.",
|
|
1619
|
+
"examples": [
|
|
1620
|
+
{
|
|
1621
|
+
"sourceName": "grype",
|
|
1622
|
+
"rel": "raw-source",
|
|
1623
|
+
"mediaType": "application/json",
|
|
1624
|
+
"encoding": "utf-8",
|
|
1625
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1626
|
+
"checksum": {
|
|
1627
|
+
"algorithm": "sha256",
|
|
1628
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1629
|
+
}
|
|
1630
|
+
},
|
|
1631
|
+
{
|
|
1632
|
+
"sourceName": "openscap",
|
|
1633
|
+
"rel": "raw-source",
|
|
1634
|
+
"mediaType": "application/xml",
|
|
1635
|
+
"encoding": "utf-8",
|
|
1636
|
+
"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>",
|
|
1637
|
+
"checksum": {
|
|
1638
|
+
"algorithm": "sha256",
|
|
1639
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
1640
|
+
}
|
|
1641
|
+
},
|
|
1642
|
+
{
|
|
1643
|
+
"sourceName": "prisma",
|
|
1644
|
+
"rel": "raw-source",
|
|
1645
|
+
"mediaType": "text/csv",
|
|
1646
|
+
"encoding": "utf-8",
|
|
1647
|
+
"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",
|
|
1648
|
+
"checksum": {
|
|
1649
|
+
"algorithm": "sha256",
|
|
1650
|
+
"value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
|
|
1651
|
+
}
|
|
1652
|
+
},
|
|
1653
|
+
{
|
|
1654
|
+
"sourceName": "fortify",
|
|
1655
|
+
"rel": "raw-source",
|
|
1656
|
+
"mediaType": "application/zip",
|
|
1657
|
+
"encoding": "base64",
|
|
1658
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1659
|
+
"checksum": {
|
|
1660
|
+
"algorithm": "sha256",
|
|
1661
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1662
|
+
}
|
|
1663
|
+
},
|
|
1664
|
+
{
|
|
1665
|
+
"sourceName": "nessus",
|
|
1666
|
+
"rel": "raw-source",
|
|
1667
|
+
"href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
|
|
1668
|
+
"mediaType": "application/xml",
|
|
1669
|
+
"checksum": {
|
|
1670
|
+
"algorithm": "sha256",
|
|
1671
|
+
"value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
]
|
|
1675
|
+
},
|
|
1676
|
+
"Extensions": {
|
|
1677
|
+
"type": "object",
|
|
1678
|
+
"additionalProperties": false,
|
|
1679
|
+
"properties": {
|
|
1680
|
+
"passthrough": {
|
|
1681
|
+
"type": "object",
|
|
1682
|
+
"additionalProperties": true,
|
|
1683
|
+
"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.",
|
|
1684
|
+
"examples": [
|
|
1685
|
+
{
|
|
1686
|
+
"auxiliary_data": [
|
|
1687
|
+
{
|
|
1688
|
+
"name": "Scoutsuite",
|
|
1689
|
+
"data": {
|
|
1690
|
+
"last_run": {
|
|
1691
|
+
"ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
]
|
|
1696
|
+
},
|
|
1697
|
+
{
|
|
1698
|
+
"audit": {
|
|
1699
|
+
"runId": "r-123"
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
],
|
|
1703
|
+
"$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."
|
|
1704
|
+
},
|
|
1705
|
+
"rawSourceArtifacts": {
|
|
1706
|
+
"type": "array",
|
|
1707
|
+
"items": {
|
|
1708
|
+
"$ref": "#/$defs/Raw_Source_Artifact"
|
|
1709
|
+
},
|
|
1710
|
+
"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."
|
|
1711
|
+
}
|
|
1712
|
+
},
|
|
1713
|
+
"title": "Extensions",
|
|
1714
|
+
"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.",
|
|
1715
|
+
"$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.",
|
|
1716
|
+
"examples": [
|
|
1717
|
+
{
|
|
1718
|
+
"passthrough": {
|
|
1719
|
+
"auxiliary_data": [
|
|
1720
|
+
{
|
|
1721
|
+
"name": "Grype",
|
|
1722
|
+
"data": {
|
|
1723
|
+
"descriptor": {
|
|
1724
|
+
"name": "grype",
|
|
1725
|
+
"version": "0.74.0"
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
]
|
|
1730
|
+
},
|
|
1731
|
+
"rawSourceArtifacts": [
|
|
1732
|
+
{
|
|
1733
|
+
"sourceName": "grype",
|
|
1734
|
+
"rel": "raw-source",
|
|
1735
|
+
"mediaType": "application/json",
|
|
1736
|
+
"encoding": "utf-8",
|
|
1737
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1738
|
+
"checksum": {
|
|
1739
|
+
"algorithm": "sha256",
|
|
1740
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1741
|
+
}
|
|
1742
|
+
}
|
|
1743
|
+
]
|
|
1744
|
+
},
|
|
1745
|
+
{
|
|
1746
|
+
"rawSourceArtifacts": [
|
|
1747
|
+
{
|
|
1748
|
+
"sourceName": "fortify",
|
|
1749
|
+
"rel": "raw-source",
|
|
1750
|
+
"mediaType": "application/zip",
|
|
1751
|
+
"encoding": "base64",
|
|
1752
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1753
|
+
"checksum": {
|
|
1754
|
+
"algorithm": "sha256",
|
|
1755
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
]
|
|
1759
|
+
}
|
|
1760
|
+
]
|
|
1761
|
+
},
|
|
1477
1762
|
"Status_Override": {
|
|
1478
1763
|
"type": "object",
|
|
1479
1764
|
"unevaluatedProperties": false,
|
|
@@ -1484,44 +1769,99 @@
|
|
|
1484
1769
|
"appliedAt",
|
|
1485
1770
|
"expiresAt"
|
|
1486
1771
|
],
|
|
1487
|
-
"
|
|
1772
|
+
"allOf": [
|
|
1488
1773
|
{
|
|
1489
|
-
"
|
|
1490
|
-
"
|
|
1491
|
-
|
|
1774
|
+
"if": {
|
|
1775
|
+
"properties": {
|
|
1776
|
+
"type": {
|
|
1777
|
+
"enum": [
|
|
1778
|
+
"operationalRequirement"
|
|
1779
|
+
]
|
|
1780
|
+
}
|
|
1781
|
+
},
|
|
1782
|
+
"required": [
|
|
1783
|
+
"type"
|
|
1784
|
+
]
|
|
1785
|
+
},
|
|
1786
|
+
"then": {
|
|
1787
|
+
"not": {
|
|
1788
|
+
"anyOf": [
|
|
1789
|
+
{
|
|
1790
|
+
"required": [
|
|
1791
|
+
"status"
|
|
1792
|
+
]
|
|
1793
|
+
},
|
|
1794
|
+
{
|
|
1795
|
+
"required": [
|
|
1796
|
+
"impact"
|
|
1797
|
+
]
|
|
1798
|
+
}
|
|
1799
|
+
]
|
|
1800
|
+
}
|
|
1801
|
+
},
|
|
1802
|
+
"else": {
|
|
1803
|
+
"anyOf": [
|
|
1804
|
+
{
|
|
1805
|
+
"required": [
|
|
1806
|
+
"status"
|
|
1807
|
+
]
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
"required": [
|
|
1811
|
+
"impact"
|
|
1812
|
+
]
|
|
1813
|
+
}
|
|
1814
|
+
]
|
|
1815
|
+
}
|
|
1492
1816
|
},
|
|
1493
1817
|
{
|
|
1494
|
-
"
|
|
1495
|
-
"
|
|
1496
|
-
|
|
1818
|
+
"if": {
|
|
1819
|
+
"properties": {
|
|
1820
|
+
"type": {
|
|
1821
|
+
"enum": [
|
|
1822
|
+
"riskAdjustment"
|
|
1823
|
+
]
|
|
1824
|
+
}
|
|
1825
|
+
},
|
|
1826
|
+
"required": [
|
|
1827
|
+
"type"
|
|
1828
|
+
]
|
|
1829
|
+
},
|
|
1830
|
+
"then": {
|
|
1831
|
+
"not": {
|
|
1832
|
+
"required": [
|
|
1833
|
+
"status"
|
|
1834
|
+
]
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1497
1837
|
}
|
|
1498
1838
|
],
|
|
1499
1839
|
"properties": {
|
|
1500
1840
|
"externalReferences": {
|
|
1501
1841
|
"type": "array",
|
|
1502
1842
|
"items": {
|
|
1503
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1843
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1504
1844
|
},
|
|
1505
1845
|
"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
1846
|
},
|
|
1507
1847
|
"type": {
|
|
1508
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1848
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
|
|
1509
1849
|
"description": "The type of override applied to this requirement."
|
|
1510
1850
|
},
|
|
1511
1851
|
"status": {
|
|
1512
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1513
|
-
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
|
|
1852
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
1853
|
+
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a riskAdjustment, which re-rates impact only."
|
|
1514
1854
|
},
|
|
1515
1855
|
"impact": {
|
|
1516
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1517
|
-
"description": "Override to the requirement's impact score.
|
|
1856
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
|
|
1857
|
+
"description": "Override to the requirement's impact score. For every type except operationalRequirement, at least one of status or impact must be set; an operationalRequirement carries neither."
|
|
1518
1858
|
},
|
|
1519
1859
|
"reason": {
|
|
1520
1860
|
"type": "string",
|
|
1521
1861
|
"description": "Explanation for why this override was applied."
|
|
1522
1862
|
},
|
|
1523
1863
|
"appliedBy": {
|
|
1524
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1864
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1525
1865
|
"description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
|
|
1526
1866
|
},
|
|
1527
1867
|
"appliedAt": {
|
|
@@ -1535,31 +1875,31 @@
|
|
|
1535
1875
|
"description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
|
|
1536
1876
|
},
|
|
1537
1877
|
"signature": {
|
|
1538
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1878
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1539
1879
|
"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
1880
|
},
|
|
1541
1881
|
"evidence": {
|
|
1542
1882
|
"type": "array",
|
|
1543
1883
|
"items": {
|
|
1544
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1884
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1545
1885
|
},
|
|
1546
1886
|
"description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
|
|
1547
1887
|
},
|
|
1548
1888
|
"previousChecksum": {
|
|
1549
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1889
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1550
1890
|
"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
1891
|
},
|
|
1552
1892
|
"cvss": {
|
|
1553
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1893
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
1554
1894
|
"$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
1895
|
"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
1896
|
},
|
|
1557
1897
|
"justification": {
|
|
1558
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1898
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
|
|
1559
1899
|
"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
1900
|
}
|
|
1561
1901
|
},
|
|
1562
|
-
"$comment": "Example 3: Inline riskAdjustment carrying the STIX source that motivated it via externalReferences (the enrichment envelope, with the raw sighting embedded losslessly in document). This is the shape the enrich pass writes onto Evaluated_Requirement.overrides[] for the E:A recompute.",
|
|
1902
|
+
"$comment": "Example 3: Inline riskAdjustment carrying the STIX source that motivated it via externalReferences (the enrichment envelope, with the raw sighting embedded losslessly in document). This is the shape the enrich pass writes onto Evaluated_Requirement.overrides[] for the E:A recompute. Example 7: operationalRequirement as it sits on the requirement after apply: no status, no impact; the finding stays failed and disposition reports operationalRequirement.",
|
|
1563
1903
|
"examples": [
|
|
1564
1904
|
{
|
|
1565
1905
|
"type": "waiver",
|
|
@@ -1659,9 +1999,19 @@
|
|
|
1659
1999
|
}
|
|
1660
2000
|
}
|
|
1661
2001
|
]
|
|
2002
|
+
},
|
|
2003
|
+
{
|
|
2004
|
+
"type": "operationalRequirement",
|
|
2005
|
+
"reason": "Air-gapped ingest requires USB transfer per operational procedure OP-2026-003. Ports are physically secured, transfers are logged and need two-person integrity.",
|
|
2006
|
+
"appliedBy": {
|
|
2007
|
+
"type": "email",
|
|
2008
|
+
"identifier": "system-owner@agency.gov"
|
|
2009
|
+
},
|
|
2010
|
+
"appliedAt": "2026-01-20T10:00:00Z",
|
|
2011
|
+
"expiresAt": "2099-12-31T00:00:00Z"
|
|
1662
2012
|
}
|
|
1663
2013
|
],
|
|
1664
|
-
"description": "An intentional change to a requirement's compliance status and/or impact score.
|
|
2014
|
+
"description": "An intentional change to a requirement's compliance status and/or impact score, as it sits on the requirement once applied. The same type-conditional rule as Standalone_Override: when type is 'operationalRequirement', neither status nor impact may be set, because the override records an accepted deviation without adjudicating the finding; it still governs disposition, and effectiveStatus stays what the results decided. When type is 'riskAdjustment', status may not be set: it re-rates the risk through impact and never changes pass/fail. For every other type, at least one of status or impact must be set. All overrides must have an expiration date to enforce periodic review.",
|
|
1665
2015
|
"title": "Status Override"
|
|
1666
2016
|
},
|
|
1667
2017
|
"POAM": {
|
|
@@ -1691,7 +2041,7 @@
|
|
|
1691
2041
|
"description": "Detailed explanation of the plan, including what actions will be taken."
|
|
1692
2042
|
},
|
|
1693
2043
|
"appliedBy": {
|
|
1694
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2044
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1695
2045
|
"description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
|
|
1696
2046
|
},
|
|
1697
2047
|
"appliedAt": {
|
|
@@ -1707,23 +2057,23 @@
|
|
|
1707
2057
|
"milestones": {
|
|
1708
2058
|
"type": "array",
|
|
1709
2059
|
"items": {
|
|
1710
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2060
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
1711
2061
|
},
|
|
1712
2062
|
"description": "Optional array of milestones tracking progress toward completion."
|
|
1713
2063
|
},
|
|
1714
2064
|
"signature": {
|
|
1715
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2065
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1716
2066
|
"description": "Optional digital signature for enhanced trust and non-repudiation."
|
|
1717
2067
|
},
|
|
1718
2068
|
"evidence": {
|
|
1719
2069
|
"type": "array",
|
|
1720
2070
|
"items": {
|
|
1721
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2071
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1722
2072
|
},
|
|
1723
2073
|
"description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
|
|
1724
2074
|
},
|
|
1725
2075
|
"previousChecksum": {
|
|
1726
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2076
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1727
2077
|
"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
2078
|
}
|
|
1729
2079
|
},
|
|
@@ -1866,17 +2216,9 @@
|
|
|
1866
2216
|
"Integrity": {
|
|
1867
2217
|
"type": "object",
|
|
1868
2218
|
"unevaluatedProperties": false,
|
|
1869
|
-
"dependentRequired": {
|
|
1870
|
-
"algorithm": [
|
|
1871
|
-
"checksum"
|
|
1872
|
-
],
|
|
1873
|
-
"checksum": [
|
|
1874
|
-
"algorithm"
|
|
1875
|
-
]
|
|
1876
|
-
},
|
|
1877
2219
|
"properties": {
|
|
1878
2220
|
"algorithm": {
|
|
1879
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2221
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
|
|
1880
2222
|
"description": "The hash algorithm used for the checksum."
|
|
1881
2223
|
},
|
|
1882
2224
|
"checksum": {
|
|
@@ -1905,13 +2247,39 @@
|
|
|
1905
2247
|
}
|
|
1906
2248
|
],
|
|
1907
2249
|
"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"
|
|
2250
|
+
"title": "Integrity",
|
|
2251
|
+
"allOf": [
|
|
2252
|
+
{
|
|
2253
|
+
"if": {
|
|
2254
|
+
"required": [
|
|
2255
|
+
"algorithm"
|
|
2256
|
+
]
|
|
2257
|
+
},
|
|
2258
|
+
"then": {
|
|
2259
|
+
"required": [
|
|
2260
|
+
"checksum"
|
|
2261
|
+
]
|
|
2262
|
+
}
|
|
2263
|
+
},
|
|
2264
|
+
{
|
|
2265
|
+
"if": {
|
|
2266
|
+
"required": [
|
|
2267
|
+
"checksum"
|
|
2268
|
+
]
|
|
2269
|
+
},
|
|
2270
|
+
"then": {
|
|
2271
|
+
"required": [
|
|
2272
|
+
"algorithm"
|
|
2273
|
+
]
|
|
2274
|
+
}
|
|
2275
|
+
}
|
|
2276
|
+
]
|
|
1909
2277
|
}
|
|
1910
2278
|
}
|
|
1911
2279
|
},
|
|
1912
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2280
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
|
|
1913
2281
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1914
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2282
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
|
|
1915
2283
|
"title": "HDF Amendment Primitives",
|
|
1916
2284
|
"description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
|
|
1917
2285
|
"$defs": {
|
|
@@ -1926,7 +2294,7 @@
|
|
|
1926
2294
|
"riskAdjustment",
|
|
1927
2295
|
"operationalRequirement"
|
|
1928
2296
|
],
|
|
1929
|
-
"description": "The type of amendment, aligned with FedRAMP deviation request categories.\n\n- 'waiver': risk accepted by Authorizing Official.\n- 'attestation': manually verified by assessor.\n- 'poam': remediation tracked (no status change).\n- 'inherited': control provided by another component or system.\n- 'falsePositive': scanner incorrectly identified a finding — for compliance scans (STIG, CIS), the check actually passes, so status is typically set to 'passed'; for vulnerability scans (CVE, SCA), the flagged vulnerability does not apply to this system, so status is typically set to 'notApplicable'. The disposition field on the requirement distinguishes false positives from genuinely not-applicable findings.\n- 'riskAdjustment': impact score adjusted based on environmental context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact via the impact field.\n- 'operationalRequirement': deviation required by operational constraints (FedRAMP Operational Requirement); the finding cannot be remediated because the system requires the affected functionality. Remains an open risk.\n\nMigration note: 'exception' was removed in v3.1.0 — use 'waiver' with status 'notApplicable' instead.",
|
|
2297
|
+
"description": "The type of amendment, aligned with FedRAMP deviation request categories.\n\n- 'waiver': risk accepted by Authorizing Official.\n- 'attestation': manually verified by assessor.\n- 'poam': remediation tracked (no status change).\n- 'inherited': control provided by another component or system.\n- 'falsePositive': scanner incorrectly identified a finding — for compliance scans (STIG, CIS), the check actually passes, so status is typically set to 'passed'; for vulnerability scans (CVE, SCA), the flagged vulnerability does not apply to this system, so status is typically set to 'notApplicable'. The disposition field on the requirement distinguishes false positives from genuinely not-applicable findings.\n- 'riskAdjustment': impact score adjusted based on environmental context (FedRAMP Risk Adjustment); does not change pass/fail status, only impact via the impact field; a status on it is rejected by validation.\n- 'operationalRequirement': deviation required by operational constraints (FedRAMP Operational Requirement); the finding cannot be remediated because the system requires the affected functionality. Remains an open risk.\n\nMigration note: 'exception' was removed in v3.1.0 — use 'waiver' with status 'notApplicable' instead.",
|
|
1930
2298
|
"title": "Override Type"
|
|
1931
2299
|
},
|
|
1932
2300
|
"Justification": {
|
|
@@ -1966,7 +2334,7 @@
|
|
|
1966
2334
|
},
|
|
1967
2335
|
"Standalone_Override": {
|
|
1968
2336
|
"type": "object",
|
|
1969
|
-
"description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation
|
|
2337
|
+
"description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation is gated on 'type': when type is 'operationalRequirement', neither 'status' nor 'impact' may be set — the override records accepted risk without changing the finding (documentation-only). When type is 'riskAdjustment', 'status' may not be set — it re-rates the risk through 'impact' and never changes the finding's pass/fail; an override that must change status is a waiver or falsePositive. For all other types, at least one of 'status' or 'impact' must be set.\n\nThis rule aligns with:\n- OSCAL Assessment Results — finding.target.status and finding.associated-risk[].facet[] are separate axes (https://pages.nist.gov/OSCAL/learn/concepts/layer/assessment/assessment-results/)\n- FedRAMP deviation request types — Risk Adjustment changes impact only, Operational Requirement documents acceptance only, False Positive changes status (https://www.ignyteplatform.com/blog/fedramp/fedramp-deviation-requests-submit/)\n- NIST SP 800-37 RMF — risk response (accept/mitigate/transfer) is a separate step from control assessment status (https://csrc.nist.gov/pubs/sp/800/37/r2/final).",
|
|
1970
2338
|
"unevaluatedProperties": false,
|
|
1971
2339
|
"required": [
|
|
1972
2340
|
"type",
|
|
@@ -1976,53 +2344,78 @@
|
|
|
1976
2344
|
"appliedAt",
|
|
1977
2345
|
"expiresAt"
|
|
1978
2346
|
],
|
|
1979
|
-
"
|
|
1980
|
-
|
|
1981
|
-
"
|
|
1982
|
-
"
|
|
1983
|
-
"
|
|
2347
|
+
"allOf": [
|
|
2348
|
+
{
|
|
2349
|
+
"if": {
|
|
2350
|
+
"properties": {
|
|
2351
|
+
"type": {
|
|
2352
|
+
"enum": [
|
|
2353
|
+
"operationalRequirement"
|
|
2354
|
+
]
|
|
2355
|
+
}
|
|
2356
|
+
},
|
|
2357
|
+
"required": [
|
|
2358
|
+
"type"
|
|
2359
|
+
]
|
|
2360
|
+
},
|
|
2361
|
+
"then": {
|
|
2362
|
+
"not": {
|
|
2363
|
+
"anyOf": [
|
|
2364
|
+
{
|
|
2365
|
+
"required": [
|
|
2366
|
+
"status"
|
|
2367
|
+
]
|
|
2368
|
+
},
|
|
2369
|
+
{
|
|
2370
|
+
"required": [
|
|
2371
|
+
"impact"
|
|
2372
|
+
]
|
|
2373
|
+
}
|
|
2374
|
+
]
|
|
2375
|
+
}
|
|
2376
|
+
},
|
|
2377
|
+
"else": {
|
|
2378
|
+
"anyOf": [
|
|
2379
|
+
{
|
|
2380
|
+
"required": [
|
|
2381
|
+
"status"
|
|
2382
|
+
]
|
|
2383
|
+
},
|
|
2384
|
+
{
|
|
2385
|
+
"required": [
|
|
2386
|
+
"impact"
|
|
2387
|
+
]
|
|
2388
|
+
}
|
|
1984
2389
|
]
|
|
1985
2390
|
}
|
|
1986
2391
|
},
|
|
1987
|
-
|
|
1988
|
-
"
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
"required": [
|
|
1996
|
-
"status"
|
|
1997
|
-
]
|
|
2392
|
+
{
|
|
2393
|
+
"if": {
|
|
2394
|
+
"properties": {
|
|
2395
|
+
"type": {
|
|
2396
|
+
"enum": [
|
|
2397
|
+
"riskAdjustment"
|
|
2398
|
+
]
|
|
2399
|
+
}
|
|
1998
2400
|
},
|
|
1999
|
-
{
|
|
2000
|
-
"required": [
|
|
2001
|
-
"impact"
|
|
2002
|
-
]
|
|
2003
|
-
}
|
|
2004
|
-
]
|
|
2005
|
-
}
|
|
2006
|
-
},
|
|
2007
|
-
"else": {
|
|
2008
|
-
"anyOf": [
|
|
2009
|
-
{
|
|
2010
2401
|
"required": [
|
|
2011
|
-
"
|
|
2402
|
+
"type"
|
|
2012
2403
|
]
|
|
2013
2404
|
},
|
|
2014
|
-
{
|
|
2015
|
-
"
|
|
2016
|
-
"
|
|
2017
|
-
|
|
2405
|
+
"then": {
|
|
2406
|
+
"not": {
|
|
2407
|
+
"required": [
|
|
2408
|
+
"status"
|
|
2409
|
+
]
|
|
2410
|
+
}
|
|
2018
2411
|
}
|
|
2019
|
-
|
|
2020
|
-
|
|
2412
|
+
}
|
|
2413
|
+
],
|
|
2021
2414
|
"properties": {
|
|
2022
2415
|
"externalReferences": {
|
|
2023
2416
|
"type": "array",
|
|
2024
2417
|
"items": {
|
|
2025
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2418
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
2026
2419
|
},
|
|
2027
2420
|
"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
2421
|
},
|
|
@@ -2033,15 +2426,15 @@
|
|
|
2033
2426
|
"requirementId": {
|
|
2034
2427
|
"type": "string",
|
|
2035
2428
|
"minLength": 1,
|
|
2036
|
-
"description": "The
|
|
2429
|
+
"description": "The id of the requirement being amended. An id names the requirement, not one finding, so the override applies to every requirement entry carrying that id in the baseline(s) it targets."
|
|
2037
2430
|
},
|
|
2038
2431
|
"baselineRef": {
|
|
2039
2432
|
"type": "string",
|
|
2040
2433
|
"description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
|
|
2041
2434
|
},
|
|
2042
2435
|
"status": {
|
|
2043
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2044
|
-
"description": "The new status this
|
|
2436
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
2437
|
+
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden; forbidden on an operationalRequirement, which adjudicates nothing, and on a riskAdjustment, which re-rates impact only."
|
|
2045
2438
|
},
|
|
2046
2439
|
"impact": {
|
|
2047
2440
|
"$ref": "#/$defs/Impact_Override",
|
|
@@ -2052,7 +2445,7 @@
|
|
|
2052
2445
|
"description": "Justification for this amendment."
|
|
2053
2446
|
},
|
|
2054
2447
|
"appliedBy": {
|
|
2055
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2448
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
2056
2449
|
"description": "Identity of who applied this amendment."
|
|
2057
2450
|
},
|
|
2058
2451
|
"appliedAt": {
|
|
@@ -2068,20 +2461,20 @@
|
|
|
2068
2461
|
"evidence": {
|
|
2069
2462
|
"type": "array",
|
|
2070
2463
|
"items": {
|
|
2071
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2464
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
2072
2465
|
},
|
|
2073
2466
|
"description": "Supporting evidence (screenshots, logs, URLs, documents)."
|
|
2074
2467
|
},
|
|
2075
2468
|
"signature": {
|
|
2076
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2469
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
2077
2470
|
"description": "Digital signature for non-repudiation."
|
|
2078
2471
|
},
|
|
2079
2472
|
"previousChecksum": {
|
|
2080
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2473
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
2081
2474
|
"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
2475
|
},
|
|
2083
2476
|
"cvss": {
|
|
2084
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2477
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
2085
2478
|
"$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
2479
|
"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
2480
|
},
|
|
@@ -2092,7 +2485,7 @@
|
|
|
2092
2485
|
"milestones": {
|
|
2093
2486
|
"type": "array",
|
|
2094
2487
|
"items": {
|
|
2095
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2488
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
2096
2489
|
},
|
|
2097
2490
|
"description": "Remediation milestones (primarily for POA&M type amendments)."
|
|
2098
2491
|
},
|
|
@@ -2109,7 +2502,7 @@
|
|
|
2109
2502
|
"affectedPackages": {
|
|
2110
2503
|
"type": "array",
|
|
2111
2504
|
"items": {
|
|
2112
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2505
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
|
|
2113
2506
|
},
|
|
2114
2507
|
"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
2508
|
}
|
|
@@ -2242,9 +2635,9 @@
|
|
|
2242
2635
|
}
|
|
2243
2636
|
}
|
|
2244
2637
|
},
|
|
2245
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2638
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
|
|
2246
2639
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2247
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2640
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
|
|
2248
2641
|
"title": "HDF Result Primitives",
|
|
2249
2642
|
"description": "Types for representing assessment results and statuses.",
|
|
2250
2643
|
"$defs": {
|
|
@@ -2309,6 +2702,10 @@
|
|
|
2309
2702
|
"type": "string"
|
|
2310
2703
|
},
|
|
2311
2704
|
"description": "The stacktrace/backtrace of the exception if one occurred."
|
|
2705
|
+
},
|
|
2706
|
+
"rawSourceRecord": {
|
|
2707
|
+
"$ref": "#/$defs/Raw_Source_Record",
|
|
2708
|
+
"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
2709
|
}
|
|
2313
2710
|
},
|
|
2314
2711
|
"examples": [
|
|
@@ -2339,6 +2736,60 @@
|
|
|
2339
2736
|
"description": "A test within a requirement and its results and findings such as how long it took to run.",
|
|
2340
2737
|
"title": "Requirement Result"
|
|
2341
2738
|
},
|
|
2739
|
+
"Raw_Source_Record": {
|
|
2740
|
+
"type": "object",
|
|
2741
|
+
"additionalProperties": false,
|
|
2742
|
+
"required": [
|
|
2743
|
+
"content",
|
|
2744
|
+
"encoding",
|
|
2745
|
+
"mediaType"
|
|
2746
|
+
],
|
|
2747
|
+
"properties": {
|
|
2748
|
+
"content": {
|
|
2749
|
+
"type": "string",
|
|
2750
|
+
"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."
|
|
2751
|
+
},
|
|
2752
|
+
"encoding": {
|
|
2753
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference_Encoding",
|
|
2754
|
+
"description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
|
|
2755
|
+
},
|
|
2756
|
+
"mediaType": {
|
|
2757
|
+
"type": "string",
|
|
2758
|
+
"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."
|
|
2759
|
+
},
|
|
2760
|
+
"pointer": {
|
|
2761
|
+
"type": "string",
|
|
2762
|
+
"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."
|
|
2763
|
+
}
|
|
2764
|
+
},
|
|
2765
|
+
"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.",
|
|
2766
|
+
"$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.",
|
|
2767
|
+
"examples": [
|
|
2768
|
+
{
|
|
2769
|
+
"content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
|
|
2770
|
+
"encoding": "utf-8",
|
|
2771
|
+
"mediaType": "application/json",
|
|
2772
|
+
"pointer": "/matches/3"
|
|
2773
|
+
},
|
|
2774
|
+
{
|
|
2775
|
+
"content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
|
|
2776
|
+
"encoding": "utf-8",
|
|
2777
|
+
"mediaType": "application/xml",
|
|
2778
|
+
"pointer": "/Benchmark/TestResult/rule-result[4]"
|
|
2779
|
+
},
|
|
2780
|
+
{
|
|
2781
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
|
|
2782
|
+
"encoding": "base64",
|
|
2783
|
+
"mediaType": "application/octet-stream"
|
|
2784
|
+
},
|
|
2785
|
+
{
|
|
2786
|
+
"content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
|
|
2787
|
+
"encoding": "utf-8",
|
|
2788
|
+
"mediaType": "text/csv"
|
|
2789
|
+
}
|
|
2790
|
+
],
|
|
2791
|
+
"title": "Raw Source Record"
|
|
2792
|
+
},
|
|
2342
2793
|
"Requirement_Description": {
|
|
2343
2794
|
"type": "object",
|
|
2344
2795
|
"unevaluatedProperties": false,
|
|
@@ -2375,9 +2826,9 @@
|
|
|
2375
2826
|
}
|
|
2376
2827
|
}
|
|
2377
2828
|
},
|
|
2378
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2829
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
|
|
2379
2830
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2380
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2831
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
|
|
2381
2832
|
"title": "HDF CVSS Primitives",
|
|
2382
2833
|
"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
2834
|
"$defs": {
|
|
@@ -2574,9 +3025,9 @@
|
|
|
2574
3025
|
}
|
|
2575
3026
|
}
|
|
2576
3027
|
},
|
|
2577
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
3028
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
|
|
2578
3029
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2579
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
3030
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
|
|
2580
3031
|
"title": "HDF Affected Package Primitives",
|
|
2581
3032
|
"description": "Types for representing the software package(s) affected by a vulnerability finding.",
|
|
2582
3033
|
"$defs": {
|