@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-amendments/v3.
|
|
3
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/hdf-amendments/v3.8.0",
|
|
4
4
|
"title": "HDF Amendments",
|
|
5
5
|
"description": "Waivers, attestations, and POA&Ms that modify requirement compliance status or impact. Amendments are standalone documents that can be applied to results via merge operations.",
|
|
6
6
|
"type": "object",
|
|
@@ -29,18 +29,18 @@
|
|
|
29
29
|
"description": "URI to the hdf-system document these amendments apply to."
|
|
30
30
|
},
|
|
31
31
|
"appliedBy": {
|
|
32
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
32
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
33
33
|
"description": "Default identity of who created this amendments document. Individual overrides may specify their own appliedBy."
|
|
34
34
|
},
|
|
35
35
|
"approvedBy": {
|
|
36
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
36
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
37
37
|
"description": "Identity of the authorizing official who approved these amendments."
|
|
38
38
|
},
|
|
39
39
|
"overrides": {
|
|
40
40
|
"type": "array",
|
|
41
41
|
"minItems": 1,
|
|
42
42
|
"items": {
|
|
43
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
43
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Standalone_Override"
|
|
44
44
|
},
|
|
45
45
|
"description": "The set of amendments (waivers, attestations, POA&Ms, and other overrides)."
|
|
46
46
|
},
|
|
@@ -52,11 +52,11 @@
|
|
|
52
52
|
"description": "Optional key-value labels for grouping and querying amendments."
|
|
53
53
|
},
|
|
54
54
|
"integrity": {
|
|
55
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
55
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Integrity",
|
|
56
56
|
"description": "Cryptographic integrity information for verifying this amendments document has not been tampered with."
|
|
57
57
|
},
|
|
58
58
|
"signature": {
|
|
59
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
59
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
60
60
|
"description": "Document-level digital signature covering all amendments."
|
|
61
61
|
},
|
|
62
62
|
"version": {
|
|
@@ -64,8 +64,12 @@
|
|
|
64
64
|
"description": "Version of this amendments document."
|
|
65
65
|
},
|
|
66
66
|
"generator": {
|
|
67
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
67
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Generator",
|
|
68
68
|
"description": "Information about the tool that generated this document."
|
|
69
|
+
},
|
|
70
|
+
"extensions": {
|
|
71
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Extensions",
|
|
72
|
+
"description": "Producer data outside the HDF model, and the pre-converted source artifact(s) these amendments were converted from — the VEX family and oscal-poam-to-hdf all emit this document type."
|
|
69
73
|
}
|
|
70
74
|
},
|
|
71
75
|
"examples": [
|
|
@@ -101,16 +105,29 @@
|
|
|
101
105
|
}
|
|
102
106
|
],
|
|
103
107
|
"$defs": {
|
|
104
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
108
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0": {
|
|
105
109
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
106
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
110
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0",
|
|
107
111
|
"title": "HDF Common Primitives",
|
|
108
112
|
"description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
|
|
109
113
|
"$defs": {
|
|
114
|
+
"External_Reference_Encoding": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"enum": [
|
|
117
|
+
"utf-8",
|
|
118
|
+
"base64"
|
|
119
|
+
],
|
|
120
|
+
"description": "How an embedded copy's bytes are read back: 'utf-8' for text, 'base64' for anything that is not valid UTF-8 text.",
|
|
121
|
+
"title": "External Reference Encoding",
|
|
122
|
+
"examples": [
|
|
123
|
+
"base64"
|
|
124
|
+
],
|
|
125
|
+
"$comment": "Examples, in order: 1) a binary artifact, embedded base64-encoded."
|
|
126
|
+
},
|
|
110
127
|
"External_Reference": {
|
|
111
128
|
"type": "object",
|
|
112
129
|
"title": "External Reference",
|
|
113
|
-
"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.",
|
|
130
|
+
"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.",
|
|
114
131
|
"required": [
|
|
115
132
|
"sourceName"
|
|
116
133
|
],
|
|
@@ -129,6 +146,42 @@
|
|
|
129
146
|
"required": [
|
|
130
147
|
"description"
|
|
131
148
|
]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"required": [
|
|
152
|
+
"content"
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"required": [
|
|
157
|
+
"document"
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"allOf": [
|
|
162
|
+
{
|
|
163
|
+
"if": {
|
|
164
|
+
"required": [
|
|
165
|
+
"content"
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
"then": {
|
|
169
|
+
"required": [
|
|
170
|
+
"encoding"
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"if": {
|
|
176
|
+
"required": [
|
|
177
|
+
"encoding"
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
"then": {
|
|
181
|
+
"required": [
|
|
182
|
+
"content"
|
|
183
|
+
]
|
|
184
|
+
}
|
|
132
185
|
}
|
|
133
186
|
],
|
|
134
187
|
"properties": {
|
|
@@ -144,7 +197,7 @@
|
|
|
144
197
|
"href": {
|
|
145
198
|
"type": "string",
|
|
146
199
|
"format": "uri-reference",
|
|
147
|
-
"description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs.
|
|
200
|
+
"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."
|
|
148
201
|
},
|
|
149
202
|
"description": {
|
|
150
203
|
"type": "string",
|
|
@@ -156,11 +209,11 @@
|
|
|
156
209
|
},
|
|
157
210
|
"mediaType": {
|
|
158
211
|
"type": "string",
|
|
159
|
-
"description": "IANA media type of the
|
|
212
|
+
"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`."
|
|
160
213
|
},
|
|
161
214
|
"checksum": {
|
|
162
215
|
"$ref": "#/$defs/Checksum",
|
|
163
|
-
"description": "Integrity hash of the
|
|
216
|
+
"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."
|
|
164
217
|
},
|
|
165
218
|
"addedBy": {
|
|
166
219
|
"$ref": "#/$defs/Identity",
|
|
@@ -179,11 +232,19 @@
|
|
|
179
232
|
"document": {
|
|
180
233
|
"type": "object",
|
|
181
234
|
"additionalProperties": true,
|
|
182
|
-
"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)."
|
|
235
|
+
"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)."
|
|
236
|
+
},
|
|
237
|
+
"content": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"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."
|
|
240
|
+
},
|
|
241
|
+
"encoding": {
|
|
242
|
+
"$ref": "#/$defs/External_Reference_Encoding",
|
|
243
|
+
"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."
|
|
183
244
|
}
|
|
184
245
|
},
|
|
185
246
|
"unevaluatedProperties": false,
|
|
186
|
-
"$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.",
|
|
247
|
+
"$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.",
|
|
187
248
|
"examples": [
|
|
188
249
|
{
|
|
189
250
|
"sourceName": "cve",
|
|
@@ -229,6 +290,28 @@
|
|
|
229
290
|
}
|
|
230
291
|
]
|
|
231
292
|
}
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"sourceName": "openscap",
|
|
296
|
+
"rel": "raw-source",
|
|
297
|
+
"mediaType": "application/xml",
|
|
298
|
+
"encoding": "utf-8",
|
|
299
|
+
"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>",
|
|
300
|
+
"checksum": {
|
|
301
|
+
"algorithm": "sha256",
|
|
302
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
"sourceName": "fortify",
|
|
307
|
+
"rel": "raw-source",
|
|
308
|
+
"mediaType": "application/zip",
|
|
309
|
+
"encoding": "base64",
|
|
310
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
311
|
+
"checksum": {
|
|
312
|
+
"algorithm": "sha256",
|
|
313
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
314
|
+
}
|
|
232
315
|
}
|
|
233
316
|
]
|
|
234
317
|
},
|
|
@@ -240,7 +323,7 @@
|
|
|
240
323
|
"sha512",
|
|
241
324
|
"blake3"
|
|
242
325
|
],
|
|
243
|
-
"description": "
|
|
326
|
+
"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.",
|
|
244
327
|
"title": "Hash Algorithm"
|
|
245
328
|
},
|
|
246
329
|
"Requirement_Group": {
|
|
@@ -398,7 +481,33 @@
|
|
|
398
481
|
}
|
|
399
482
|
],
|
|
400
483
|
"description": "A reference to an external document.",
|
|
401
|
-
"title": "Reference"
|
|
484
|
+
"title": "Reference",
|
|
485
|
+
"unevaluatedProperties": false,
|
|
486
|
+
"$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.",
|
|
487
|
+
"examples": [
|
|
488
|
+
{
|
|
489
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"ref": "NIST SP 800-53 Rev 5, AC-6"
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"ref": "CIS Benchmark for RHEL 9, 1.1.1",
|
|
496
|
+
"url": "https://www.cisecurity.org/benchmark/red_hat_linux"
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"ref": [
|
|
500
|
+
{
|
|
501
|
+
"identifier": "2921",
|
|
502
|
+
"publisher": "DISA",
|
|
503
|
+
"type": "DPMS Target"
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"uri": "https://attack.mitre.org/techniques/T1059/"
|
|
509
|
+
}
|
|
510
|
+
]
|
|
402
511
|
},
|
|
403
512
|
"Source_Location": {
|
|
404
513
|
"type": "object",
|
|
@@ -916,6 +1025,10 @@
|
|
|
916
1025
|
"type": "string",
|
|
917
1026
|
"description": "The title - should be human readable."
|
|
918
1027
|
},
|
|
1028
|
+
"description": {
|
|
1029
|
+
"type": "string",
|
|
1030
|
+
"description": "Prose description of the baseline, more detailed than summary. Carried verbatim, like every HDF prose field."
|
|
1031
|
+
},
|
|
919
1032
|
"maintainer": {
|
|
920
1033
|
"type": "string",
|
|
921
1034
|
"description": "The maintainer(s)."
|
|
@@ -994,7 +1107,7 @@
|
|
|
994
1107
|
},
|
|
995
1108
|
"id": {
|
|
996
1109
|
"type": "string",
|
|
997
|
-
"description": "The requirement identifier. Example: 'SV-238196'."
|
|
1110
|
+
"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."
|
|
998
1111
|
},
|
|
999
1112
|
"title": {
|
|
1000
1113
|
"type": "string",
|
|
@@ -1212,9 +1325,9 @@
|
|
|
1212
1325
|
}
|
|
1213
1326
|
}
|
|
1214
1327
|
},
|
|
1215
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1328
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
|
|
1216
1329
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1217
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1330
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
|
|
1218
1331
|
"title": "HDF Amendment Primitives",
|
|
1219
1332
|
"description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
|
|
1220
1333
|
"$defs": {
|
|
@@ -1229,7 +1342,7 @@
|
|
|
1229
1342
|
"riskAdjustment",
|
|
1230
1343
|
"operationalRequirement"
|
|
1231
1344
|
],
|
|
1232
|
-
"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.",
|
|
1345
|
+
"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.",
|
|
1233
1346
|
"title": "Override Type"
|
|
1234
1347
|
},
|
|
1235
1348
|
"Justification": {
|
|
@@ -1269,7 +1382,7 @@
|
|
|
1269
1382
|
},
|
|
1270
1383
|
"Standalone_Override": {
|
|
1271
1384
|
"type": "object",
|
|
1272
|
-
"description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation
|
|
1385
|
+
"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).",
|
|
1273
1386
|
"unevaluatedProperties": false,
|
|
1274
1387
|
"required": [
|
|
1275
1388
|
"type",
|
|
@@ -1279,53 +1392,78 @@
|
|
|
1279
1392
|
"appliedAt",
|
|
1280
1393
|
"expiresAt"
|
|
1281
1394
|
],
|
|
1282
|
-
"
|
|
1283
|
-
|
|
1284
|
-
"
|
|
1285
|
-
"
|
|
1286
|
-
"
|
|
1395
|
+
"allOf": [
|
|
1396
|
+
{
|
|
1397
|
+
"if": {
|
|
1398
|
+
"properties": {
|
|
1399
|
+
"type": {
|
|
1400
|
+
"enum": [
|
|
1401
|
+
"operationalRequirement"
|
|
1402
|
+
]
|
|
1403
|
+
}
|
|
1404
|
+
},
|
|
1405
|
+
"required": [
|
|
1406
|
+
"type"
|
|
1407
|
+
]
|
|
1408
|
+
},
|
|
1409
|
+
"then": {
|
|
1410
|
+
"not": {
|
|
1411
|
+
"anyOf": [
|
|
1412
|
+
{
|
|
1413
|
+
"required": [
|
|
1414
|
+
"status"
|
|
1415
|
+
]
|
|
1416
|
+
},
|
|
1417
|
+
{
|
|
1418
|
+
"required": [
|
|
1419
|
+
"impact"
|
|
1420
|
+
]
|
|
1421
|
+
}
|
|
1422
|
+
]
|
|
1423
|
+
}
|
|
1424
|
+
},
|
|
1425
|
+
"else": {
|
|
1426
|
+
"anyOf": [
|
|
1427
|
+
{
|
|
1428
|
+
"required": [
|
|
1429
|
+
"status"
|
|
1430
|
+
]
|
|
1431
|
+
},
|
|
1432
|
+
{
|
|
1433
|
+
"required": [
|
|
1434
|
+
"impact"
|
|
1435
|
+
]
|
|
1436
|
+
}
|
|
1287
1437
|
]
|
|
1288
1438
|
}
|
|
1289
1439
|
},
|
|
1290
|
-
|
|
1291
|
-
"
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
"required": [
|
|
1299
|
-
"status"
|
|
1300
|
-
]
|
|
1440
|
+
{
|
|
1441
|
+
"if": {
|
|
1442
|
+
"properties": {
|
|
1443
|
+
"type": {
|
|
1444
|
+
"enum": [
|
|
1445
|
+
"riskAdjustment"
|
|
1446
|
+
]
|
|
1447
|
+
}
|
|
1301
1448
|
},
|
|
1302
|
-
{
|
|
1303
|
-
"required": [
|
|
1304
|
-
"impact"
|
|
1305
|
-
]
|
|
1306
|
-
}
|
|
1307
|
-
]
|
|
1308
|
-
}
|
|
1309
|
-
},
|
|
1310
|
-
"else": {
|
|
1311
|
-
"anyOf": [
|
|
1312
|
-
{
|
|
1313
1449
|
"required": [
|
|
1314
|
-
"
|
|
1450
|
+
"type"
|
|
1315
1451
|
]
|
|
1316
1452
|
},
|
|
1317
|
-
{
|
|
1318
|
-
"
|
|
1319
|
-
"
|
|
1320
|
-
|
|
1453
|
+
"then": {
|
|
1454
|
+
"not": {
|
|
1455
|
+
"required": [
|
|
1456
|
+
"status"
|
|
1457
|
+
]
|
|
1458
|
+
}
|
|
1321
1459
|
}
|
|
1322
|
-
|
|
1323
|
-
|
|
1460
|
+
}
|
|
1461
|
+
],
|
|
1324
1462
|
"properties": {
|
|
1325
1463
|
"externalReferences": {
|
|
1326
1464
|
"type": "array",
|
|
1327
1465
|
"items": {
|
|
1328
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1466
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1329
1467
|
},
|
|
1330
1468
|
"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."
|
|
1331
1469
|
},
|
|
@@ -1336,15 +1474,15 @@
|
|
|
1336
1474
|
"requirementId": {
|
|
1337
1475
|
"type": "string",
|
|
1338
1476
|
"minLength": 1,
|
|
1339
|
-
"description": "The
|
|
1477
|
+
"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."
|
|
1340
1478
|
},
|
|
1341
1479
|
"baselineRef": {
|
|
1342
1480
|
"type": "string",
|
|
1343
1481
|
"description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
|
|
1344
1482
|
},
|
|
1345
1483
|
"status": {
|
|
1346
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1347
|
-
"description": "The new status this
|
|
1484
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
1485
|
+
"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."
|
|
1348
1486
|
},
|
|
1349
1487
|
"impact": {
|
|
1350
1488
|
"$ref": "#/$defs/Impact_Override",
|
|
@@ -1355,7 +1493,7 @@
|
|
|
1355
1493
|
"description": "Justification for this amendment."
|
|
1356
1494
|
},
|
|
1357
1495
|
"appliedBy": {
|
|
1358
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1496
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1359
1497
|
"description": "Identity of who applied this amendment."
|
|
1360
1498
|
},
|
|
1361
1499
|
"appliedAt": {
|
|
@@ -1371,20 +1509,20 @@
|
|
|
1371
1509
|
"evidence": {
|
|
1372
1510
|
"type": "array",
|
|
1373
1511
|
"items": {
|
|
1374
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1512
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1375
1513
|
},
|
|
1376
1514
|
"description": "Supporting evidence (screenshots, logs, URLs, documents)."
|
|
1377
1515
|
},
|
|
1378
1516
|
"signature": {
|
|
1379
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1517
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1380
1518
|
"description": "Digital signature for non-repudiation."
|
|
1381
1519
|
},
|
|
1382
1520
|
"previousChecksum": {
|
|
1383
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1521
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1384
1522
|
"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."
|
|
1385
1523
|
},
|
|
1386
1524
|
"cvss": {
|
|
1387
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1525
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
1388
1526
|
"$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.",
|
|
1389
1527
|
"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."
|
|
1390
1528
|
},
|
|
@@ -1395,7 +1533,7 @@
|
|
|
1395
1533
|
"milestones": {
|
|
1396
1534
|
"type": "array",
|
|
1397
1535
|
"items": {
|
|
1398
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1536
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
1399
1537
|
},
|
|
1400
1538
|
"description": "Remediation milestones (primarily for POA&M type amendments)."
|
|
1401
1539
|
},
|
|
@@ -1412,7 +1550,7 @@
|
|
|
1412
1550
|
"affectedPackages": {
|
|
1413
1551
|
"type": "array",
|
|
1414
1552
|
"items": {
|
|
1415
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
1553
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
|
|
1416
1554
|
},
|
|
1417
1555
|
"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)."
|
|
1418
1556
|
}
|
|
@@ -1545,9 +1683,9 @@
|
|
|
1545
1683
|
}
|
|
1546
1684
|
}
|
|
1547
1685
|
},
|
|
1548
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1686
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
|
|
1549
1687
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1550
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1688
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
|
|
1551
1689
|
"title": "HDF Result Primitives",
|
|
1552
1690
|
"description": "Types for representing assessment results and statuses.",
|
|
1553
1691
|
"$defs": {
|
|
@@ -1612,6 +1750,10 @@
|
|
|
1612
1750
|
"type": "string"
|
|
1613
1751
|
},
|
|
1614
1752
|
"description": "The stacktrace/backtrace of the exception if one occurred."
|
|
1753
|
+
},
|
|
1754
|
+
"rawSourceRecord": {
|
|
1755
|
+
"$ref": "#/$defs/Raw_Source_Record",
|
|
1756
|
+
"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."
|
|
1615
1757
|
}
|
|
1616
1758
|
},
|
|
1617
1759
|
"examples": [
|
|
@@ -1642,6 +1784,60 @@
|
|
|
1642
1784
|
"description": "A test within a requirement and its results and findings such as how long it took to run.",
|
|
1643
1785
|
"title": "Requirement Result"
|
|
1644
1786
|
},
|
|
1787
|
+
"Raw_Source_Record": {
|
|
1788
|
+
"type": "object",
|
|
1789
|
+
"additionalProperties": false,
|
|
1790
|
+
"required": [
|
|
1791
|
+
"content",
|
|
1792
|
+
"encoding",
|
|
1793
|
+
"mediaType"
|
|
1794
|
+
],
|
|
1795
|
+
"properties": {
|
|
1796
|
+
"content": {
|
|
1797
|
+
"type": "string",
|
|
1798
|
+
"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."
|
|
1799
|
+
},
|
|
1800
|
+
"encoding": {
|
|
1801
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference_Encoding",
|
|
1802
|
+
"description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
|
|
1803
|
+
},
|
|
1804
|
+
"mediaType": {
|
|
1805
|
+
"type": "string",
|
|
1806
|
+
"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."
|
|
1807
|
+
},
|
|
1808
|
+
"pointer": {
|
|
1809
|
+
"type": "string",
|
|
1810
|
+
"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."
|
|
1811
|
+
}
|
|
1812
|
+
},
|
|
1813
|
+
"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.",
|
|
1814
|
+
"$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.",
|
|
1815
|
+
"examples": [
|
|
1816
|
+
{
|
|
1817
|
+
"content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
|
|
1818
|
+
"encoding": "utf-8",
|
|
1819
|
+
"mediaType": "application/json",
|
|
1820
|
+
"pointer": "/matches/3"
|
|
1821
|
+
},
|
|
1822
|
+
{
|
|
1823
|
+
"content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
|
|
1824
|
+
"encoding": "utf-8",
|
|
1825
|
+
"mediaType": "application/xml",
|
|
1826
|
+
"pointer": "/Benchmark/TestResult/rule-result[4]"
|
|
1827
|
+
},
|
|
1828
|
+
{
|
|
1829
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
|
|
1830
|
+
"encoding": "base64",
|
|
1831
|
+
"mediaType": "application/octet-stream"
|
|
1832
|
+
},
|
|
1833
|
+
{
|
|
1834
|
+
"content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
|
|
1835
|
+
"encoding": "utf-8",
|
|
1836
|
+
"mediaType": "text/csv"
|
|
1837
|
+
}
|
|
1838
|
+
],
|
|
1839
|
+
"title": "Raw Source Record"
|
|
1840
|
+
},
|
|
1645
1841
|
"Requirement_Description": {
|
|
1646
1842
|
"type": "object",
|
|
1647
1843
|
"unevaluatedProperties": false,
|
|
@@ -1678,9 +1874,9 @@
|
|
|
1678
1874
|
}
|
|
1679
1875
|
}
|
|
1680
1876
|
},
|
|
1681
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1877
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
|
|
1682
1878
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1683
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1879
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
|
|
1684
1880
|
"title": "HDF CVSS Primitives",
|
|
1685
1881
|
"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).",
|
|
1686
1882
|
"$defs": {
|
|
@@ -1877,9 +2073,9 @@
|
|
|
1877
2073
|
}
|
|
1878
2074
|
}
|
|
1879
2075
|
},
|
|
1880
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2076
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
|
|
1881
2077
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1882
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2078
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
|
|
1883
2079
|
"title": "HDF Affected Package Primitives",
|
|
1884
2080
|
"description": "Types for representing the software package(s) affected by a vulnerability finding.",
|
|
1885
2081
|
"$defs": {
|
|
@@ -1987,12 +2183,183 @@
|
|
|
1987
2183
|
}
|
|
1988
2184
|
}
|
|
1989
2185
|
},
|
|
1990
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
2186
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
|
|
1991
2187
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1992
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
2188
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
|
|
1993
2189
|
"title": "HDF Extension Primitives",
|
|
1994
|
-
"description": "Extension types for waivers, attestations, generators, and
|
|
2190
|
+
"description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
|
|
1995
2191
|
"$defs": {
|
|
2192
|
+
"Raw_Source_Artifact": {
|
|
2193
|
+
"allOf": [
|
|
2194
|
+
{
|
|
2195
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
2196
|
+
},
|
|
2197
|
+
{
|
|
2198
|
+
"not": {
|
|
2199
|
+
"required": [
|
|
2200
|
+
"document"
|
|
2201
|
+
]
|
|
2202
|
+
}
|
|
2203
|
+
},
|
|
2204
|
+
{
|
|
2205
|
+
"if": {
|
|
2206
|
+
"required": [
|
|
2207
|
+
"content"
|
|
2208
|
+
]
|
|
2209
|
+
},
|
|
2210
|
+
"then": {
|
|
2211
|
+
"required": [
|
|
2212
|
+
"encoding",
|
|
2213
|
+
"mediaType"
|
|
2214
|
+
]
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
],
|
|
2218
|
+
"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`.",
|
|
2219
|
+
"$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.",
|
|
2220
|
+
"examples": [
|
|
2221
|
+
{
|
|
2222
|
+
"sourceName": "grype",
|
|
2223
|
+
"rel": "raw-source",
|
|
2224
|
+
"mediaType": "application/json",
|
|
2225
|
+
"encoding": "utf-8",
|
|
2226
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
2227
|
+
"checksum": {
|
|
2228
|
+
"algorithm": "sha256",
|
|
2229
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
2230
|
+
}
|
|
2231
|
+
},
|
|
2232
|
+
{
|
|
2233
|
+
"sourceName": "openscap",
|
|
2234
|
+
"rel": "raw-source",
|
|
2235
|
+
"mediaType": "application/xml",
|
|
2236
|
+
"encoding": "utf-8",
|
|
2237
|
+
"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>",
|
|
2238
|
+
"checksum": {
|
|
2239
|
+
"algorithm": "sha256",
|
|
2240
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
2241
|
+
}
|
|
2242
|
+
},
|
|
2243
|
+
{
|
|
2244
|
+
"sourceName": "prisma",
|
|
2245
|
+
"rel": "raw-source",
|
|
2246
|
+
"mediaType": "text/csv",
|
|
2247
|
+
"encoding": "utf-8",
|
|
2248
|
+
"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",
|
|
2249
|
+
"checksum": {
|
|
2250
|
+
"algorithm": "sha256",
|
|
2251
|
+
"value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
|
|
2252
|
+
}
|
|
2253
|
+
},
|
|
2254
|
+
{
|
|
2255
|
+
"sourceName": "fortify",
|
|
2256
|
+
"rel": "raw-source",
|
|
2257
|
+
"mediaType": "application/zip",
|
|
2258
|
+
"encoding": "base64",
|
|
2259
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
2260
|
+
"checksum": {
|
|
2261
|
+
"algorithm": "sha256",
|
|
2262
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
2263
|
+
}
|
|
2264
|
+
},
|
|
2265
|
+
{
|
|
2266
|
+
"sourceName": "nessus",
|
|
2267
|
+
"rel": "raw-source",
|
|
2268
|
+
"href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
|
|
2269
|
+
"mediaType": "application/xml",
|
|
2270
|
+
"checksum": {
|
|
2271
|
+
"algorithm": "sha256",
|
|
2272
|
+
"value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
]
|
|
2276
|
+
},
|
|
2277
|
+
"Extensions": {
|
|
2278
|
+
"type": "object",
|
|
2279
|
+
"additionalProperties": false,
|
|
2280
|
+
"properties": {
|
|
2281
|
+
"passthrough": {
|
|
2282
|
+
"type": "object",
|
|
2283
|
+
"additionalProperties": true,
|
|
2284
|
+
"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.",
|
|
2285
|
+
"examples": [
|
|
2286
|
+
{
|
|
2287
|
+
"auxiliary_data": [
|
|
2288
|
+
{
|
|
2289
|
+
"name": "Scoutsuite",
|
|
2290
|
+
"data": {
|
|
2291
|
+
"last_run": {
|
|
2292
|
+
"ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
|
|
2293
|
+
}
|
|
2294
|
+
}
|
|
2295
|
+
}
|
|
2296
|
+
]
|
|
2297
|
+
},
|
|
2298
|
+
{
|
|
2299
|
+
"audit": {
|
|
2300
|
+
"runId": "r-123"
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
],
|
|
2304
|
+
"$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."
|
|
2305
|
+
},
|
|
2306
|
+
"rawSourceArtifacts": {
|
|
2307
|
+
"type": "array",
|
|
2308
|
+
"items": {
|
|
2309
|
+
"$ref": "#/$defs/Raw_Source_Artifact"
|
|
2310
|
+
},
|
|
2311
|
+
"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."
|
|
2312
|
+
}
|
|
2313
|
+
},
|
|
2314
|
+
"title": "Extensions",
|
|
2315
|
+
"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.",
|
|
2316
|
+
"$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.",
|
|
2317
|
+
"examples": [
|
|
2318
|
+
{
|
|
2319
|
+
"passthrough": {
|
|
2320
|
+
"auxiliary_data": [
|
|
2321
|
+
{
|
|
2322
|
+
"name": "Grype",
|
|
2323
|
+
"data": {
|
|
2324
|
+
"descriptor": {
|
|
2325
|
+
"name": "grype",
|
|
2326
|
+
"version": "0.74.0"
|
|
2327
|
+
}
|
|
2328
|
+
}
|
|
2329
|
+
}
|
|
2330
|
+
]
|
|
2331
|
+
},
|
|
2332
|
+
"rawSourceArtifacts": [
|
|
2333
|
+
{
|
|
2334
|
+
"sourceName": "grype",
|
|
2335
|
+
"rel": "raw-source",
|
|
2336
|
+
"mediaType": "application/json",
|
|
2337
|
+
"encoding": "utf-8",
|
|
2338
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
2339
|
+
"checksum": {
|
|
2340
|
+
"algorithm": "sha256",
|
|
2341
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
]
|
|
2345
|
+
},
|
|
2346
|
+
{
|
|
2347
|
+
"rawSourceArtifacts": [
|
|
2348
|
+
{
|
|
2349
|
+
"sourceName": "fortify",
|
|
2350
|
+
"rel": "raw-source",
|
|
2351
|
+
"mediaType": "application/zip",
|
|
2352
|
+
"encoding": "base64",
|
|
2353
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
2354
|
+
"checksum": {
|
|
2355
|
+
"algorithm": "sha256",
|
|
2356
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
2357
|
+
}
|
|
2358
|
+
}
|
|
2359
|
+
]
|
|
2360
|
+
}
|
|
2361
|
+
]
|
|
2362
|
+
},
|
|
1996
2363
|
"Status_Override": {
|
|
1997
2364
|
"type": "object",
|
|
1998
2365
|
"unevaluatedProperties": false,
|
|
@@ -2003,44 +2370,99 @@
|
|
|
2003
2370
|
"appliedAt",
|
|
2004
2371
|
"expiresAt"
|
|
2005
2372
|
],
|
|
2006
|
-
"
|
|
2373
|
+
"allOf": [
|
|
2007
2374
|
{
|
|
2008
|
-
"
|
|
2009
|
-
"
|
|
2010
|
-
|
|
2375
|
+
"if": {
|
|
2376
|
+
"properties": {
|
|
2377
|
+
"type": {
|
|
2378
|
+
"enum": [
|
|
2379
|
+
"operationalRequirement"
|
|
2380
|
+
]
|
|
2381
|
+
}
|
|
2382
|
+
},
|
|
2383
|
+
"required": [
|
|
2384
|
+
"type"
|
|
2385
|
+
]
|
|
2386
|
+
},
|
|
2387
|
+
"then": {
|
|
2388
|
+
"not": {
|
|
2389
|
+
"anyOf": [
|
|
2390
|
+
{
|
|
2391
|
+
"required": [
|
|
2392
|
+
"status"
|
|
2393
|
+
]
|
|
2394
|
+
},
|
|
2395
|
+
{
|
|
2396
|
+
"required": [
|
|
2397
|
+
"impact"
|
|
2398
|
+
]
|
|
2399
|
+
}
|
|
2400
|
+
]
|
|
2401
|
+
}
|
|
2402
|
+
},
|
|
2403
|
+
"else": {
|
|
2404
|
+
"anyOf": [
|
|
2405
|
+
{
|
|
2406
|
+
"required": [
|
|
2407
|
+
"status"
|
|
2408
|
+
]
|
|
2409
|
+
},
|
|
2410
|
+
{
|
|
2411
|
+
"required": [
|
|
2412
|
+
"impact"
|
|
2413
|
+
]
|
|
2414
|
+
}
|
|
2415
|
+
]
|
|
2416
|
+
}
|
|
2011
2417
|
},
|
|
2012
2418
|
{
|
|
2013
|
-
"
|
|
2014
|
-
"
|
|
2015
|
-
|
|
2419
|
+
"if": {
|
|
2420
|
+
"properties": {
|
|
2421
|
+
"type": {
|
|
2422
|
+
"enum": [
|
|
2423
|
+
"riskAdjustment"
|
|
2424
|
+
]
|
|
2425
|
+
}
|
|
2426
|
+
},
|
|
2427
|
+
"required": [
|
|
2428
|
+
"type"
|
|
2429
|
+
]
|
|
2430
|
+
},
|
|
2431
|
+
"then": {
|
|
2432
|
+
"not": {
|
|
2433
|
+
"required": [
|
|
2434
|
+
"status"
|
|
2435
|
+
]
|
|
2436
|
+
}
|
|
2437
|
+
}
|
|
2016
2438
|
}
|
|
2017
2439
|
],
|
|
2018
2440
|
"properties": {
|
|
2019
2441
|
"externalReferences": {
|
|
2020
2442
|
"type": "array",
|
|
2021
2443
|
"items": {
|
|
2022
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2444
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
2023
2445
|
},
|
|
2024
2446
|
"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."
|
|
2025
2447
|
},
|
|
2026
2448
|
"type": {
|
|
2027
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2449
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
|
|
2028
2450
|
"description": "The type of override applied to this requirement."
|
|
2029
2451
|
},
|
|
2030
2452
|
"status": {
|
|
2031
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2032
|
-
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
|
|
2453
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
2454
|
+
"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."
|
|
2033
2455
|
},
|
|
2034
2456
|
"impact": {
|
|
2035
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2036
|
-
"description": "Override to the requirement's impact score.
|
|
2457
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
|
|
2458
|
+
"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."
|
|
2037
2459
|
},
|
|
2038
2460
|
"reason": {
|
|
2039
2461
|
"type": "string",
|
|
2040
2462
|
"description": "Explanation for why this override was applied."
|
|
2041
2463
|
},
|
|
2042
2464
|
"appliedBy": {
|
|
2043
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2465
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
2044
2466
|
"description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
|
|
2045
2467
|
},
|
|
2046
2468
|
"appliedAt": {
|
|
@@ -2054,31 +2476,31 @@
|
|
|
2054
2476
|
"description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
|
|
2055
2477
|
},
|
|
2056
2478
|
"signature": {
|
|
2057
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2479
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
2058
2480
|
"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."
|
|
2059
2481
|
},
|
|
2060
2482
|
"evidence": {
|
|
2061
2483
|
"type": "array",
|
|
2062
2484
|
"items": {
|
|
2063
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2485
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
2064
2486
|
},
|
|
2065
2487
|
"description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
|
|
2066
2488
|
},
|
|
2067
2489
|
"previousChecksum": {
|
|
2068
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2490
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
2069
2491
|
"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."
|
|
2070
2492
|
},
|
|
2071
2493
|
"cvss": {
|
|
2072
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2494
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
2073
2495
|
"$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.",
|
|
2074
2496
|
"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."
|
|
2075
2497
|
},
|
|
2076
2498
|
"justification": {
|
|
2077
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2499
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
|
|
2078
2500
|
"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."
|
|
2079
2501
|
}
|
|
2080
2502
|
},
|
|
2081
|
-
"$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.",
|
|
2503
|
+
"$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.",
|
|
2082
2504
|
"examples": [
|
|
2083
2505
|
{
|
|
2084
2506
|
"type": "waiver",
|
|
@@ -2178,9 +2600,19 @@
|
|
|
2178
2600
|
}
|
|
2179
2601
|
}
|
|
2180
2602
|
]
|
|
2603
|
+
},
|
|
2604
|
+
{
|
|
2605
|
+
"type": "operationalRequirement",
|
|
2606
|
+
"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.",
|
|
2607
|
+
"appliedBy": {
|
|
2608
|
+
"type": "email",
|
|
2609
|
+
"identifier": "system-owner@agency.gov"
|
|
2610
|
+
},
|
|
2611
|
+
"appliedAt": "2026-01-20T10:00:00Z",
|
|
2612
|
+
"expiresAt": "2099-12-31T00:00:00Z"
|
|
2181
2613
|
}
|
|
2182
2614
|
],
|
|
2183
|
-
"description": "An intentional change to a requirement's compliance status and/or impact score.
|
|
2615
|
+
"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.",
|
|
2184
2616
|
"title": "Status Override"
|
|
2185
2617
|
},
|
|
2186
2618
|
"POAM": {
|
|
@@ -2210,7 +2642,7 @@
|
|
|
2210
2642
|
"description": "Detailed explanation of the plan, including what actions will be taken."
|
|
2211
2643
|
},
|
|
2212
2644
|
"appliedBy": {
|
|
2213
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2645
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
2214
2646
|
"description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
|
|
2215
2647
|
},
|
|
2216
2648
|
"appliedAt": {
|
|
@@ -2226,23 +2658,23 @@
|
|
|
2226
2658
|
"milestones": {
|
|
2227
2659
|
"type": "array",
|
|
2228
2660
|
"items": {
|
|
2229
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2661
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
2230
2662
|
},
|
|
2231
2663
|
"description": "Optional array of milestones tracking progress toward completion."
|
|
2232
2664
|
},
|
|
2233
2665
|
"signature": {
|
|
2234
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2666
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
2235
2667
|
"description": "Optional digital signature for enhanced trust and non-repudiation."
|
|
2236
2668
|
},
|
|
2237
2669
|
"evidence": {
|
|
2238
2670
|
"type": "array",
|
|
2239
2671
|
"items": {
|
|
2240
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2672
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
2241
2673
|
},
|
|
2242
2674
|
"description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
|
|
2243
2675
|
},
|
|
2244
2676
|
"previousChecksum": {
|
|
2245
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2677
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
2246
2678
|
"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."
|
|
2247
2679
|
}
|
|
2248
2680
|
},
|
|
@@ -2385,17 +2817,9 @@
|
|
|
2385
2817
|
"Integrity": {
|
|
2386
2818
|
"type": "object",
|
|
2387
2819
|
"unevaluatedProperties": false,
|
|
2388
|
-
"dependentRequired": {
|
|
2389
|
-
"algorithm": [
|
|
2390
|
-
"checksum"
|
|
2391
|
-
],
|
|
2392
|
-
"checksum": [
|
|
2393
|
-
"algorithm"
|
|
2394
|
-
]
|
|
2395
|
-
},
|
|
2396
2820
|
"properties": {
|
|
2397
2821
|
"algorithm": {
|
|
2398
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2822
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
|
|
2399
2823
|
"description": "The hash algorithm used for the checksum."
|
|
2400
2824
|
},
|
|
2401
2825
|
"checksum": {
|
|
@@ -2424,7 +2848,33 @@
|
|
|
2424
2848
|
}
|
|
2425
2849
|
],
|
|
2426
2850
|
"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.",
|
|
2427
|
-
"title": "Integrity"
|
|
2851
|
+
"title": "Integrity",
|
|
2852
|
+
"allOf": [
|
|
2853
|
+
{
|
|
2854
|
+
"if": {
|
|
2855
|
+
"required": [
|
|
2856
|
+
"algorithm"
|
|
2857
|
+
]
|
|
2858
|
+
},
|
|
2859
|
+
"then": {
|
|
2860
|
+
"required": [
|
|
2861
|
+
"checksum"
|
|
2862
|
+
]
|
|
2863
|
+
}
|
|
2864
|
+
},
|
|
2865
|
+
{
|
|
2866
|
+
"if": {
|
|
2867
|
+
"required": [
|
|
2868
|
+
"checksum"
|
|
2869
|
+
]
|
|
2870
|
+
},
|
|
2871
|
+
"then": {
|
|
2872
|
+
"required": [
|
|
2873
|
+
"algorithm"
|
|
2874
|
+
]
|
|
2875
|
+
}
|
|
2876
|
+
}
|
|
2877
|
+
]
|
|
2428
2878
|
}
|
|
2429
2879
|
}
|
|
2430
2880
|
}
|