@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-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,41 +24,46 @@
|
|
|
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": [
|
|
59
63
|
{
|
|
60
64
|
"name": "ubuntu-2204-stig-baseline",
|
|
61
65
|
"title": "Canonical Ubuntu 22.04 LTS STIG Baseline",
|
|
66
|
+
"description": "Requirements from the DISA STIG for Canonical Ubuntu 22.04 LTS, tailored for hosts in the CUI enclave; checks that need a graphical session are marked not applicable.",
|
|
62
67
|
"version": "1.2.0",
|
|
63
68
|
"maintainer": "DISA STIG Team",
|
|
64
69
|
"license": "Apache-2.0",
|
|
@@ -142,7 +147,7 @@
|
|
|
142
147
|
],
|
|
143
148
|
"allOf": [
|
|
144
149
|
{
|
|
145
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
150
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Requirement_Core"
|
|
146
151
|
}
|
|
147
152
|
],
|
|
148
153
|
"properties": {
|
|
@@ -151,7 +156,7 @@
|
|
|
151
156
|
"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
157
|
},
|
|
153
158
|
"severity": {
|
|
154
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
159
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Severity",
|
|
155
160
|
"description": "Explicit severity rating. Typically derived from impact score but provided explicitly for clarity."
|
|
156
161
|
}
|
|
157
162
|
},
|
|
@@ -193,16 +198,29 @@
|
|
|
193
198
|
"description": "Array of labeled descriptions. At least one description with label 'default' must be present.",
|
|
194
199
|
"title": "Baseline Requirement Descriptions"
|
|
195
200
|
},
|
|
196
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
201
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0": {
|
|
197
202
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
198
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
203
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0",
|
|
199
204
|
"title": "HDF Common Primitives",
|
|
200
205
|
"description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
|
|
201
206
|
"$defs": {
|
|
207
|
+
"External_Reference_Encoding": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"enum": [
|
|
210
|
+
"utf-8",
|
|
211
|
+
"base64"
|
|
212
|
+
],
|
|
213
|
+
"description": "How an embedded copy's bytes are read back: 'utf-8' for text, 'base64' for anything that is not valid UTF-8 text.",
|
|
214
|
+
"title": "External Reference Encoding",
|
|
215
|
+
"examples": [
|
|
216
|
+
"base64"
|
|
217
|
+
],
|
|
218
|
+
"$comment": "Examples, in order: 1) a binary artifact, embedded base64-encoded."
|
|
219
|
+
},
|
|
202
220
|
"External_Reference": {
|
|
203
221
|
"type": "object",
|
|
204
222
|
"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.",
|
|
223
|
+
"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
224
|
"required": [
|
|
207
225
|
"sourceName"
|
|
208
226
|
],
|
|
@@ -221,6 +239,42 @@
|
|
|
221
239
|
"required": [
|
|
222
240
|
"description"
|
|
223
241
|
]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"required": [
|
|
245
|
+
"content"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"required": [
|
|
250
|
+
"document"
|
|
251
|
+
]
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"allOf": [
|
|
255
|
+
{
|
|
256
|
+
"if": {
|
|
257
|
+
"required": [
|
|
258
|
+
"content"
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
"then": {
|
|
262
|
+
"required": [
|
|
263
|
+
"encoding"
|
|
264
|
+
]
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"if": {
|
|
269
|
+
"required": [
|
|
270
|
+
"encoding"
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
"then": {
|
|
274
|
+
"required": [
|
|
275
|
+
"content"
|
|
276
|
+
]
|
|
277
|
+
}
|
|
224
278
|
}
|
|
225
279
|
],
|
|
226
280
|
"properties": {
|
|
@@ -236,7 +290,7 @@
|
|
|
236
290
|
"href": {
|
|
237
291
|
"type": "string",
|
|
238
292
|
"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.
|
|
293
|
+
"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
294
|
},
|
|
241
295
|
"description": {
|
|
242
296
|
"type": "string",
|
|
@@ -248,11 +302,11 @@
|
|
|
248
302
|
},
|
|
249
303
|
"mediaType": {
|
|
250
304
|
"type": "string",
|
|
251
|
-
"description": "IANA media type of the
|
|
305
|
+
"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
306
|
},
|
|
253
307
|
"checksum": {
|
|
254
308
|
"$ref": "#/$defs/Checksum",
|
|
255
|
-
"description": "Integrity hash of the
|
|
309
|
+
"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
310
|
},
|
|
257
311
|
"addedBy": {
|
|
258
312
|
"$ref": "#/$defs/Identity",
|
|
@@ -271,11 +325,19 @@
|
|
|
271
325
|
"document": {
|
|
272
326
|
"type": "object",
|
|
273
327
|
"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)."
|
|
328
|
+
"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)."
|
|
329
|
+
},
|
|
330
|
+
"content": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"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."
|
|
333
|
+
},
|
|
334
|
+
"encoding": {
|
|
335
|
+
"$ref": "#/$defs/External_Reference_Encoding",
|
|
336
|
+
"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
337
|
}
|
|
276
338
|
},
|
|
277
339
|
"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.",
|
|
340
|
+
"$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
341
|
"examples": [
|
|
280
342
|
{
|
|
281
343
|
"sourceName": "cve",
|
|
@@ -321,6 +383,28 @@
|
|
|
321
383
|
}
|
|
322
384
|
]
|
|
323
385
|
}
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"sourceName": "openscap",
|
|
389
|
+
"rel": "raw-source",
|
|
390
|
+
"mediaType": "application/xml",
|
|
391
|
+
"encoding": "utf-8",
|
|
392
|
+
"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>",
|
|
393
|
+
"checksum": {
|
|
394
|
+
"algorithm": "sha256",
|
|
395
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"sourceName": "fortify",
|
|
400
|
+
"rel": "raw-source",
|
|
401
|
+
"mediaType": "application/zip",
|
|
402
|
+
"encoding": "base64",
|
|
403
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
404
|
+
"checksum": {
|
|
405
|
+
"algorithm": "sha256",
|
|
406
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
407
|
+
}
|
|
324
408
|
}
|
|
325
409
|
]
|
|
326
410
|
},
|
|
@@ -332,7 +416,7 @@
|
|
|
332
416
|
"sha512",
|
|
333
417
|
"blake3"
|
|
334
418
|
],
|
|
335
|
-
"description": "
|
|
419
|
+
"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.",
|
|
336
420
|
"title": "Hash Algorithm"
|
|
337
421
|
},
|
|
338
422
|
"Requirement_Group": {
|
|
@@ -490,7 +574,33 @@
|
|
|
490
574
|
}
|
|
491
575
|
],
|
|
492
576
|
"description": "A reference to an external document.",
|
|
493
|
-
"title": "Reference"
|
|
577
|
+
"title": "Reference",
|
|
578
|
+
"unevaluatedProperties": false,
|
|
579
|
+
"$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.",
|
|
580
|
+
"examples": [
|
|
581
|
+
{
|
|
582
|
+
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-44228"
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"ref": "NIST SP 800-53 Rev 5, AC-6"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"ref": "CIS Benchmark for RHEL 9, 1.1.1",
|
|
589
|
+
"url": "https://www.cisecurity.org/benchmark/red_hat_linux"
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"ref": [
|
|
593
|
+
{
|
|
594
|
+
"identifier": "2921",
|
|
595
|
+
"publisher": "DISA",
|
|
596
|
+
"type": "DPMS Target"
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"uri": "https://attack.mitre.org/techniques/T1059/"
|
|
602
|
+
}
|
|
603
|
+
]
|
|
494
604
|
},
|
|
495
605
|
"Source_Location": {
|
|
496
606
|
"type": "object",
|
|
@@ -1008,6 +1118,10 @@
|
|
|
1008
1118
|
"type": "string",
|
|
1009
1119
|
"description": "The title - should be human readable."
|
|
1010
1120
|
},
|
|
1121
|
+
"description": {
|
|
1122
|
+
"type": "string",
|
|
1123
|
+
"description": "Prose description of the baseline, more detailed than summary. Carried verbatim, like every HDF prose field."
|
|
1124
|
+
},
|
|
1011
1125
|
"maintainer": {
|
|
1012
1126
|
"type": "string",
|
|
1013
1127
|
"description": "The maintainer(s)."
|
|
@@ -1086,7 +1200,7 @@
|
|
|
1086
1200
|
},
|
|
1087
1201
|
"id": {
|
|
1088
1202
|
"type": "string",
|
|
1089
|
-
"description": "The requirement identifier. Example: 'SV-238196'."
|
|
1203
|
+
"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."
|
|
1090
1204
|
},
|
|
1091
1205
|
"title": {
|
|
1092
1206
|
"type": "string",
|
|
@@ -1304,9 +1418,9 @@
|
|
|
1304
1418
|
}
|
|
1305
1419
|
}
|
|
1306
1420
|
},
|
|
1307
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.
|
|
1421
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.8.0": {
|
|
1308
1422
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1309
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.
|
|
1423
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.8.0",
|
|
1310
1424
|
"title": "HDF Parameter Primitives",
|
|
1311
1425
|
"description": "Input/parameter type definitions for typed, traceable configuration values that bridge governance prose and scanner automation.",
|
|
1312
1426
|
"$defs": {
|
|
@@ -1358,7 +1472,8 @@
|
|
|
1358
1472
|
},
|
|
1359
1473
|
"allowedValues": {
|
|
1360
1474
|
"type": "array",
|
|
1361
|
-
"
|
|
1475
|
+
"items": true,
|
|
1476
|
+
"description": "Enumeration of permitted values. Each entry may be any JSON value, the same freedom Input.value has: an Array or Hash input enumerates container values, so no element type is imposed."
|
|
1362
1477
|
}
|
|
1363
1478
|
},
|
|
1364
1479
|
"description": "Validation constraints for an input value.",
|
|
@@ -1437,12 +1552,183 @@
|
|
|
1437
1552
|
}
|
|
1438
1553
|
}
|
|
1439
1554
|
},
|
|
1440
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1555
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0": {
|
|
1441
1556
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1442
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.
|
|
1557
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.8.0",
|
|
1443
1558
|
"title": "HDF Extension Primitives",
|
|
1444
|
-
"description": "Extension types for waivers, attestations, generators, and
|
|
1559
|
+
"description": "Extension types for waivers, attestations, generators, integrity, and the document-level extensions carrier.",
|
|
1445
1560
|
"$defs": {
|
|
1561
|
+
"Raw_Source_Artifact": {
|
|
1562
|
+
"allOf": [
|
|
1563
|
+
{
|
|
1564
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1565
|
+
},
|
|
1566
|
+
{
|
|
1567
|
+
"not": {
|
|
1568
|
+
"required": [
|
|
1569
|
+
"document"
|
|
1570
|
+
]
|
|
1571
|
+
}
|
|
1572
|
+
},
|
|
1573
|
+
{
|
|
1574
|
+
"if": {
|
|
1575
|
+
"required": [
|
|
1576
|
+
"content"
|
|
1577
|
+
]
|
|
1578
|
+
},
|
|
1579
|
+
"then": {
|
|
1580
|
+
"required": [
|
|
1581
|
+
"encoding",
|
|
1582
|
+
"mediaType"
|
|
1583
|
+
]
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
],
|
|
1587
|
+
"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`.",
|
|
1588
|
+
"$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.",
|
|
1589
|
+
"examples": [
|
|
1590
|
+
{
|
|
1591
|
+
"sourceName": "grype",
|
|
1592
|
+
"rel": "raw-source",
|
|
1593
|
+
"mediaType": "application/json",
|
|
1594
|
+
"encoding": "utf-8",
|
|
1595
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1596
|
+
"checksum": {
|
|
1597
|
+
"algorithm": "sha256",
|
|
1598
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1599
|
+
}
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
"sourceName": "openscap",
|
|
1603
|
+
"rel": "raw-source",
|
|
1604
|
+
"mediaType": "application/xml",
|
|
1605
|
+
"encoding": "utf-8",
|
|
1606
|
+
"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>",
|
|
1607
|
+
"checksum": {
|
|
1608
|
+
"algorithm": "sha256",
|
|
1609
|
+
"value": "713b3ee32af5c14ac93e519b5025d760983607143dba3a0438f68667923beda1"
|
|
1610
|
+
}
|
|
1611
|
+
},
|
|
1612
|
+
{
|
|
1613
|
+
"sourceName": "prisma",
|
|
1614
|
+
"rel": "raw-source",
|
|
1615
|
+
"mediaType": "text/csv",
|
|
1616
|
+
"encoding": "utf-8",
|
|
1617
|
+
"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",
|
|
1618
|
+
"checksum": {
|
|
1619
|
+
"algorithm": "sha256",
|
|
1620
|
+
"value": "c5a8077ee069e18fd6687c6b1c4f72fdbc95b7af77d954b6fb5e522cd783aa83"
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
"sourceName": "fortify",
|
|
1625
|
+
"rel": "raw-source",
|
|
1626
|
+
"mediaType": "application/zip",
|
|
1627
|
+
"encoding": "base64",
|
|
1628
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1629
|
+
"checksum": {
|
|
1630
|
+
"algorithm": "sha256",
|
|
1631
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1632
|
+
}
|
|
1633
|
+
},
|
|
1634
|
+
{
|
|
1635
|
+
"sourceName": "nessus",
|
|
1636
|
+
"rel": "raw-source",
|
|
1637
|
+
"href": "https://scans.example.gov/exports/2026-09-27-prod-web.nessus",
|
|
1638
|
+
"mediaType": "application/xml",
|
|
1639
|
+
"checksum": {
|
|
1640
|
+
"algorithm": "sha256",
|
|
1641
|
+
"value": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
]
|
|
1645
|
+
},
|
|
1646
|
+
"Extensions": {
|
|
1647
|
+
"type": "object",
|
|
1648
|
+
"additionalProperties": false,
|
|
1649
|
+
"properties": {
|
|
1650
|
+
"passthrough": {
|
|
1651
|
+
"type": "object",
|
|
1652
|
+
"additionalProperties": true,
|
|
1653
|
+
"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.",
|
|
1654
|
+
"examples": [
|
|
1655
|
+
{
|
|
1656
|
+
"auxiliary_data": [
|
|
1657
|
+
{
|
|
1658
|
+
"name": "Scoutsuite",
|
|
1659
|
+
"data": {
|
|
1660
|
+
"last_run": {
|
|
1661
|
+
"ruleset_about": "This ruleset consists of numerous rules that are considered standard by NCC Group"
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
}
|
|
1665
|
+
]
|
|
1666
|
+
},
|
|
1667
|
+
{
|
|
1668
|
+
"audit": {
|
|
1669
|
+
"runId": "r-123"
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
],
|
|
1673
|
+
"$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."
|
|
1674
|
+
},
|
|
1675
|
+
"rawSourceArtifacts": {
|
|
1676
|
+
"type": "array",
|
|
1677
|
+
"items": {
|
|
1678
|
+
"$ref": "#/$defs/Raw_Source_Artifact"
|
|
1679
|
+
},
|
|
1680
|
+
"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."
|
|
1681
|
+
}
|
|
1682
|
+
},
|
|
1683
|
+
"title": "Extensions",
|
|
1684
|
+
"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.",
|
|
1685
|
+
"$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.",
|
|
1686
|
+
"examples": [
|
|
1687
|
+
{
|
|
1688
|
+
"passthrough": {
|
|
1689
|
+
"auxiliary_data": [
|
|
1690
|
+
{
|
|
1691
|
+
"name": "Grype",
|
|
1692
|
+
"data": {
|
|
1693
|
+
"descriptor": {
|
|
1694
|
+
"name": "grype",
|
|
1695
|
+
"version": "0.74.0"
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
]
|
|
1700
|
+
},
|
|
1701
|
+
"rawSourceArtifacts": [
|
|
1702
|
+
{
|
|
1703
|
+
"sourceName": "grype",
|
|
1704
|
+
"rel": "raw-source",
|
|
1705
|
+
"mediaType": "application/json",
|
|
1706
|
+
"encoding": "utf-8",
|
|
1707
|
+
"content": "{\"matches\":[{\"vulnerability\":{\"id\":\"CVE-2021-36159\",\"severity\":\"Critical\"}}]}",
|
|
1708
|
+
"checksum": {
|
|
1709
|
+
"algorithm": "sha256",
|
|
1710
|
+
"value": "4b33be77f104d6ee323ff2c945d1c3f9a151606b2d263ea7932716844c75920c"
|
|
1711
|
+
}
|
|
1712
|
+
}
|
|
1713
|
+
]
|
|
1714
|
+
},
|
|
1715
|
+
{
|
|
1716
|
+
"rawSourceArtifacts": [
|
|
1717
|
+
{
|
|
1718
|
+
"sourceName": "fortify",
|
|
1719
|
+
"rel": "raw-source",
|
|
1720
|
+
"mediaType": "application/zip",
|
|
1721
|
+
"encoding": "base64",
|
|
1722
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbLOxr8jNUShLLSrOzM+zVTLUM1Cyt7NxC3Px0bcDAFBLAQIUAxQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAAAAAAAAAAACAAQAAAABhdWRpdC5mdmRsUEsFBgAAAAABAAEAOAAAAEYAAAAAAA==",
|
|
1723
|
+
"checksum": {
|
|
1724
|
+
"algorithm": "sha256",
|
|
1725
|
+
"value": "c7e4cefceecb83511ae6174c7d22584061671dee6dc5f27243503b47532a66b1"
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
]
|
|
1729
|
+
}
|
|
1730
|
+
]
|
|
1731
|
+
},
|
|
1446
1732
|
"Status_Override": {
|
|
1447
1733
|
"type": "object",
|
|
1448
1734
|
"unevaluatedProperties": false,
|
|
@@ -1453,44 +1739,99 @@
|
|
|
1453
1739
|
"appliedAt",
|
|
1454
1740
|
"expiresAt"
|
|
1455
1741
|
],
|
|
1456
|
-
"
|
|
1742
|
+
"allOf": [
|
|
1457
1743
|
{
|
|
1458
|
-
"
|
|
1459
|
-
"
|
|
1460
|
-
|
|
1744
|
+
"if": {
|
|
1745
|
+
"properties": {
|
|
1746
|
+
"type": {
|
|
1747
|
+
"enum": [
|
|
1748
|
+
"operationalRequirement"
|
|
1749
|
+
]
|
|
1750
|
+
}
|
|
1751
|
+
},
|
|
1752
|
+
"required": [
|
|
1753
|
+
"type"
|
|
1754
|
+
]
|
|
1755
|
+
},
|
|
1756
|
+
"then": {
|
|
1757
|
+
"not": {
|
|
1758
|
+
"anyOf": [
|
|
1759
|
+
{
|
|
1760
|
+
"required": [
|
|
1761
|
+
"status"
|
|
1762
|
+
]
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
"required": [
|
|
1766
|
+
"impact"
|
|
1767
|
+
]
|
|
1768
|
+
}
|
|
1769
|
+
]
|
|
1770
|
+
}
|
|
1771
|
+
},
|
|
1772
|
+
"else": {
|
|
1773
|
+
"anyOf": [
|
|
1774
|
+
{
|
|
1775
|
+
"required": [
|
|
1776
|
+
"status"
|
|
1777
|
+
]
|
|
1778
|
+
},
|
|
1779
|
+
{
|
|
1780
|
+
"required": [
|
|
1781
|
+
"impact"
|
|
1782
|
+
]
|
|
1783
|
+
}
|
|
1784
|
+
]
|
|
1785
|
+
}
|
|
1461
1786
|
},
|
|
1462
1787
|
{
|
|
1463
|
-
"
|
|
1464
|
-
"
|
|
1465
|
-
|
|
1788
|
+
"if": {
|
|
1789
|
+
"properties": {
|
|
1790
|
+
"type": {
|
|
1791
|
+
"enum": [
|
|
1792
|
+
"riskAdjustment"
|
|
1793
|
+
]
|
|
1794
|
+
}
|
|
1795
|
+
},
|
|
1796
|
+
"required": [
|
|
1797
|
+
"type"
|
|
1798
|
+
]
|
|
1799
|
+
},
|
|
1800
|
+
"then": {
|
|
1801
|
+
"not": {
|
|
1802
|
+
"required": [
|
|
1803
|
+
"status"
|
|
1804
|
+
]
|
|
1805
|
+
}
|
|
1806
|
+
}
|
|
1466
1807
|
}
|
|
1467
1808
|
],
|
|
1468
1809
|
"properties": {
|
|
1469
1810
|
"externalReferences": {
|
|
1470
1811
|
"type": "array",
|
|
1471
1812
|
"items": {
|
|
1472
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1813
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1473
1814
|
},
|
|
1474
1815
|
"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
1816
|
},
|
|
1476
1817
|
"type": {
|
|
1477
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1818
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Override_Type",
|
|
1478
1819
|
"description": "The type of override applied to this requirement."
|
|
1479
1820
|
},
|
|
1480
1821
|
"status": {
|
|
1481
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
1482
|
-
"description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
|
|
1822
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
1823
|
+
"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."
|
|
1483
1824
|
},
|
|
1484
1825
|
"impact": {
|
|
1485
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1486
|
-
"description": "Override to the requirement's impact score.
|
|
1826
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Impact_Override",
|
|
1827
|
+
"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."
|
|
1487
1828
|
},
|
|
1488
1829
|
"reason": {
|
|
1489
1830
|
"type": "string",
|
|
1490
1831
|
"description": "Explanation for why this override was applied."
|
|
1491
1832
|
},
|
|
1492
1833
|
"appliedBy": {
|
|
1493
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1834
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1494
1835
|
"description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
|
|
1495
1836
|
},
|
|
1496
1837
|
"appliedAt": {
|
|
@@ -1504,31 +1845,31 @@
|
|
|
1504
1845
|
"description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
|
|
1505
1846
|
},
|
|
1506
1847
|
"signature": {
|
|
1507
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1848
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1508
1849
|
"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
1850
|
},
|
|
1510
1851
|
"evidence": {
|
|
1511
1852
|
"type": "array",
|
|
1512
1853
|
"items": {
|
|
1513
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1854
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1514
1855
|
},
|
|
1515
1856
|
"description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
|
|
1516
1857
|
},
|
|
1517
1858
|
"previousChecksum": {
|
|
1518
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
1859
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1519
1860
|
"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
1861
|
},
|
|
1521
1862
|
"cvss": {
|
|
1522
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
1863
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
1523
1864
|
"$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
1865
|
"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
1866
|
},
|
|
1526
1867
|
"justification": {
|
|
1527
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
1868
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0#/$defs/Justification",
|
|
1528
1869
|
"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
1870
|
}
|
|
1530
1871
|
},
|
|
1531
|
-
"$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.",
|
|
1872
|
+
"$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.",
|
|
1532
1873
|
"examples": [
|
|
1533
1874
|
{
|
|
1534
1875
|
"type": "waiver",
|
|
@@ -1628,9 +1969,19 @@
|
|
|
1628
1969
|
}
|
|
1629
1970
|
}
|
|
1630
1971
|
]
|
|
1972
|
+
},
|
|
1973
|
+
{
|
|
1974
|
+
"type": "operationalRequirement",
|
|
1975
|
+
"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.",
|
|
1976
|
+
"appliedBy": {
|
|
1977
|
+
"type": "email",
|
|
1978
|
+
"identifier": "system-owner@agency.gov"
|
|
1979
|
+
},
|
|
1980
|
+
"appliedAt": "2026-01-20T10:00:00Z",
|
|
1981
|
+
"expiresAt": "2099-12-31T00:00:00Z"
|
|
1631
1982
|
}
|
|
1632
1983
|
],
|
|
1633
|
-
"description": "An intentional change to a requirement's compliance status and/or impact score.
|
|
1984
|
+
"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.",
|
|
1634
1985
|
"title": "Status Override"
|
|
1635
1986
|
},
|
|
1636
1987
|
"POAM": {
|
|
@@ -1660,7 +2011,7 @@
|
|
|
1660
2011
|
"description": "Detailed explanation of the plan, including what actions will be taken."
|
|
1661
2012
|
},
|
|
1662
2013
|
"appliedBy": {
|
|
1663
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2014
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
1664
2015
|
"description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
|
|
1665
2016
|
},
|
|
1666
2017
|
"appliedAt": {
|
|
@@ -1676,23 +2027,23 @@
|
|
|
1676
2027
|
"milestones": {
|
|
1677
2028
|
"type": "array",
|
|
1678
2029
|
"items": {
|
|
1679
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2030
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
1680
2031
|
},
|
|
1681
2032
|
"description": "Optional array of milestones tracking progress toward completion."
|
|
1682
2033
|
},
|
|
1683
2034
|
"signature": {
|
|
1684
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2035
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
1685
2036
|
"description": "Optional digital signature for enhanced trust and non-repudiation."
|
|
1686
2037
|
},
|
|
1687
2038
|
"evidence": {
|
|
1688
2039
|
"type": "array",
|
|
1689
2040
|
"items": {
|
|
1690
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2041
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
1691
2042
|
},
|
|
1692
2043
|
"description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
|
|
1693
2044
|
},
|
|
1694
2045
|
"previousChecksum": {
|
|
1695
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2046
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
1696
2047
|
"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
2048
|
}
|
|
1698
2049
|
},
|
|
@@ -1835,17 +2186,9 @@
|
|
|
1835
2186
|
"Integrity": {
|
|
1836
2187
|
"type": "object",
|
|
1837
2188
|
"unevaluatedProperties": false,
|
|
1838
|
-
"dependentRequired": {
|
|
1839
|
-
"algorithm": [
|
|
1840
|
-
"checksum"
|
|
1841
|
-
],
|
|
1842
|
-
"checksum": [
|
|
1843
|
-
"algorithm"
|
|
1844
|
-
]
|
|
1845
|
-
},
|
|
1846
2189
|
"properties": {
|
|
1847
2190
|
"algorithm": {
|
|
1848
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2191
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Hash_Algorithm",
|
|
1849
2192
|
"description": "The hash algorithm used for the checksum."
|
|
1850
2193
|
},
|
|
1851
2194
|
"checksum": {
|
|
@@ -1874,13 +2217,39 @@
|
|
|
1874
2217
|
}
|
|
1875
2218
|
],
|
|
1876
2219
|
"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"
|
|
2220
|
+
"title": "Integrity",
|
|
2221
|
+
"allOf": [
|
|
2222
|
+
{
|
|
2223
|
+
"if": {
|
|
2224
|
+
"required": [
|
|
2225
|
+
"algorithm"
|
|
2226
|
+
]
|
|
2227
|
+
},
|
|
2228
|
+
"then": {
|
|
2229
|
+
"required": [
|
|
2230
|
+
"checksum"
|
|
2231
|
+
]
|
|
2232
|
+
}
|
|
2233
|
+
},
|
|
2234
|
+
{
|
|
2235
|
+
"if": {
|
|
2236
|
+
"required": [
|
|
2237
|
+
"checksum"
|
|
2238
|
+
]
|
|
2239
|
+
},
|
|
2240
|
+
"then": {
|
|
2241
|
+
"required": [
|
|
2242
|
+
"algorithm"
|
|
2243
|
+
]
|
|
2244
|
+
}
|
|
2245
|
+
}
|
|
2246
|
+
]
|
|
1878
2247
|
}
|
|
1879
2248
|
}
|
|
1880
2249
|
},
|
|
1881
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2250
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0": {
|
|
1882
2251
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1883
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.
|
|
2252
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.8.0",
|
|
1884
2253
|
"title": "HDF Amendment Primitives",
|
|
1885
2254
|
"description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
|
|
1886
2255
|
"$defs": {
|
|
@@ -1895,7 +2264,7 @@
|
|
|
1895
2264
|
"riskAdjustment",
|
|
1896
2265
|
"operationalRequirement"
|
|
1897
2266
|
],
|
|
1898
|
-
"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.",
|
|
2267
|
+
"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.",
|
|
1899
2268
|
"title": "Override Type"
|
|
1900
2269
|
},
|
|
1901
2270
|
"Justification": {
|
|
@@ -1935,7 +2304,7 @@
|
|
|
1935
2304
|
},
|
|
1936
2305
|
"Standalone_Override": {
|
|
1937
2306
|
"type": "object",
|
|
1938
|
-
"description": "A standalone override to a requirement's compliance status or risk impact.\n\nValidation
|
|
2307
|
+
"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).",
|
|
1939
2308
|
"unevaluatedProperties": false,
|
|
1940
2309
|
"required": [
|
|
1941
2310
|
"type",
|
|
@@ -1945,53 +2314,78 @@
|
|
|
1945
2314
|
"appliedAt",
|
|
1946
2315
|
"expiresAt"
|
|
1947
2316
|
],
|
|
1948
|
-
"
|
|
1949
|
-
|
|
1950
|
-
"
|
|
1951
|
-
"
|
|
1952
|
-
"
|
|
2317
|
+
"allOf": [
|
|
2318
|
+
{
|
|
2319
|
+
"if": {
|
|
2320
|
+
"properties": {
|
|
2321
|
+
"type": {
|
|
2322
|
+
"enum": [
|
|
2323
|
+
"operationalRequirement"
|
|
2324
|
+
]
|
|
2325
|
+
}
|
|
2326
|
+
},
|
|
2327
|
+
"required": [
|
|
2328
|
+
"type"
|
|
2329
|
+
]
|
|
2330
|
+
},
|
|
2331
|
+
"then": {
|
|
2332
|
+
"not": {
|
|
2333
|
+
"anyOf": [
|
|
2334
|
+
{
|
|
2335
|
+
"required": [
|
|
2336
|
+
"status"
|
|
2337
|
+
]
|
|
2338
|
+
},
|
|
2339
|
+
{
|
|
2340
|
+
"required": [
|
|
2341
|
+
"impact"
|
|
2342
|
+
]
|
|
2343
|
+
}
|
|
2344
|
+
]
|
|
2345
|
+
}
|
|
2346
|
+
},
|
|
2347
|
+
"else": {
|
|
2348
|
+
"anyOf": [
|
|
2349
|
+
{
|
|
2350
|
+
"required": [
|
|
2351
|
+
"status"
|
|
2352
|
+
]
|
|
2353
|
+
},
|
|
2354
|
+
{
|
|
2355
|
+
"required": [
|
|
2356
|
+
"impact"
|
|
2357
|
+
]
|
|
2358
|
+
}
|
|
1953
2359
|
]
|
|
1954
2360
|
}
|
|
1955
2361
|
},
|
|
1956
|
-
|
|
1957
|
-
"
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
"required": [
|
|
1965
|
-
"status"
|
|
1966
|
-
]
|
|
2362
|
+
{
|
|
2363
|
+
"if": {
|
|
2364
|
+
"properties": {
|
|
2365
|
+
"type": {
|
|
2366
|
+
"enum": [
|
|
2367
|
+
"riskAdjustment"
|
|
2368
|
+
]
|
|
2369
|
+
}
|
|
1967
2370
|
},
|
|
1968
|
-
{
|
|
1969
|
-
"required": [
|
|
1970
|
-
"impact"
|
|
1971
|
-
]
|
|
1972
|
-
}
|
|
1973
|
-
]
|
|
1974
|
-
}
|
|
1975
|
-
},
|
|
1976
|
-
"else": {
|
|
1977
|
-
"anyOf": [
|
|
1978
|
-
{
|
|
1979
2371
|
"required": [
|
|
1980
|
-
"
|
|
2372
|
+
"type"
|
|
1981
2373
|
]
|
|
1982
2374
|
},
|
|
1983
|
-
{
|
|
1984
|
-
"
|
|
1985
|
-
"
|
|
1986
|
-
|
|
2375
|
+
"then": {
|
|
2376
|
+
"not": {
|
|
2377
|
+
"required": [
|
|
2378
|
+
"status"
|
|
2379
|
+
]
|
|
2380
|
+
}
|
|
1987
2381
|
}
|
|
1988
|
-
|
|
1989
|
-
|
|
2382
|
+
}
|
|
2383
|
+
],
|
|
1990
2384
|
"properties": {
|
|
1991
2385
|
"externalReferences": {
|
|
1992
2386
|
"type": "array",
|
|
1993
2387
|
"items": {
|
|
1994
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2388
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference"
|
|
1995
2389
|
},
|
|
1996
2390
|
"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
2391
|
},
|
|
@@ -2002,15 +2396,15 @@
|
|
|
2002
2396
|
"requirementId": {
|
|
2003
2397
|
"type": "string",
|
|
2004
2398
|
"minLength": 1,
|
|
2005
|
-
"description": "The
|
|
2399
|
+
"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."
|
|
2006
2400
|
},
|
|
2007
2401
|
"baselineRef": {
|
|
2008
2402
|
"type": "string",
|
|
2009
2403
|
"description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
|
|
2010
2404
|
},
|
|
2011
2405
|
"status": {
|
|
2012
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2013
|
-
"description": "The new status this
|
|
2406
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0#/$defs/Result_Status",
|
|
2407
|
+
"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."
|
|
2014
2408
|
},
|
|
2015
2409
|
"impact": {
|
|
2016
2410
|
"$ref": "#/$defs/Impact_Override",
|
|
@@ -2021,7 +2415,7 @@
|
|
|
2021
2415
|
"description": "Justification for this amendment."
|
|
2022
2416
|
},
|
|
2023
2417
|
"appliedBy": {
|
|
2024
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2418
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Identity",
|
|
2025
2419
|
"description": "Identity of who applied this amendment."
|
|
2026
2420
|
},
|
|
2027
2421
|
"appliedAt": {
|
|
@@ -2037,20 +2431,20 @@
|
|
|
2037
2431
|
"evidence": {
|
|
2038
2432
|
"type": "array",
|
|
2039
2433
|
"items": {
|
|
2040
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2434
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Evidence"
|
|
2041
2435
|
},
|
|
2042
2436
|
"description": "Supporting evidence (screenshots, logs, URLs, documents)."
|
|
2043
2437
|
},
|
|
2044
2438
|
"signature": {
|
|
2045
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2439
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Signature",
|
|
2046
2440
|
"description": "Digital signature for non-repudiation."
|
|
2047
2441
|
},
|
|
2048
2442
|
"previousChecksum": {
|
|
2049
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2443
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Checksum",
|
|
2050
2444
|
"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
2445
|
},
|
|
2052
2446
|
"cvss": {
|
|
2053
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2447
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0#/$defs/Cvss",
|
|
2054
2448
|
"$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
2449
|
"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
2450
|
},
|
|
@@ -2061,7 +2455,7 @@
|
|
|
2061
2455
|
"milestones": {
|
|
2062
2456
|
"type": "array",
|
|
2063
2457
|
"items": {
|
|
2064
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.
|
|
2458
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/Milestone"
|
|
2065
2459
|
},
|
|
2066
2460
|
"description": "Remediation milestones (primarily for POA&M type amendments)."
|
|
2067
2461
|
},
|
|
@@ -2078,7 +2472,7 @@
|
|
|
2078
2472
|
"affectedPackages": {
|
|
2079
2473
|
"type": "array",
|
|
2080
2474
|
"items": {
|
|
2081
|
-
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2475
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0#/$defs/Affected_Package"
|
|
2082
2476
|
},
|
|
2083
2477
|
"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
2478
|
}
|
|
@@ -2211,9 +2605,9 @@
|
|
|
2211
2605
|
}
|
|
2212
2606
|
}
|
|
2213
2607
|
},
|
|
2214
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2608
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0": {
|
|
2215
2609
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2216
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.
|
|
2610
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.8.0",
|
|
2217
2611
|
"title": "HDF Result Primitives",
|
|
2218
2612
|
"description": "Types for representing assessment results and statuses.",
|
|
2219
2613
|
"$defs": {
|
|
@@ -2278,6 +2672,10 @@
|
|
|
2278
2672
|
"type": "string"
|
|
2279
2673
|
},
|
|
2280
2674
|
"description": "The stacktrace/backtrace of the exception if one occurred."
|
|
2675
|
+
},
|
|
2676
|
+
"rawSourceRecord": {
|
|
2677
|
+
"$ref": "#/$defs/Raw_Source_Record",
|
|
2678
|
+
"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
2679
|
}
|
|
2282
2680
|
},
|
|
2283
2681
|
"examples": [
|
|
@@ -2308,6 +2706,60 @@
|
|
|
2308
2706
|
"description": "A test within a requirement and its results and findings such as how long it took to run.",
|
|
2309
2707
|
"title": "Requirement Result"
|
|
2310
2708
|
},
|
|
2709
|
+
"Raw_Source_Record": {
|
|
2710
|
+
"type": "object",
|
|
2711
|
+
"additionalProperties": false,
|
|
2712
|
+
"required": [
|
|
2713
|
+
"content",
|
|
2714
|
+
"encoding",
|
|
2715
|
+
"mediaType"
|
|
2716
|
+
],
|
|
2717
|
+
"properties": {
|
|
2718
|
+
"content": {
|
|
2719
|
+
"type": "string",
|
|
2720
|
+
"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."
|
|
2721
|
+
},
|
|
2722
|
+
"encoding": {
|
|
2723
|
+
"$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.8.0#/$defs/External_Reference_Encoding",
|
|
2724
|
+
"description": "How to read `content`: 'utf-8' for text, 'base64' for bytes that are not valid UTF-8 text."
|
|
2725
|
+
},
|
|
2726
|
+
"mediaType": {
|
|
2727
|
+
"type": "string",
|
|
2728
|
+
"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."
|
|
2729
|
+
},
|
|
2730
|
+
"pointer": {
|
|
2731
|
+
"type": "string",
|
|
2732
|
+
"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."
|
|
2733
|
+
}
|
|
2734
|
+
},
|
|
2735
|
+
"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.",
|
|
2736
|
+
"$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.",
|
|
2737
|
+
"examples": [
|
|
2738
|
+
{
|
|
2739
|
+
"content": "{\"vulnerability\":{\"id\":\"CVE-2022-48174\",\"severity\":\"Critical\"},\"artifact\":{\"name\":\"ssl_client\",\"version\":\"1.31.1-r9\",\"type\":\"apk\"}}",
|
|
2740
|
+
"encoding": "utf-8",
|
|
2741
|
+
"mediaType": "application/json",
|
|
2742
|
+
"pointer": "/matches/3"
|
|
2743
|
+
},
|
|
2744
|
+
{
|
|
2745
|
+
"content": "<rule-result idref=\"xccdf_org.ssgproject.content_rule_sshd_disable_root_login\" severity=\"medium\">\n <result>fail</result>\n</rule-result>",
|
|
2746
|
+
"encoding": "utf-8",
|
|
2747
|
+
"mediaType": "application/xml",
|
|
2748
|
+
"pointer": "/Benchmark/TestResult/rule-result[4]"
|
|
2749
|
+
},
|
|
2750
|
+
{
|
|
2751
|
+
"content": "UEsDBBQAAAAIAEVnPF20b/JoHgAAABwAAAAKAAAAYXVkaXQuZnZkbA==",
|
|
2752
|
+
"encoding": "base64",
|
|
2753
|
+
"mediaType": "application/octet-stream"
|
|
2754
|
+
},
|
|
2755
|
+
{
|
|
2756
|
+
"content": "host-01,Ubuntu 22.04,CVE-2021-36159,,image,critical,apk-tools,apk-tools,2.12.5-r1",
|
|
2757
|
+
"encoding": "utf-8",
|
|
2758
|
+
"mediaType": "text/csv"
|
|
2759
|
+
}
|
|
2760
|
+
],
|
|
2761
|
+
"title": "Raw Source Record"
|
|
2762
|
+
},
|
|
2311
2763
|
"Requirement_Description": {
|
|
2312
2764
|
"type": "object",
|
|
2313
2765
|
"unevaluatedProperties": false,
|
|
@@ -2344,9 +2796,9 @@
|
|
|
2344
2796
|
}
|
|
2345
2797
|
}
|
|
2346
2798
|
},
|
|
2347
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2799
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0": {
|
|
2348
2800
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2349
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.
|
|
2801
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.8.0",
|
|
2350
2802
|
"title": "HDF CVSS Primitives",
|
|
2351
2803
|
"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
2804
|
"$defs": {
|
|
@@ -2543,9 +2995,9 @@
|
|
|
2543
2995
|
}
|
|
2544
2996
|
}
|
|
2545
2997
|
},
|
|
2546
|
-
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
2998
|
+
"https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0": {
|
|
2547
2999
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2548
|
-
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.
|
|
3000
|
+
"$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.8.0",
|
|
2549
3001
|
"title": "HDF Affected Package Primitives",
|
|
2550
3002
|
"description": "Types for representing the software package(s) affected by a vulnerability finding.",
|
|
2551
3003
|
"$defs": {
|