@mitre/hdf-schema 3.7.2 → 3.8.0-next.42532249979.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/go/hdf.go +348 -181
- 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 +414 -62
- package/dist/schemas/hdf-baseline.schema.json +419 -67
- package/dist/schemas/hdf-comparison.schema.json +730 -153
- package/dist/schemas/hdf-evidence-package.schema.json +418 -65
- package/dist/schemas/hdf-plan.schema.json +420 -68
- package/dist/schemas/hdf-requirement-change-event.schema.json +486 -140
- package/dist/schemas/hdf-results.schema.json +472 -126
- package/dist/schemas/hdf-system.schema.json +435 -83
- package/dist/ts/hdf.d.ts +218 -26
- package/dist/ts/hdf.js +18 -2
- package/dist/ts/hdf.ts +219 -20
- 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-baseline/v3.
|
|
3
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/hdf-baseline/v3.8.0",
|
|
4
4
|
"type": "object",
|
|
5
5
|
"unevaluatedProperties": false,
|
|
6
6
|
"required": [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"allOf": [
|
|
11
11
|
{
|
|
12
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
12
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Baseline_Metadata"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"properties": {
|
|
@@ -24,35 +24,39 @@
|
|
|
24
24
|
"groups": {
|
|
25
25
|
"type": "array",
|
|
26
26
|
"items": {
|
|
27
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
27
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Requirement_Group"
|
|
28
28
|
},
|
|
29
29
|
"description": "A set of descriptions for the requirement groups."
|
|
30
30
|
},
|
|
31
31
|
"inputs": {
|
|
32
32
|
"type": "array",
|
|
33
33
|
"items": {
|
|
34
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.
|
|
34
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.8.0#/$defs/Input"
|
|
35
35
|
},
|
|
36
36
|
"description": "The input(s) or attribute(s) to be used in the run."
|
|
37
37
|
},
|
|
38
38
|
"integrity": {
|
|
39
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
39
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Integrity",
|
|
40
40
|
"description": "Cryptographic integrity information for verifying this baseline has not been tampered with."
|
|
41
41
|
},
|
|
42
42
|
"remediation": {
|
|
43
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
43
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Remediation",
|
|
44
44
|
"description": "Optional reference to automated remediation resources (Ansible playbooks, Terraform scripts, etc.) for implementing the security controls defined in this baseline."
|
|
45
45
|
},
|
|
46
46
|
"depends": {
|
|
47
47
|
"type": "array",
|
|
48
48
|
"items": {
|
|
49
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
49
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Dependency"
|
|
50
50
|
},
|
|
51
51
|
"description": "The set of dependencies this baseline depends on."
|
|
52
52
|
},
|
|
53
53
|
"generator": {
|
|
54
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
54
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Generator",
|
|
55
55
|
"description": "The tool that generated this file."
|
|
56
|
+
},
|
|
57
|
+
"extensions": {
|
|
58
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0#/$defs/Extensions",
|
|
59
|
+
"description": "Producer data outside the HDF model, and the pre-converted source artifact(s) this baseline was converted from."
|
|
56
60
|
}
|
|
57
61
|
},
|
|
58
62
|
"examples": [
|
|
@@ -142,7 +146,7 @@
|
|
|
142
146
|
],
|
|
143
147
|
"allOf": [
|
|
144
148
|
{
|
|
145
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
149
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Requirement_Core"
|
|
146
150
|
}
|
|
147
151
|
],
|
|
148
152
|
"properties": {
|
|
@@ -151,7 +155,7 @@
|
|
|
151
155
|
"description": "Array of labeled descriptions. At least one description with label 'default' must be present. Convention: place default description first. Common labels: 'default', 'check', 'fix', 'rationale'."
|
|
152
156
|
},
|
|
153
157
|
"severity": {
|
|
154
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
158
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Severity",
|
|
155
159
|
"description": "Explicit severity rating. Typically derived from impact score but provided explicitly for clarity."
|
|
156
160
|
}
|
|
157
161
|
},
|
|
@@ -193,16 +197,16 @@
|
|
|
193
197
|
"description": "Array of labeled descriptions. At least one description with label 'default' must be present.",
|
|
194
198
|
"title": "Baseline Requirement Descriptions"
|
|
195
199
|
},
|
|
196
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
200
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0": {
|
|
197
201
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
198
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
202
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0",
|
|
199
203
|
"title": "HDF Common Primitives",
|
|
200
204
|
"description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
|
|
201
205
|
"$defs": {
|
|
202
206
|
"External_Reference": {
|
|
203
207
|
"type": "object",
|
|
204
208
|
"title": "External Reference",
|
|
205
|
-
"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.",
|
|
209
|
+
"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.",
|
|
206
210
|
"required": [
|
|
207
211
|
"sourceName"
|
|
208
212
|
],
|
|
@@ -221,6 +225,42 @@
|
|
|
221
225
|
"required": [
|
|
222
226
|
"description"
|
|
223
227
|
]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"required": [
|
|
231
|
+
"content"
|
|
232
|
+
]
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"required": [
|
|
236
|
+
"document"
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
],
|
|
240
|
+
"allOf": [
|
|
241
|
+
{
|
|
242
|
+
"if": {
|
|
243
|
+
"required": [
|
|
244
|
+
"content"
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"then": {
|
|
248
|
+
"required": [
|
|
249
|
+
"encoding"
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"if": {
|
|
255
|
+
"required": [
|
|
256
|
+
"encoding"
|
|
257
|
+
]
|
|
258
|
+
},
|
|
259
|
+
"then": {
|
|
260
|
+
"required": [
|
|
261
|
+
"content"
|
|
262
|
+
]
|
|
263
|
+
}
|
|
224
264
|
}
|
|
225
265
|
],
|
|
226
266
|
"properties": {
|
|
@@ -236,7 +276,7 @@
|
|
|
236
276
|
"href": {
|
|
237
277
|
"type": "string",
|
|
238
278
|
"format": "uri-reference",
|
|
239
|
-
"description": "Location of the artifact. `uri-reference` (not `uri`) so a bare internal `#fragment`/`#uuid` reference is expressible alongside absolute URLs.
|
|
279
|
+
"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."
|
|
240
280
|
},
|
|
241
281
|
"description": {
|
|
242
282
|
"type": "string",
|
|
@@ -248,11 +288,11 @@
|
|
|
248
288
|
},
|
|
249
289
|
"mediaType": {
|
|
250
290
|
"type": "string",
|
|
251
|
-
"description": "IANA media type of the
|
|
291
|
+
"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`."
|
|
252
292
|
},
|
|
253
293
|
"checksum": {
|
|
254
294
|
"$ref": "#/$defs/Checksum",
|
|
255
|
-
"description": "Integrity hash of the
|
|
295
|
+
"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."
|
|
256
296
|
},
|
|
257
297
|
"addedBy": {
|
|
258
298
|
"$ref": "#/$defs/Identity",
|
|
@@ -271,11 +311,24 @@
|
|
|
271
311
|
"document": {
|
|
272
312
|
"type": "object",
|
|
273
313
|
"additionalProperties": true,
|
|
274
|
-
"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)."
|
|
314
|
+
"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)."
|
|
315
|
+
},
|
|
316
|
+
"content": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"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."
|
|
319
|
+
},
|
|
320
|
+
"encoding": {
|
|
321
|
+
"type": "string",
|
|
322
|
+
"title": "External Reference Encoding",
|
|
323
|
+
"enum": [
|
|
324
|
+
"utf-8",
|
|
325
|
+
"base64"
|
|
326
|
+
],
|
|
327
|
+
"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."
|
|
275
328
|
}
|
|
276
329
|
},
|
|
277
330
|
"unevaluatedProperties": false,
|
|
278
|
-
"$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.",
|
|
331
|
+
"$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.",
|
|
279
332
|
"examples": [
|
|
280
333
|
{
|
|
281
334
|
"sourceName": "cve",
|
|
@@ -321,6 +374,28 @@
|
|
|
321
374
|
}
|
|
322
375
|
]
|
|
323
376
|
}
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"sourceName": "openscap",
|
|
380
|
+
"rel": "raw-source",
|
|
381
|
+
"mediaType": "application/xml",
|
|
382
|
+
"encoding": "utf-8",
|
|
383
|
+
"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>",
|
|
384
|
+
"checksum": {
|
|
385
|
+
"algorithm": "sha256",
|
|
386
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"sourceName": "fortify",
|
|
391
|
+
"rel": "raw-source",
|
|
392
|
+
"mediaType": "application/zip",
|
|
393
|
+
"encoding": "base64",
|
|
394
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
395
|
+
"checksum": {
|
|
396
|
+
"algorithm": "sha256",
|
|
397
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
398
|
+
}
|
|
324
399
|
}
|
|
325
400
|
]
|
|
326
401
|
},
|
|
@@ -332,7 +407,7 @@
|
|
|
332
407
|
"sha512",
|
|
333
408
|
"blake3"
|
|
334
409
|
],
|
|
335
|
-
"description": "
|
|
410
|
+
"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.",
|
|
336
411
|
"title": "Hash Algorithm"
|
|
337
412
|
},
|
|
338
413
|
"Requirement_Group": {
|
|
@@ -490,7 +565,33 @@
|
|
|
490
565
|
}
|
|
491
566
|
],
|
|
492
567
|
"description": "A reference to an external document.",
|
|
493
|
-
"title": "Reference"
|
|
568
|
+
"title": "Reference",
|
|
569
|
+
"unevaluatedProperties": false,
|
|
570
|
+
"$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.",
|
|
571
|
+
"examples": [
|
|
572
|
+
{
|
|
573
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"ref": "NIST SP 800-53 Rev 5, AC-6"
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"ref": "CIS Benchmark for RHEL 9, 1.1.1",
|
|
580
|
+
"url": "https://www.cisecurity.org/benchmark/red_hat_linux"
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"ref": [
|
|
584
|
+
{
|
|
585
|
+
"identifier": "2921",
|
|
586
|
+
"publisher": "DISA",
|
|
587
|
+
"type": "DPMS Target"
|
|
588
|
+
}
|
|
589
|
+
]
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"uri": "https://attack.mitre.org/techniques/T1059/"
|
|
593
|
+
}
|
|
594
|
+
]
|
|
494
595
|
},
|
|
495
596
|
"Source_Location": {
|
|
496
597
|
"type": "object",
|
|
@@ -1304,9 +1405,9 @@
|
|
|
1304
1405
|
}
|
|
1305
1406
|
}
|
|
1306
1407
|
},
|
|
1307
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.
|
|
1408
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.8.0": {
|
|
1308
1409
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1309
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.
|
|
1410
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.8.0",
|
|
1310
1411
|
"title": "HDF Parameter Primitives",
|
|
1311
1412
|
"description": "Input/parameter type definitions for typed, traceable configuration values that bridge governance prose and scanner automation.",
|
|
1312
1413
|
"$defs": {
|
|
@@ -1437,12 +1538,183 @@
|
|
|
1437
1538
|
}
|
|
1438
1539
|
}
|
|
1439
1540
|
},
|
|
1440
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1541
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
|
|
1441
1542
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1442
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1543
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
|
|
1443
1544
|
"title": "HDF Extension Primitives",
|
|
1444
|
-
"description": "Extension types for waivers, attestations, generators, and
|
|
1545
|
+
"description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
|
|
1445
1546
|
"$defs": {
|
|
1547
|
+
"Raw_Source_Artifact": {
|
|
1548
|
+
"allOf": [
|
|
1549
|
+
{
|
|
1550
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
"not": {
|
|
1554
|
+
"required": [
|
|
1555
|
+
"document"
|
|
1556
|
+
]
|
|
1557
|
+
}
|
|
1558
|
+
},
|
|
1559
|
+
{
|
|
1560
|
+
"if": {
|
|
1561
|
+
"required": [
|
|
1562
|
+
"content"
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
"then": {
|
|
1566
|
+
"required": [
|
|
1567
|
+
"encoding",
|
|
1568
|
+
"mediaType"
|
|
1569
|
+
]
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
],
|
|
1573
|
+
"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`.",
|
|
1574
|
+
"$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.",
|
|
1575
|
+
"examples": [
|
|
1576
|
+
{
|
|
1577
|
+
"sourceName": "grype",
|
|
1578
|
+
"rel": "raw-source",
|
|
1579
|
+
"mediaType": "application/json",
|
|
1580
|
+
"encoding": "utf-8",
|
|
1581
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1582
|
+
"checksum": {
|
|
1583
|
+
"algorithm": "sha256",
|
|
1584
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1585
|
+
}
|
|
1586
|
+
},
|
|
1587
|
+
{
|
|
1588
|
+
"sourceName": "openscap",
|
|
1589
|
+
"rel": "raw-source",
|
|
1590
|
+
"mediaType": "application/xml",
|
|
1591
|
+
"encoding": "utf-8",
|
|
1592
|
+
"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>",
|
|
1593
|
+
"checksum": {
|
|
1594
|
+
"algorithm": "sha256",
|
|
1595
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
1596
|
+
}
|
|
1597
|
+
},
|
|
1598
|
+
{
|
|
1599
|
+
"sourceName": "prisma",
|
|
1600
|
+
"rel": "raw-source",
|
|
1601
|
+
"mediaType": "text/csv",
|
|
1602
|
+
"encoding": "utf-8",
|
|
1603
|
+
"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",
|
|
1604
|
+
"checksum": {
|
|
1605
|
+
"algorithm": "sha256",
|
|
1606
|
+
"value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
|
|
1607
|
+
}
|
|
1608
|
+
},
|
|
1609
|
+
{
|
|
1610
|
+
"sourceName": "fortify",
|
|
1611
|
+
"rel": "raw-source",
|
|
1612
|
+
"mediaType": "application/zip",
|
|
1613
|
+
"encoding": "base64",
|
|
1614
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1615
|
+
"checksum": {
|
|
1616
|
+
"algorithm": "sha256",
|
|
1617
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1618
|
+
}
|
|
1619
|
+
},
|
|
1620
|
+
{
|
|
1621
|
+
"sourceName": "nessus",
|
|
1622
|
+
"rel": "raw-source",
|
|
1623
|
+
"href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
|
|
1624
|
+
"mediaType": "application/xml",
|
|
1625
|
+
"checksum": {
|
|
1626
|
+
"algorithm": "sha256",
|
|
1627
|
+
"value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
]
|
|
1631
|
+
},
|
|
1632
|
+
"Extensions": {
|
|
1633
|
+
"type": "object",
|
|
1634
|
+
"additionalProperties": false,
|
|
1635
|
+
"properties": {
|
|
1636
|
+
"passthrough": {
|
|
1637
|
+
"type": "object",
|
|
1638
|
+
"additionalProperties": true,
|
|
1639
|
+
"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.",
|
|
1640
|
+
"examples": [
|
|
1641
|
+
{
|
|
1642
|
+
"auxiliary_data": [
|
|
1643
|
+
{
|
|
1644
|
+
"name": "Scoutsuite",
|
|
1645
|
+
"data": {
|
|
1646
|
+
"last_run": {
|
|
1647
|
+
"ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
]
|
|
1652
|
+
},
|
|
1653
|
+
{
|
|
1654
|
+
"audit": {
|
|
1655
|
+
"runId": "r-123"
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
],
|
|
1659
|
+
"$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."
|
|
1660
|
+
},
|
|
1661
|
+
"rawSourceArtifacts": {
|
|
1662
|
+
"type": "array",
|
|
1663
|
+
"items": {
|
|
1664
|
+
"$ref": "#/$defs/Raw_Source_Artifact"
|
|
1665
|
+
},
|
|
1666
|
+
"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."
|
|
1667
|
+
}
|
|
1668
|
+
},
|
|
1669
|
+
"title": "Extensions",
|
|
1670
|
+
"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.",
|
|
1671
|
+
"$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.",
|
|
1672
|
+
"examples": [
|
|
1673
|
+
{
|
|
1674
|
+
"passthrough": {
|
|
1675
|
+
"auxiliary_data": [
|
|
1676
|
+
{
|
|
1677
|
+
"name": "Grype",
|
|
1678
|
+
"data": {
|
|
1679
|
+
"descriptor": {
|
|
1680
|
+
"name": "grype",
|
|
1681
|
+
"version": "0.74.0"
|
|
1682
|
+
}
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
]
|
|
1686
|
+
},
|
|
1687
|
+
"rawSourceArtifacts": [
|
|
1688
|
+
{
|
|
1689
|
+
"sourceName": "grype",
|
|
1690
|
+
"rel": "raw-source",
|
|
1691
|
+
"mediaType": "application/json",
|
|
1692
|
+
"encoding": "utf-8",
|
|
1693
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1694
|
+
"checksum": {
|
|
1695
|
+
"algorithm": "sha256",
|
|
1696
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
]
|
|
1700
|
+
},
|
|
1701
|
+
{
|
|
1702
|
+
"rawSourceArtifacts": [
|
|
1703
|
+
{
|
|
1704
|
+
"sourceName": "fortify",
|
|
1705
|
+
"rel": "raw-source",
|
|
1706
|
+
"mediaType": "application/zip",
|
|
1707
|
+
"encoding": "base64",
|
|
1708
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1709
|
+
"checksum": {
|
|
1710
|
+
"algorithm": "sha256",
|
|
1711
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
]
|
|
1715
|
+
}
|
|
1716
|
+
]
|
|
1717
|
+
},
|
|
1446
1718
|
"Status_Override": {
|
|
1447
1719
|
"type": "object",
|
|
1448
1720
|
"unevaluatedProperties": false,
|
|
@@ -1469,20 +1741,20 @@
|
|
|
1469
1741
|
"externalReferences": {
|
|
1470
1742
|
"type": "array",
|
|
1471
1743
|
"items": {
|
|
1472
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1744
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1473
1745
|
},
|
|
1474
1746
|
"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."
|
|
1475
1747
|
},
|
|
1476
1748
|
"type": {
|
|
1477
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1749
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
|
|
1478
1750
|
"description": "The type of override applied to this requirement."
|
|
1479
1751
|
},
|
|
1480
1752
|
"status": {
|
|
1481
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1753
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
1482
1754
|
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
|
|
1483
1755
|
},
|
|
1484
1756
|
"impact": {
|
|
1485
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1757
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
|
|
1486
1758
|
"description": "Override to the requirement's impact score. At least one of status or impact must be set."
|
|
1487
1759
|
},
|
|
1488
1760
|
"reason": {
|
|
@@ -1490,7 +1762,7 @@
|
|
|
1490
1762
|
"description": "Explanation for why this override was applied."
|
|
1491
1763
|
},
|
|
1492
1764
|
"appliedBy": {
|
|
1493
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1765
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1494
1766
|
"description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
|
|
1495
1767
|
},
|
|
1496
1768
|
"appliedAt": {
|
|
@@ -1504,27 +1776,27 @@
|
|
|
1504
1776
|
"description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
|
|
1505
1777
|
},
|
|
1506
1778
|
"signature": {
|
|
1507
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1779
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1508
1780
|
"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."
|
|
1509
1781
|
},
|
|
1510
1782
|
"evidence": {
|
|
1511
1783
|
"type": "array",
|
|
1512
1784
|
"items": {
|
|
1513
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1785
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1514
1786
|
},
|
|
1515
1787
|
"description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
|
|
1516
1788
|
},
|
|
1517
1789
|
"previousChecksum": {
|
|
1518
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1790
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1519
1791
|
"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."
|
|
1520
1792
|
},
|
|
1521
1793
|
"cvss": {
|
|
1522
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1794
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
1523
1795
|
"$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.",
|
|
1524
1796
|
"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."
|
|
1525
1797
|
},
|
|
1526
1798
|
"justification": {
|
|
1527
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1799
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
|
|
1528
1800
|
"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."
|
|
1529
1801
|
}
|
|
1530
1802
|
},
|
|
@@ -1660,7 +1932,7 @@
|
|
|
1660
1932
|
"description": "Detailed explanation of the plan, including what actions will be taken."
|
|
1661
1933
|
},
|
|
1662
1934
|
"appliedBy": {
|
|
1663
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1935
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1664
1936
|
"description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
|
|
1665
1937
|
},
|
|
1666
1938
|
"appliedAt": {
|
|
@@ -1676,23 +1948,23 @@
|
|
|
1676
1948
|
"milestones": {
|
|
1677
1949
|
"type": "array",
|
|
1678
1950
|
"items": {
|
|
1679
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1951
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
1680
1952
|
},
|
|
1681
1953
|
"description": "Optional array of milestones tracking progress toward completion."
|
|
1682
1954
|
},
|
|
1683
1955
|
"signature": {
|
|
1684
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1956
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1685
1957
|
"description": "Optional digital signature for enhanced trust and non-repudiation."
|
|
1686
1958
|
},
|
|
1687
1959
|
"evidence": {
|
|
1688
1960
|
"type": "array",
|
|
1689
1961
|
"items": {
|
|
1690
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1962
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1691
1963
|
},
|
|
1692
1964
|
"description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
|
|
1693
1965
|
},
|
|
1694
1966
|
"previousChecksum": {
|
|
1695
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1967
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1696
1968
|
"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."
|
|
1697
1969
|
}
|
|
1698
1970
|
},
|
|
@@ -1835,17 +2107,9 @@
|
|
|
1835
2107
|
"Integrity": {
|
|
1836
2108
|
"type": "object",
|
|
1837
2109
|
"unevaluatedProperties": false,
|
|
1838
|
-
"dependentRequired": {
|
|
1839
|
-
"algorithm": [
|
|
1840
|
-
"checksum"
|
|
1841
|
-
],
|
|
1842
|
-
"checksum": [
|
|
1843
|
-
"algorithm"
|
|
1844
|
-
]
|
|
1845
|
-
},
|
|
1846
2110
|
"properties": {
|
|
1847
2111
|
"algorithm": {
|
|
1848
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2112
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
|
|
1849
2113
|
"description": "The hash algorithm used for the checksum."
|
|
1850
2114
|
},
|
|
1851
2115
|
"checksum": {
|
|
@@ -1874,13 +2138,39 @@
|
|
|
1874
2138
|
}
|
|
1875
2139
|
],
|
|
1876
2140
|
"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.",
|
|
1877
|
-
"title": "Integrity"
|
|
2141
|
+
"title": "Integrity",
|
|
2142
|
+
"allOf": [
|
|
2143
|
+
{
|
|
2144
|
+
"if": {
|
|
2145
|
+
"required": [
|
|
2146
|
+
"algorithm"
|
|
2147
|
+
]
|
|
2148
|
+
},
|
|
2149
|
+
"then": {
|
|
2150
|
+
"required": [
|
|
2151
|
+
"checksum"
|
|
2152
|
+
]
|
|
2153
|
+
}
|
|
2154
|
+
},
|
|
2155
|
+
{
|
|
2156
|
+
"if": {
|
|
2157
|
+
"required": [
|
|
2158
|
+
"checksum"
|
|
2159
|
+
]
|
|
2160
|
+
},
|
|
2161
|
+
"then": {
|
|
2162
|
+
"required": [
|
|
2163
|
+
"algorithm"
|
|
2164
|
+
]
|
|
2165
|
+
}
|
|
2166
|
+
}
|
|
2167
|
+
]
|
|
1878
2168
|
}
|
|
1879
2169
|
}
|
|
1880
2170
|
},
|
|
1881
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2171
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
|
|
1882
2172
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1883
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2173
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
|
|
1884
2174
|
"title": "HDF Amendment Primitives",
|
|
1885
2175
|
"description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
|
|
1886
2176
|
"$defs": {
|
|
@@ -1991,7 +2281,7 @@
|
|
|
1991
2281
|
"externalReferences": {
|
|
1992
2282
|
"type": "array",
|
|
1993
2283
|
"items": {
|
|
1994
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2284
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1995
2285
|
},
|
|
1996
2286
|
"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."
|
|
1997
2287
|
},
|
|
@@ -2009,7 +2299,7 @@
|
|
|
2009
2299
|
"description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
|
|
2010
2300
|
},
|
|
2011
2301
|
"status": {
|
|
2012
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2302
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
2013
2303
|
"description": "The new status this amendment sets. Optional when only impact is being overridden."
|
|
2014
2304
|
},
|
|
2015
2305
|
"impact": {
|
|
@@ -2021,7 +2311,7 @@
|
|
|
2021
2311
|
"description": "Justification for this amendment."
|
|
2022
2312
|
},
|
|
2023
2313
|
"appliedBy": {
|
|
2024
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2314
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
2025
2315
|
"description": "Identity of who applied this amendment."
|
|
2026
2316
|
},
|
|
2027
2317
|
"appliedAt": {
|
|
@@ -2037,20 +2327,20 @@
|
|
|
2037
2327
|
"evidence": {
|
|
2038
2328
|
"type": "array",
|
|
2039
2329
|
"items": {
|
|
2040
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2330
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
2041
2331
|
},
|
|
2042
2332
|
"description": "Supporting evidence (screenshots, logs, URLs, documents)."
|
|
2043
2333
|
},
|
|
2044
2334
|
"signature": {
|
|
2045
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2335
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
2046
2336
|
"description": "Digital signature for non-repudiation."
|
|
2047
2337
|
},
|
|
2048
2338
|
"previousChecksum": {
|
|
2049
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2339
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
2050
2340
|
"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."
|
|
2051
2341
|
},
|
|
2052
2342
|
"cvss": {
|
|
2053
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2343
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
2054
2344
|
"$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.",
|
|
2055
2345
|
"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."
|
|
2056
2346
|
},
|
|
@@ -2061,7 +2351,7 @@
|
|
|
2061
2351
|
"milestones": {
|
|
2062
2352
|
"type": "array",
|
|
2063
2353
|
"items": {
|
|
2064
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2354
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
2065
2355
|
},
|
|
2066
2356
|
"description": "Remediation milestones (primarily for POA&M type amendments)."
|
|
2067
2357
|
},
|
|
@@ -2078,7 +2368,7 @@
|
|
|
2078
2368
|
"affectedPackages": {
|
|
2079
2369
|
"type": "array",
|
|
2080
2370
|
"items": {
|
|
2081
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2371
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
|
|
2082
2372
|
},
|
|
2083
2373
|
"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)."
|
|
2084
2374
|
}
|
|
@@ -2211,9 +2501,9 @@
|
|
|
2211
2501
|
}
|
|
2212
2502
|
}
|
|
2213
2503
|
},
|
|
2214
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2504
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
|
|
2215
2505
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2216
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2506
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
|
|
2217
2507
|
"title": "HDF Result Primitives",
|
|
2218
2508
|
"description": "Types for representing assessment results and statuses.",
|
|
2219
2509
|
"$defs": {
|
|
@@ -2278,6 +2568,10 @@
|
|
|
2278
2568
|
"type": "string"
|
|
2279
2569
|
},
|
|
2280
2570
|
"description": "The stacktrace/backtrace of the exception if one occurred."
|
|
2571
|
+
},
|
|
2572
|
+
"rawSourceRecord": {
|
|
2573
|
+
"$ref": "#/$defs/Raw_Source_Record",
|
|
2574
|
+
"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."
|
|
2281
2575
|
}
|
|
2282
2576
|
},
|
|
2283
2577
|
"examples": [
|
|
@@ -2308,6 +2602,64 @@
|
|
|
2308
2602
|
"description": "A test within a requirement and its results and findings such as how long it took to run.",
|
|
2309
2603
|
"title": "Requirement Result"
|
|
2310
2604
|
},
|
|
2605
|
+
"Raw_Source_Record": {
|
|
2606
|
+
"type": "object",
|
|
2607
|
+
"additionalProperties": false,
|
|
2608
|
+
"required": [
|
|
2609
|
+
"content",
|
|
2610
|
+
"encoding",
|
|
2611
|
+
"mediaType"
|
|
2612
|
+
],
|
|
2613
|
+
"properties": {
|
|
2614
|
+
"content": {
|
|
2615
|
+
"type": "string",
|
|
2616
|
+
"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."
|
|
2617
|
+
},
|
|
2618
|
+
"encoding": {
|
|
2619
|
+
"type": "string",
|
|
2620
|
+
"enum": [
|
|
2621
|
+
"utf-8",
|
|
2622
|
+
"base64"
|
|
2623
|
+
],
|
|
2624
|
+
"description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
|
|
2625
|
+
},
|
|
2626
|
+
"mediaType": {
|
|
2627
|
+
"type": "string",
|
|
2628
|
+
"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."
|
|
2629
|
+
},
|
|
2630
|
+
"pointer": {
|
|
2631
|
+
"type": "string",
|
|
2632
|
+
"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."
|
|
2633
|
+
}
|
|
2634
|
+
},
|
|
2635
|
+
"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.",
|
|
2636
|
+
"$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.",
|
|
2637
|
+
"examples": [
|
|
2638
|
+
{
|
|
2639
|
+
"content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
|
|
2640
|
+
"encoding": "utf-8",
|
|
2641
|
+
"mediaType": "application/json",
|
|
2642
|
+
"pointer": "/matches/3"
|
|
2643
|
+
},
|
|
2644
|
+
{
|
|
2645
|
+
"content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
|
|
2646
|
+
"encoding": "utf-8",
|
|
2647
|
+
"mediaType": "application/xml",
|
|
2648
|
+
"pointer": "/Benchmark/TestResult/rule-result[4]"
|
|
2649
|
+
},
|
|
2650
|
+
{
|
|
2651
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
|
|
2652
|
+
"encoding": "base64",
|
|
2653
|
+
"mediaType": "application/octet-stream"
|
|
2654
|
+
},
|
|
2655
|
+
{
|
|
2656
|
+
"content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
|
|
2657
|
+
"encoding": "utf-8",
|
|
2658
|
+
"mediaType": "text/csv"
|
|
2659
|
+
}
|
|
2660
|
+
],
|
|
2661
|
+
"title": "Raw Source Record"
|
|
2662
|
+
},
|
|
2311
2663
|
"Requirement_Description": {
|
|
2312
2664
|
"type": "object",
|
|
2313
2665
|
"unevaluatedProperties": false,
|
|
@@ -2344,9 +2696,9 @@
|
|
|
2344
2696
|
}
|
|
2345
2697
|
}
|
|
2346
2698
|
},
|
|
2347
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2699
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
|
|
2348
2700
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2349
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2701
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
|
|
2350
2702
|
"title": "HDF CVSS Primitives",
|
|
2351
2703
|
"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).",
|
|
2352
2704
|
"$defs": {
|
|
@@ -2543,9 +2895,9 @@
|
|
|
2543
2895
|
}
|
|
2544
2896
|
}
|
|
2545
2897
|
},
|
|
2546
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2898
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
|
|
2547
2899
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2548
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2900
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
|
|
2549
2901
|
"title": "HDF Affected Package Primitives",
|
|
2550
2902
|
"description": "Types for representing the software package(s) affected by a vulnerability finding.",
|
|
2551
2903
|
"$defs": {
|