@mitre/hdf-schema 3.6.0-rc.5 → 3.7.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-baseline/v3.5.0",
3
+ "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-baseline/v3.7.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.5.0#/$defs/Baseline_Metadata"
12
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Baseline_Metadata"
13
13
  }
14
14
  ],
15
15
  "properties": {
@@ -24,34 +24,34 @@
24
24
  "groups": {
25
25
  "type": "array",
26
26
  "items": {
27
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Requirement_Group"
27
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.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.5.0#/$defs/Input"
34
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.7.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.5.0#/$defs/Integrity",
39
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.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.5.0#/$defs/Remediation",
43
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.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.5.0#/$defs/Dependency"
49
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.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.5.0#/$defs/Generator",
54
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Generator",
55
55
  "description": "The tool that generated this file."
56
56
  }
57
57
  },
@@ -142,7 +142,7 @@
142
142
  ],
143
143
  "allOf": [
144
144
  {
145
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Requirement_Core"
145
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Requirement_Core"
146
146
  }
147
147
  ],
148
148
  "properties": {
@@ -151,7 +151,7 @@
151
151
  "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
152
  },
153
153
  "severity": {
154
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Severity",
154
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Severity",
155
155
  "description": "Explicit severity rating. Typically derived from impact score but provided explicitly for clarity."
156
156
  }
157
157
  },
@@ -193,9 +193,9 @@
193
193
  "description": "Array of labeled descriptions. At least one description with label 'default' must be present.",
194
194
  "title": "Baseline Requirement Descriptions"
195
195
  },
196
- "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0": {
196
+ "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0": {
197
197
  "$schema": "https://json-schema.org/draft/2020-12/schema",
198
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0",
198
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0",
199
199
  "title": "HDF Common Primitives",
200
200
  "description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
201
201
  "$defs": {
@@ -275,22 +275,20 @@
275
275
  }
276
276
  },
277
277
  "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.",
278
279
  "examples": [
279
280
  {
280
- "$comment": "By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228.",
281
281
  "sourceName": "cve",
282
282
  "externalId": "CVE-2021-44228",
283
283
  "rel": "definition"
284
284
  },
285
285
  {
286
- "$comment": "By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL.",
287
286
  "sourceName": "mitre-att&ck",
288
287
  "externalId": "T1059",
289
288
  "href": "https://attack.mitre.org/techniques/T1059/",
290
289
  "rel": "canonical"
291
290
  },
292
291
  {
293
- "$comment": "By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution.",
294
292
  "sourceName": "stix",
295
293
  "href": "https://cti.example.org/bundles/log4shell.json",
296
294
  "rel": "investigate",
@@ -306,7 +304,6 @@
306
304
  "addedAt": "2026-07-26T00:00:00Z"
307
305
  },
308
306
  {
309
- "$comment": "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.",
310
307
  "sourceName": "stix",
311
308
  "externalId": "vulnerability--f7c1b8e0-1234-4a2b-9c3d-000000000001",
312
309
  "href": "https://cti.example.org/bundles/log4shell.json#vulnerability--f7c1b8e0-1234-4a2b-9c3d-000000000001",
@@ -638,6 +635,24 @@
638
635
  "type",
639
636
  "data"
640
637
  ],
638
+ "if": {
639
+ "properties": {
640
+ "encoding": {
641
+ "const": "base64"
642
+ }
643
+ },
644
+ "required": [
645
+ "encoding"
646
+ ]
647
+ },
648
+ "then": {
649
+ "properties": {
650
+ "data": {
651
+ "pattern": "^[0-9A-Za-z+/]+={0,2}$",
652
+ "contentEncoding": "base64"
653
+ }
654
+ }
655
+ },
641
656
  "properties": {
642
657
  "type": {
643
658
  "type": "string",
@@ -654,7 +669,8 @@
654
669
  },
655
670
  "data": {
656
671
  "type": "string",
657
- "description": "The evidence content. For screenshots/files: base64-encoded data or URL. For code/logs: the raw text. For URLs: the URL string."
672
+ "minLength": 1,
673
+ "description": "The evidence content. For screenshots/files: base64-encoded data or URL. For code/logs: the raw text. For URLs: the URL string. Must not be empty. When encoding is 'base64', data must be bare base64 matching ^[0-9A-Za-z+/]+={0,2}$ (OSCAL's Base64Datatype): no data: URI prefix, URL, or line breaks."
658
674
  },
659
675
  "description": {
660
676
  "type": "string",
@@ -666,7 +682,7 @@
666
682
  },
667
683
  "encoding": {
668
684
  "type": "string",
669
- "description": "Encoding used for the data. Example: 'base64', 'utf-8'."
685
+ "description": "Encoding used for the data. Example: 'base64', 'utf-8'. The value 'base64' (exactly, lowercase) requires data to be bare base64."
670
686
  },
671
687
  "size": {
672
688
  "type": "number",
@@ -730,6 +746,7 @@
730
746
  }
731
747
  }
732
748
  ],
749
+ "$comment": "Examples, in order: 1) base64-encoded PNG screenshot with full capture provenance; 2) raw configuration text; 3) log excerpt; 4) URL to an external ticket; 5) base64-encoded file captured by an automated system.",
733
750
  "description": "Supporting evidence for a finding or override, such as screenshots, code samples, log excerpts, or URLs.",
734
751
  "title": "Evidence"
735
752
  },
@@ -807,6 +824,13 @@
807
824
  "status"
808
825
  ],
809
826
  "properties": {
827
+ "title": {
828
+ "type": "string",
829
+ "minLength": 1,
830
+ "pattern": "^[^ \\t\\n\\r]([^\\n\\r]*[^ \\t\\n\\r])?$",
831
+ "$comment": "The pattern is OSCAL's StringDatatype (\\S(.*\\S)?) as its XSD defines \\S and '.', spelled with explicit classes so ECMA-262 and Go regexp engines agree: \\S and '.' differ between them on CR and non-ASCII whitespace.",
832
+ "description": "Short single-line label for this milestone, suitable where a consumer needs a title (for example an OSCAL POA&M remediation or task). No line breaks, and no leading or trailing whitespace. The description remains the full text of the milestone; the title does not replace it."
833
+ },
810
834
  "description": {
811
835
  "type": "string",
812
836
  "description": "Description of this milestone or task."
@@ -836,6 +860,25 @@
836
860
  "description": "Identity of who completed this milestone."
837
861
  }
838
862
  },
863
+ "examples": [
864
+ {
865
+ "title": "Deploy OpenSSH 9.8p1",
866
+ "description": "Upgrade OpenSSH to 9.8p1 on every RHEL 9 host in the web tier to remediate CVE-2024-6387, then restart sshd during the Saturday maintenance window.",
867
+ "estimatedCompletion": "2026-10-31T00:00:00Z",
868
+ "status": "inProgress"
869
+ },
870
+ {
871
+ "description": "Isolate the affected host on a restricted VLAN until the vendor patch is available.",
872
+ "estimatedCompletion": "2026-09-05T00:00:00Z",
873
+ "status": "completed",
874
+ "completedAt": "2026-09-04T14:30:00Z",
875
+ "completedBy": {
876
+ "identifier": "network-admin@example.com",
877
+ "type": "email"
878
+ }
879
+ }
880
+ ],
881
+ "$comment": "Examples, in order: 1) titled milestone in progress — the title is the short label, the description the full remediation text; 2) untitled completed milestone with completion provenance — title is optional, and a consumer needing one derives it.",
839
882
  "description": "A milestone or task within a POA&M remediation plan.",
840
883
  "title": "Milestone"
841
884
  },
@@ -1125,9 +1168,9 @@
1125
1168
  "description": "Whether the requirement is mandatory within its baseline.\n\nDistinct from severity (risk weight) and status (lifecycle state).\n\nMaps cleanly onto: FedRAMP rev5 OSCAL 'CORE' prop, FedRAMP 20x inline 'Optional:' markers, CMMC sublevel rows, and CIS Implementation Group memberships (IG1/IG2/IG3 may carry richer semantics; layer those onto props[]/tags{}).\n\nOptional: when omitted, consumers should treat the requirement as 'required' by convention."
1126
1169
  }
1127
1170
  },
1171
+ "$comment": "Examples, in order: 1) v3.1.x-style requirement: classification fields omitted. Consumers must continue to handle this shape for backward compatibility; 2) v3.2 example populating all three classification fields. controlType=technical because AC-3 is enforced via configuration, not policy text. verificationMethod=automated because a check exists. applicability=required because this is a CORE control in the source baseline; 3) v3.2 example for a manual-by-design requirement. FedRAMP 20x KSIs are statement-form: code is omitted (not null) and verificationMethod=manual-by-design distinguishes this from 'automation could exist but doesn't yet'. controlType=policy because this is an authored governance statement; 4) v3.2 example for a STIG rule lacking a <fix>. Differs from manual-by-design: automation should exist, just not yet. applicability=advisory used here because the source format flagged it as recommended-but-not-mandatory; CIS-style IG memberships and FedRAMP 'Optional:' markers map onto applicability=optional or advisory similarly.",
1128
1172
  "examples": [
1129
1173
  {
1130
- "$comment": "v3.1.x-style requirement: classification fields omitted. Consumers must continue to handle this shape under v3.5.0 (backward compatibility).",
1131
1174
  "id": "SV-238196",
1132
1175
  "title": "The Ubuntu operating system must enforce password complexity",
1133
1176
  "impact": 0.5,
@@ -1157,7 +1200,6 @@
1157
1200
  ]
1158
1201
  },
1159
1202
  {
1160
- "$comment": "v3.2 example populating all three classification fields. controlType=technical because AC-3 is enforced via configuration, not policy text. verificationMethod=automated because a check exists. applicability=required because this is a CORE control in the source baseline.",
1161
1203
  "id": "AC-3",
1162
1204
  "title": "Access Enforcement",
1163
1205
  "impact": 0.7,
@@ -1179,7 +1221,6 @@
1179
1221
  "applicability": "required"
1180
1222
  },
1181
1223
  {
1182
- "$comment": "v3.2 example for a manual-by-design requirement. FedRAMP 20x KSIs are statement-form: code is omitted (not null) and verificationMethod=manual-by-design distinguishes this from 'automation could exist but doesn't yet'. controlType=policy because this is an authored governance statement.",
1183
1224
  "id": "KSI-CNA-01",
1184
1225
  "title": "Cyber Security Plan documents the system",
1185
1226
  "impact": 0.5,
@@ -1199,7 +1240,6 @@
1199
1240
  "applicability": "required"
1200
1241
  },
1201
1242
  {
1202
- "$comment": "v3.2 example for a STIG rule lacking a <fix>. Differs from manual-by-design: automation should exist, just not yet. applicability=advisory used here because the source format flagged it as recommended-but-not-mandatory; CIS-style IG memberships and FedRAMP 'Optional:' markers map onto applicability=optional or advisory similarly.",
1203
1243
  "id": "SV-999999",
1204
1244
  "title": "Example STIG rule pending automation",
1205
1245
  "impact": 0.3,
@@ -1264,9 +1304,9 @@
1264
1304
  }
1265
1305
  }
1266
1306
  },
1267
- "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.5.0": {
1307
+ "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.7.0": {
1268
1308
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1269
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.5.0",
1309
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/parameter/v3.7.0",
1270
1310
  "title": "HDF Parameter Primitives",
1271
1311
  "description": "Input/parameter type definitions for typed, traceable configuration values that bridge governance prose and scanner automation.",
1272
1312
  "$defs": {
@@ -1397,9 +1437,9 @@
1397
1437
  }
1398
1438
  }
1399
1439
  },
1400
- "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0": {
1440
+ "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0": {
1401
1441
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1402
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0",
1442
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0",
1403
1443
  "title": "HDF Extension Primitives",
1404
1444
  "description": "Extension types for waivers, attestations, generators, and integrity.",
1405
1445
  "$defs": {
@@ -1429,20 +1469,20 @@
1429
1469
  "externalReferences": {
1430
1470
  "type": "array",
1431
1471
  "items": {
1432
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/External_Reference"
1472
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1433
1473
  },
1434
1474
  "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."
1435
1475
  },
1436
1476
  "type": {
1437
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Override_Type",
1477
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Override_Type",
1438
1478
  "description": "The type of override applied to this requirement."
1439
1479
  },
1440
1480
  "status": {
1441
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0#/$defs/Result_Status",
1481
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
1442
1482
  "description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
1443
1483
  },
1444
1484
  "impact": {
1445
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Impact_Override",
1485
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Impact_Override",
1446
1486
  "description": "Override to the requirement's impact score. At least one of status or impact must be set."
1447
1487
  },
1448
1488
  "reason": {
@@ -1450,7 +1490,7 @@
1450
1490
  "description": "Explanation for why this override was applied."
1451
1491
  },
1452
1492
  "appliedBy": {
1453
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
1493
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1454
1494
  "description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
1455
1495
  },
1456
1496
  "appliedAt": {
@@ -1464,30 +1504,31 @@
1464
1504
  "description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
1465
1505
  },
1466
1506
  "signature": {
1467
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
1507
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1468
1508
  "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."
1469
1509
  },
1470
1510
  "evidence": {
1471
1511
  "type": "array",
1472
1512
  "items": {
1473
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
1513
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1474
1514
  },
1475
1515
  "description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
1476
1516
  },
1477
1517
  "previousChecksum": {
1478
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
1518
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1479
1519
  "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."
1480
1520
  },
1481
1521
  "cvss": {
1482
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0#/$defs/Cvss",
1522
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
1483
1523
  "$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.",
1484
1524
  "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."
1485
1525
  },
1486
1526
  "justification": {
1487
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Justification",
1527
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Justification",
1488
1528
  "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."
1489
1529
  }
1490
1530
  },
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.",
1491
1532
  "examples": [
1492
1533
  {
1493
1534
  "type": "waiver",
@@ -1514,7 +1555,6 @@
1514
1555
  "expiresAt": "2026-10-14T00:00:00Z"
1515
1556
  },
1516
1557
  {
1517
- "$comment": "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.",
1518
1558
  "type": "riskAdjustment",
1519
1559
  "impact": {
1520
1560
  "value": 0.9
@@ -1577,7 +1617,7 @@
1577
1617
  "evidence": [
1578
1618
  {
1579
1619
  "type": "screenshot",
1580
- "data": "base64-encoded-screenshot-data-here",
1620
+ "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
1581
1621
  "description": "Screenshot showing firewall configuration",
1582
1622
  "mimeType": "image/png",
1583
1623
  "encoding": "base64",
@@ -1620,7 +1660,7 @@
1620
1660
  "description": "Detailed explanation of the plan, including what actions will be taken."
1621
1661
  },
1622
1662
  "appliedBy": {
1623
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
1663
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1624
1664
  "description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
1625
1665
  },
1626
1666
  "appliedAt": {
@@ -1636,23 +1676,23 @@
1636
1676
  "milestones": {
1637
1677
  "type": "array",
1638
1678
  "items": {
1639
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Milestone"
1679
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
1640
1680
  },
1641
1681
  "description": "Optional array of milestones tracking progress toward completion."
1642
1682
  },
1643
1683
  "signature": {
1644
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
1684
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1645
1685
  "description": "Optional digital signature for enhanced trust and non-repudiation."
1646
1686
  },
1647
1687
  "evidence": {
1648
1688
  "type": "array",
1649
1689
  "items": {
1650
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
1690
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1651
1691
  },
1652
1692
  "description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
1653
1693
  },
1654
1694
  "previousChecksum": {
1655
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
1695
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1656
1696
  "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."
1657
1697
  }
1658
1698
  },
@@ -1805,7 +1845,7 @@
1805
1845
  },
1806
1846
  "properties": {
1807
1847
  "algorithm": {
1808
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Hash_Algorithm",
1848
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Hash_Algorithm",
1809
1849
  "description": "The hash algorithm used for the checksum."
1810
1850
  },
1811
1851
  "checksum": {
@@ -1838,9 +1878,9 @@
1838
1878
  }
1839
1879
  }
1840
1880
  },
1841
- "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0": {
1881
+ "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0": {
1842
1882
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1843
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0",
1883
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0",
1844
1884
  "title": "HDF Amendment Primitives",
1845
1885
  "description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
1846
1886
  "$defs": {
@@ -1951,7 +1991,7 @@
1951
1991
  "externalReferences": {
1952
1992
  "type": "array",
1953
1993
  "items": {
1954
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/External_Reference"
1994
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1955
1995
  },
1956
1996
  "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."
1957
1997
  },
@@ -1961,6 +2001,7 @@
1961
2001
  },
1962
2002
  "requirementId": {
1963
2003
  "type": "string",
2004
+ "minLength": 1,
1964
2005
  "description": "The ID of the requirement being amended. Must match a requirement ID in the referenced baseline."
1965
2006
  },
1966
2007
  "baselineRef": {
@@ -1968,7 +2009,7 @@
1968
2009
  "description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
1969
2010
  },
1970
2011
  "status": {
1971
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0#/$defs/Result_Status",
2012
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
1972
2013
  "description": "The new status this amendment sets. Optional when only impact is being overridden."
1973
2014
  },
1974
2015
  "impact": {
@@ -1980,7 +2021,7 @@
1980
2021
  "description": "Justification for this amendment."
1981
2022
  },
1982
2023
  "appliedBy": {
1983
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
2024
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1984
2025
  "description": "Identity of who applied this amendment."
1985
2026
  },
1986
2027
  "appliedAt": {
@@ -1996,20 +2037,20 @@
1996
2037
  "evidence": {
1997
2038
  "type": "array",
1998
2039
  "items": {
1999
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
2040
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
2000
2041
  },
2001
2042
  "description": "Supporting evidence (screenshots, logs, URLs, documents)."
2002
2043
  },
2003
2044
  "signature": {
2004
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
2045
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
2005
2046
  "description": "Digital signature for non-repudiation."
2006
2047
  },
2007
2048
  "previousChecksum": {
2008
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
2049
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
2009
2050
  "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."
2010
2051
  },
2011
2052
  "cvss": {
2012
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0#/$defs/Cvss",
2053
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
2013
2054
  "$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.",
2014
2055
  "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."
2015
2056
  },
@@ -2020,7 +2061,7 @@
2020
2061
  "milestones": {
2021
2062
  "type": "array",
2022
2063
  "items": {
2023
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Milestone"
2064
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
2024
2065
  },
2025
2066
  "description": "Remediation milestones (primarily for POA&M type amendments)."
2026
2067
  },
@@ -2037,11 +2078,12 @@
2037
2078
  "affectedPackages": {
2038
2079
  "type": "array",
2039
2080
  "items": {
2040
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0#/$defs/Affected_Package"
2081
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0#/$defs/Affected_Package"
2041
2082
  },
2042
2083
  "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)."
2043
2084
  }
2044
2085
  },
2086
+ "$comment": "Example 7: VEX-style import — falsePositive scoped to specific packages by purl. The affectedPackages array carries structured product identity instead of squeezing 'Products: …' into the reason free-text field.",
2045
2087
  "examples": [
2046
2088
  {
2047
2089
  "type": "waiver",
@@ -2143,7 +2185,6 @@
2143
2185
  "expiresAt": "2026-09-26T00:00:00Z"
2144
2186
  },
2145
2187
  {
2146
- "$comment": "VEX-style import — falsePositive scoped to specific packages by purl. The affectedPackages array carries structured product identity instead of squeezing 'Products: …' into the reason free-text field.",
2147
2188
  "type": "falsePositive",
2148
2189
  "requirementId": "CVE-2026-12345",
2149
2190
  "status": "notApplicable",
@@ -2170,9 +2211,9 @@
2170
2211
  }
2171
2212
  }
2172
2213
  },
2173
- "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0": {
2214
+ "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0": {
2174
2215
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2175
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0",
2216
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0",
2176
2217
  "title": "HDF Result Primitives",
2177
2218
  "description": "Types for representing assessment results and statuses.",
2178
2219
  "$defs": {
@@ -2303,9 +2344,9 @@
2303
2344
  }
2304
2345
  }
2305
2346
  },
2306
- "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0": {
2347
+ "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0": {
2307
2348
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2308
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0",
2349
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0",
2309
2350
  "title": "HDF CVSS Primitives",
2310
2351
  "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).",
2311
2352
  "$defs": {
@@ -2369,7 +2410,7 @@
2369
2410
  ]
2370
2411
  }
2371
2412
  ],
2372
- "$comment": "Only `version` is required; every metric/score field is optional because a single Cvss instance may represent vendor-supplied Base data (on a finding's cvss[]), consumer-supplied enrichment (on a riskAdjustment override — Environmental/Threat/Supplemental deltas with NO base, since base is the finding's scan-specific vendor data), or a fully-resolved effectiveCvss. The Base/Threat/Environmental/Supplemental groups do not partition cleanly into vendor-vs-consumer (Threat straddles: vendor temporal data and consumer exploit-maturity both live here), so a single permissive type is more honest than separate vendor/consumer types. The anyOf guardrail rejects a content-free object (e.g. {version} alone) by requiring at least one substantive metric or score. baseVector remains optional even when baseScore is present: some vendor tools (Twistlock/Prisma Cloud) emit a final score without the vector that derived it — that score is captured structurally rather than lost.",
2413
+ "$comment": "Only `version` is required; every metric/score field is optional because a single Cvss instance may represent vendor-supplied Base data (on a finding's cvss[]), consumer-supplied enrichment (on a riskAdjustment override — Environmental/Threat/Supplemental deltas with NO base, since base is the finding's scan-specific vendor data), or a fully-resolved effectiveCvss. The Base/Threat/Environmental/Supplemental groups do not partition cleanly into vendor-vs-consumer (Threat straddles: vendor temporal data and consumer exploit-maturity both live here), so a single permissive type is more honest than separate vendor/consumer types. The anyOf guardrail rejects a content-free object (e.g. {version} alone) by requiring at least one substantive metric or score. baseVector remains optional even when baseScore is present: some vendor tools (Twistlock/Prisma Cloud) emit a final score without the vector that derived it — that score is captured structurally rather than lost. Examples, in order: 1) Base-only: vendor-supplied CVSS 3.1 data exactly as a scanner (e.g., Nessus, Grype) would emit it. No consumer enrichment yet; 2) Base + Threat: consumer added Exploit Maturity ('E:U' = Unproven) and Remediation Level ('RL:O' = Official Fix) to a HTTP/2 'Rapid Reset' DoS finding. Threat score drops from base 7.5 to 5.5; 3) Base + Environmental: consumer asserts the affected system is high-criticality (CR:H, IR:H, AR:H) AND network-reachable in their environment (MAV:N). Environmental score reflects deployment risk for the xz-utils backdoor; 4) Full CVSS 4.0: vendor base + consumer threat (E:A = Attacked, exploits seen in the wild) + environmental (high CIA requirements) + supplemental context (S:P = present safety impact, AU:N = no autonomous spread, RE:M = moderate response effort) for the Fortinet FortiOS pre-auth RCE. computedScore reflects post-mitigation final risk; 5) CVSS 2.0 legacy: Heartbleed (CVE-2014-0160) as still reported by older scanner output and legacy NVD data. CVSS 2.0 vectors have no 'CVSS:2.0/' prefix.",
2373
2414
  "properties": {
2374
2415
  "version": {
2375
2416
  "type": "string",
@@ -2449,7 +2490,6 @@
2449
2490
  },
2450
2491
  "examples": [
2451
2492
  {
2452
- "$comment": "Base-only: vendor-supplied CVSS 3.1 data exactly as a scanner (e.g., Nessus, Grype) would emit it. No consumer enrichment yet.",
2453
2493
  "version": "3.1",
2454
2494
  "source": "CVE-2024-12345",
2455
2495
  "baseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
@@ -2457,7 +2497,6 @@
2457
2497
  "baseSeverity": "critical"
2458
2498
  },
2459
2499
  {
2460
- "$comment": "Base + Threat: consumer added Exploit Maturity ('E:U' = Unproven) and Remediation Level ('RL:O' = Official Fix) to a HTTP/2 'Rapid Reset' DoS finding. Threat score drops from base 7.5 to 5.5.",
2461
2500
  "version": "3.1",
2462
2501
  "source": "CVE-2023-44487",
2463
2502
  "baseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
@@ -2467,7 +2506,6 @@
2467
2506
  "threatScore": 5.5
2468
2507
  },
2469
2508
  {
2470
- "$comment": "Base + Environmental: consumer asserts the affected system is high-criticality (CR:H, IR:H, AR:H) AND network-reachable in their environment (MAV:N). Environmental score reflects deployment risk for the xz-utils backdoor.",
2471
2509
  "version": "3.1",
2472
2510
  "source": "CVE-2024-3094",
2473
2511
  "baseVector": "CVSS:3.1/AV:L/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H",
@@ -2479,7 +2517,6 @@
2479
2517
  "computedSeverity": "critical"
2480
2518
  },
2481
2519
  {
2482
- "$comment": "Full CVSS 4.0: vendor base + consumer threat (E:A = Attacked, exploits seen in the wild) + environmental (high CIA requirements) + supplemental context (S:P = present safety impact, AU:N = no autonomous spread, RE:M = moderate response effort) for the Fortinet FortiOS pre-auth RCE. computedScore reflects post-mitigation final risk.",
2483
2520
  "version": "4.0",
2484
2521
  "source": "CVE-2024-21762",
2485
2522
  "baseVector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
@@ -2494,7 +2531,6 @@
2494
2531
  "computedSeverity": "medium"
2495
2532
  },
2496
2533
  {
2497
- "$comment": "CVSS 2.0 legacy: Heartbleed (CVE-2014-0160) as still reported by older scanner output and legacy NVD data. CVSS 2.0 vectors have no 'CVSS:2.0/' prefix.",
2498
2534
  "version": "2.0",
2499
2535
  "source": "CVE-2014-0160",
2500
2536
  "baseVector": "AV:N/AC:L/Au:N/C:P/I:N/A:N",
@@ -2507,9 +2543,9 @@
2507
2543
  }
2508
2544
  }
2509
2545
  },
2510
- "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0": {
2546
+ "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0": {
2511
2547
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2512
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0",
2548
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0",
2513
2549
  "title": "HDF Affected Package Primitives",
2514
2550
  "description": "Types for representing the software package(s) affected by a vulnerability finding.",
2515
2551
  "$defs": {
@@ -2575,9 +2611,9 @@
2575
2611
  "description": "Optional version string identifying the first release that contains the fix for the vulnerability. Use the same version syntax as `version`. Example: '1.1.1l' fixes 'openssl@1.1.1k'."
2576
2612
  }
2577
2613
  },
2614
+ "$comment": "Examples, in order: 1) RPM ecosystem with full CPE + PURL — typical Grype/Trivy output for a RHEL host scan; 2) NPM ecosystem with PURL only — the JavaScript world rarely emits CPEs; PURL is the canonical identifier; 3) Minimal valid AffectedPackage — only the three required fields. Use when the scanner reports a package by name+version without emitting CPE or PURL strings; 4) Maven ecosystem with full identifiers + fixedInVersion — log4j Log4Shell-style finding showing the patch path from vulnerable to fixed; 5) purl-only — VEX import path where the source format gives a purl and we choose not to decompose it. Valid because purl encodes name/version/ecosystem implicitly; 6) cpe-only — NIST-flavored scopes where the consumer carries a CPE 2.3 string and no purl. Valid because cpe encodes vendor/product/version.",
2578
2615
  "examples": [
2579
2616
  {
2580
- "$comment": "RPM ecosystem with full CPE + PURL — typical Grype/Trivy output for a RHEL host scan.",
2581
2617
  "name": "openssl",
2582
2618
  "version": "1.1.1k-7.el8_4",
2583
2619
  "ecosystem": "rpm",
@@ -2586,7 +2622,6 @@
2586
2622
  "fixedInVersion": "1.1.1l"
2587
2623
  },
2588
2624
  {
2589
- "$comment": "NPM ecosystem with PURL only — the JavaScript world rarely emits CPEs; PURL is the canonical identifier.",
2590
2625
  "name": "lodash",
2591
2626
  "version": "4.17.20",
2592
2627
  "ecosystem": "npm",
@@ -2594,13 +2629,11 @@
2594
2629
  "fixedInVersion": "4.17.21"
2595
2630
  },
2596
2631
  {
2597
- "$comment": "Minimal valid AffectedPackage — only the three required fields. Use when the scanner reports a package by name+version without emitting CPE or PURL strings.",
2598
2632
  "name": "requests",
2599
2633
  "version": "2.28.1",
2600
2634
  "ecosystem": "pypi"
2601
2635
  },
2602
2636
  {
2603
- "$comment": "Maven ecosystem with full identifiers + fixedInVersion — log4j Log4Shell-style finding showing the patch path from vulnerable to fixed.",
2604
2637
  "name": "org.apache.logging.log4j:log4j-core",
2605
2638
  "version": "2.14.1",
2606
2639
  "ecosystem": "maven",
@@ -2609,11 +2642,9 @@
2609
2642
  "fixedInVersion": "2.17.1"
2610
2643
  },
2611
2644
  {
2612
- "$comment": "purl-only — VEX import path where the source format gives a purl and we choose not to decompose it. Valid because purl encodes name/version/ecosystem implicitly.",
2613
2645
  "purl": "pkg:npm/lodash@4.17.20"
2614
2646
  },
2615
2647
  {
2616
- "$comment": "cpe-only — NIST-flavored scopes where the consumer carries a CPE 2.3 string and no purl. Valid because cpe encodes vendor/product/version.",
2617
2648
  "cpe": "cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*"
2618
2649
  }
2619
2650
  ],