@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-plan/v3.5.0",
3
+ "$id": "https://mitre.github.io/hdf-libs/schemas/hdf-plan/v3.7.0",
4
4
  "title": "HDF Plan",
5
5
  "description": "Defines an assessment plan — what baselines to run against which targets, with resolved inputs and scheduling. Maps to OSCAL Assessment Plan.",
6
6
  "type": "object",
@@ -13,7 +13,7 @@
13
13
  "externalReferences": {
14
14
  "type": "array",
15
15
  "items": {
16
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/External_Reference"
16
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
17
17
  },
18
18
  "description": "Optional references to external artifacts relevant to this assessment plan (CTI/STIX, advisories, methodology docs, or any URI-addressable artifact). Inert context; see External_Reference."
19
19
  },
@@ -27,7 +27,7 @@
27
27
  "description": "Human-readable plan name. Example: 'Portal Monthly Assessment'."
28
28
  },
29
29
  "type": {
30
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.5.0#/$defs/Plan_Type",
30
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Plan_Type",
31
31
  "description": "The type of assessment plan."
32
32
  },
33
33
  "description": {
@@ -43,12 +43,12 @@
43
43
  "type": "array",
44
44
  "minItems": 1,
45
45
  "items": {
46
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.5.0#/$defs/Assessment"
46
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Assessment"
47
47
  },
48
48
  "description": "The assessments to perform. Each assessment pairs a baseline with targets and resolved inputs."
49
49
  },
50
50
  "schedule": {
51
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.5.0#/$defs/Schedule",
51
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0#/$defs/Schedule",
52
52
  "description": "Optional scheduling configuration for recurring assessments."
53
53
  },
54
54
  "labels": {
@@ -59,7 +59,7 @@
59
59
  "description": "Optional key-value labels for grouping and querying plans."
60
60
  },
61
61
  "integrity": {
62
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0#/$defs/Integrity",
62
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Integrity",
63
63
  "description": "Cryptographic integrity information for verifying this plan document has not been tampered with."
64
64
  },
65
65
  "version": {
@@ -67,7 +67,7 @@
67
67
  "description": "Version of this plan document."
68
68
  },
69
69
  "generator": {
70
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0#/$defs/Generator",
70
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0#/$defs/Generator",
71
71
  "description": "Information about the tool that generated this plan."
72
72
  }
73
73
  },
@@ -101,9 +101,9 @@
101
101
  }
102
102
  ],
103
103
  "$defs": {
104
- "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0": {
104
+ "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0": {
105
105
  "$schema": "https://json-schema.org/draft/2020-12/schema",
106
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0",
106
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0",
107
107
  "title": "HDF Common Primitives",
108
108
  "description": "Shared building blocks used by hdf-results and hdf-baseline schemas.",
109
109
  "$defs": {
@@ -183,22 +183,20 @@
183
183
  }
184
184
  },
185
185
  "unevaluatedProperties": false,
186
+ "$comment": "Examples, in order: 1) By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228; 2) By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL; 3) By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution; 4) Enrichment envelope: a STIX threat-intel object embedded losslessly in `document` and classified via `kind`, cited by id and pointed at by href — the pointer and the embedded copy compose. The payload rides verbatim; HDF does not normalize STIX fields.",
186
187
  "examples": [
187
188
  {
188
- "$comment": "By-identity: cite a CVE by its id in the 'cve' system without a URL — equivalently urn:cve:CVE-2021-44228.",
189
189
  "sourceName": "cve",
190
190
  "externalId": "CVE-2021-44228",
191
191
  "rel": "definition"
192
192
  },
193
193
  {
194
- "$comment": "By-identity AND by-locator together (anyOf, not oneOf) — an ATT&CK technique cited by id with its canonical URL.",
195
194
  "sourceName": "mitre-att&ck",
196
195
  "externalId": "T1059",
197
196
  "href": "https://attack.mitre.org/techniques/T1059/",
198
197
  "rel": "canonical"
199
198
  },
200
199
  {
201
- "$comment": "By-locator to a retrievable STIX bundle, with integrity hash, media type, and attribution.",
202
200
  "sourceName": "stix",
203
201
  "href": "https://cti.example.org/bundles/log4shell.json",
204
202
  "rel": "investigate",
@@ -214,7 +212,6 @@
214
212
  "addedAt": "2026-07-26T00:00:00Z"
215
213
  },
216
214
  {
217
- "$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.",
218
215
  "sourceName": "stix",
219
216
  "externalId": "vulnerability--f7c1b8e0-1234-4a2b-9c3d-000000000001",
220
217
  "href": "https://cti.example.org/bundles/log4shell.json#vulnerability--f7c1b8e0-1234-4a2b-9c3d-000000000001",
@@ -546,6 +543,24 @@
546
543
  "type",
547
544
  "data"
548
545
  ],
546
+ "if": {
547
+ "properties": {
548
+ "encoding": {
549
+ "const": "base64"
550
+ }
551
+ },
552
+ "required": [
553
+ "encoding"
554
+ ]
555
+ },
556
+ "then": {
557
+ "properties": {
558
+ "data": {
559
+ "pattern": "^[0-9A-Za-z+/]+={0,2}$",
560
+ "contentEncoding": "base64"
561
+ }
562
+ }
563
+ },
549
564
  "properties": {
550
565
  "type": {
551
566
  "type": "string",
@@ -562,7 +577,8 @@
562
577
  },
563
578
  "data": {
564
579
  "type": "string",
565
- "description": "The evidence content. For screenshots/files: base64-encoded data or URL. For code/logs: the raw text. For URLs: the URL string."
580
+ "minLength": 1,
581
+ "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."
566
582
  },
567
583
  "description": {
568
584
  "type": "string",
@@ -574,7 +590,7 @@
574
590
  },
575
591
  "encoding": {
576
592
  "type": "string",
577
- "description": "Encoding used for the data. Example: 'base64', 'utf-8'."
593
+ "description": "Encoding used for the data. Example: 'base64', 'utf-8'. The value 'base64' (exactly, lowercase) requires data to be bare base64."
578
594
  },
579
595
  "size": {
580
596
  "type": "number",
@@ -638,6 +654,7 @@
638
654
  }
639
655
  }
640
656
  ],
657
+ "$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.",
641
658
  "description": "Supporting evidence for a finding or override, such as screenshots, code samples, log excerpts, or URLs.",
642
659
  "title": "Evidence"
643
660
  },
@@ -715,6 +732,13 @@
715
732
  "status"
716
733
  ],
717
734
  "properties": {
735
+ "title": {
736
+ "type": "string",
737
+ "minLength": 1,
738
+ "pattern": "^[^ \\t\\n\\r]([^\\n\\r]*[^ \\t\\n\\r])?$",
739
+ "$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.",
740
+ "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."
741
+ },
718
742
  "description": {
719
743
  "type": "string",
720
744
  "description": "Description of this milestone or task."
@@ -744,6 +768,25 @@
744
768
  "description": "Identity of who completed this milestone."
745
769
  }
746
770
  },
771
+ "examples": [
772
+ {
773
+ "title": "Deploy OpenSSH 9.8p1",
774
+ "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.",
775
+ "estimatedCompletion": "2026-10-31T00:00:00Z",
776
+ "status": "inProgress"
777
+ },
778
+ {
779
+ "description": "Isolate the affected host on a restricted VLAN until the vendor patch is available.",
780
+ "estimatedCompletion": "2026-09-05T00:00:00Z",
781
+ "status": "completed",
782
+ "completedAt": "2026-09-04T14:30:00Z",
783
+ "completedBy": {
784
+ "identifier": "network-admin@example.com",
785
+ "type": "email"
786
+ }
787
+ }
788
+ ],
789
+ "$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.",
747
790
  "description": "A milestone or task within a POA&M remediation plan.",
748
791
  "title": "Milestone"
749
792
  },
@@ -1033,9 +1076,9 @@
1033
1076
  "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."
1034
1077
  }
1035
1078
  },
1079
+ "$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.",
1036
1080
  "examples": [
1037
1081
  {
1038
- "$comment": "v3.1.x-style requirement: classification fields omitted. Consumers must continue to handle this shape under v3.5.0 (backward compatibility).",
1039
1082
  "id": "SV-238196",
1040
1083
  "title": "The Ubuntu operating system must enforce password complexity",
1041
1084
  "impact": 0.5,
@@ -1065,7 +1108,6 @@
1065
1108
  ]
1066
1109
  },
1067
1110
  {
1068
- "$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.",
1069
1111
  "id": "AC-3",
1070
1112
  "title": "Access Enforcement",
1071
1113
  "impact": 0.7,
@@ -1087,7 +1129,6 @@
1087
1129
  "applicability": "required"
1088
1130
  },
1089
1131
  {
1090
- "$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.",
1091
1132
  "id": "KSI-CNA-01",
1092
1133
  "title": "Cyber Security Plan documents the system",
1093
1134
  "impact": 0.5,
@@ -1107,7 +1148,6 @@
1107
1148
  "applicability": "required"
1108
1149
  },
1109
1150
  {
1110
- "$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.",
1111
1151
  "id": "SV-999999",
1112
1152
  "title": "Example STIG rule pending automation",
1113
1153
  "impact": 0.3,
@@ -1172,9 +1212,9 @@
1172
1212
  }
1173
1213
  }
1174
1214
  },
1175
- "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.5.0": {
1215
+ "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0": {
1176
1216
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1177
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.5.0",
1217
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/plan/v3.7.0",
1178
1218
  "title": "HDF Plan Primitives",
1179
1219
  "description": "Types for defining assessment plans — what to scan, how to configure it, and when to run.",
1180
1220
  "$defs": {
@@ -1222,7 +1262,7 @@
1222
1262
  "description": "componentId of the system component this assessment targets. Use for direct component binding. Alternative to targetSelector."
1223
1263
  },
1224
1264
  "targetSelector": {
1225
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.5.0#/$defs/Target_Selector",
1265
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0#/$defs/Target_Selector",
1226
1266
  "description": "Label selector to match targets for this assessment. Overrides the system component's targetSelector if provided."
1227
1267
  },
1228
1268
  "inputs": {
@@ -1304,9 +1344,9 @@
1304
1344
  }
1305
1345
  }
1306
1346
  },
1307
- "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.5.0": {
1347
+ "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0": {
1308
1348
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1309
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.5.0",
1349
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/system/v3.7.0",
1310
1350
  "title": "HDF System Primitives",
1311
1351
  "description": "Types for describing system architecture, authorization boundaries, and components.",
1312
1352
  "$defs": {
@@ -1357,7 +1397,7 @@
1357
1397
  "description": "Rationale for why this override is needed."
1358
1398
  },
1359
1399
  "approvedBy": {
1360
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
1400
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1361
1401
  "description": "Identity of the person or system that approved this override."
1362
1402
  }
1363
1403
  },
@@ -1439,9 +1479,9 @@
1439
1479
  }
1440
1480
  }
1441
1481
  },
1442
- "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0": {
1482
+ "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0": {
1443
1483
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1444
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.5.0",
1484
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/extensions/v3.7.0",
1445
1485
  "title": "HDF Extension Primitives",
1446
1486
  "description": "Extension types for waivers, attestations, generators, and integrity.",
1447
1487
  "$defs": {
@@ -1471,20 +1511,20 @@
1471
1511
  "externalReferences": {
1472
1512
  "type": "array",
1473
1513
  "items": {
1474
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/External_Reference"
1514
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1475
1515
  },
1476
1516
  "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."
1477
1517
  },
1478
1518
  "type": {
1479
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Override_Type",
1519
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Override_Type",
1480
1520
  "description": "The type of override applied to this requirement."
1481
1521
  },
1482
1522
  "status": {
1483
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0#/$defs/Result_Status",
1523
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
1484
1524
  "description": "The new status this override sets for the requirement. Optional when only impact is being overridden."
1485
1525
  },
1486
1526
  "impact": {
1487
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Impact_Override",
1527
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Impact_Override",
1488
1528
  "description": "Override to the requirement's impact score. At least one of status or impact must be set."
1489
1529
  },
1490
1530
  "reason": {
@@ -1492,7 +1532,7 @@
1492
1532
  "description": "Explanation for why this override was applied."
1493
1533
  },
1494
1534
  "appliedBy": {
1495
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
1535
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1496
1536
  "description": "Identity of who applied this override. For simple cases, use type 'simple' with just an identifier."
1497
1537
  },
1498
1538
  "appliedAt": {
@@ -1506,30 +1546,31 @@
1506
1546
  "description": "Timestamp when this override expires and must be reviewed/renewed. REQUIRED - no permanent overrides allowed. ISO 8601 format."
1507
1547
  },
1508
1548
  "signature": {
1509
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
1549
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1510
1550
  "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."
1511
1551
  },
1512
1552
  "evidence": {
1513
1553
  "type": "array",
1514
1554
  "items": {
1515
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
1555
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1516
1556
  },
1517
1557
  "description": "Supporting evidence for this override, such as screenshots demonstrating manual verification for attestations."
1518
1558
  },
1519
1559
  "previousChecksum": {
1520
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
1560
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1521
1561
  "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."
1522
1562
  },
1523
1563
  "cvss": {
1524
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0#/$defs/Cvss",
1564
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
1525
1565
  "$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.",
1526
1566
  "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."
1527
1567
  },
1528
1568
  "justification": {
1529
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0#/$defs/Justification",
1569
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0#/$defs/Justification",
1530
1570
  "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."
1531
1571
  }
1532
1572
  },
1573
+ "$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.",
1533
1574
  "examples": [
1534
1575
  {
1535
1576
  "type": "waiver",
@@ -1556,7 +1597,6 @@
1556
1597
  "expiresAt": "2026-10-14T00:00:00Z"
1557
1598
  },
1558
1599
  {
1559
- "$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.",
1560
1600
  "type": "riskAdjustment",
1561
1601
  "impact": {
1562
1602
  "value": 0.9
@@ -1619,7 +1659,7 @@
1619
1659
  "evidence": [
1620
1660
  {
1621
1661
  "type": "screenshot",
1622
- "data": "base64-encoded-screenshot-data-here",
1662
+ "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
1623
1663
  "description": "Screenshot showing firewall configuration",
1624
1664
  "mimeType": "image/png",
1625
1665
  "encoding": "base64",
@@ -1662,7 +1702,7 @@
1662
1702
  "description": "Detailed explanation of the plan, including what actions will be taken."
1663
1703
  },
1664
1704
  "appliedBy": {
1665
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
1705
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
1666
1706
  "description": "Identity of who created this POA&M. For simple cases, use type 'simple' with just an identifier."
1667
1707
  },
1668
1708
  "appliedAt": {
@@ -1678,23 +1718,23 @@
1678
1718
  "milestones": {
1679
1719
  "type": "array",
1680
1720
  "items": {
1681
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Milestone"
1721
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
1682
1722
  },
1683
1723
  "description": "Optional array of milestones tracking progress toward completion."
1684
1724
  },
1685
1725
  "signature": {
1686
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
1726
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
1687
1727
  "description": "Optional digital signature for enhanced trust and non-repudiation."
1688
1728
  },
1689
1729
  "evidence": {
1690
1730
  "type": "array",
1691
1731
  "items": {
1692
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
1732
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
1693
1733
  },
1694
1734
  "description": "Supporting evidence for this POA&M, such as documentation of compensating controls or mitigation implementation."
1695
1735
  },
1696
1736
  "previousChecksum": {
1697
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
1737
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
1698
1738
  "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."
1699
1739
  }
1700
1740
  },
@@ -1847,7 +1887,7 @@
1847
1887
  },
1848
1888
  "properties": {
1849
1889
  "algorithm": {
1850
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Hash_Algorithm",
1890
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Hash_Algorithm",
1851
1891
  "description": "The hash algorithm used for the checksum."
1852
1892
  },
1853
1893
  "checksum": {
@@ -1880,9 +1920,9 @@
1880
1920
  }
1881
1921
  }
1882
1922
  },
1883
- "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0": {
1923
+ "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0": {
1884
1924
  "$schema": "https://json-schema.org/draft/2020-12/schema",
1885
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.5.0",
1925
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/amendments/v3.7.0",
1886
1926
  "title": "HDF Amendment Primitives",
1887
1927
  "description": "Types for waivers, attestations, and POA&Ms that modify requirement compliance status.",
1888
1928
  "$defs": {
@@ -1993,7 +2033,7 @@
1993
2033
  "externalReferences": {
1994
2034
  "type": "array",
1995
2035
  "items": {
1996
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/External_Reference"
2036
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/External_Reference"
1997
2037
  },
1998
2038
  "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."
1999
2039
  },
@@ -2003,6 +2043,7 @@
2003
2043
  },
2004
2044
  "requirementId": {
2005
2045
  "type": "string",
2046
+ "minLength": 1,
2006
2047
  "description": "The ID of the requirement being amended. Must match a requirement ID in the referenced baseline."
2007
2048
  },
2008
2049
  "baselineRef": {
@@ -2010,7 +2051,7 @@
2010
2051
  "description": "Name of the baseline containing the requirement. Required when the system has multiple baselines with potentially overlapping requirement IDs."
2011
2052
  },
2012
2053
  "status": {
2013
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0#/$defs/Result_Status",
2054
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0#/$defs/Result_Status",
2014
2055
  "description": "The new status this amendment sets. Optional when only impact is being overridden."
2015
2056
  },
2016
2057
  "impact": {
@@ -2022,7 +2063,7 @@
2022
2063
  "description": "Justification for this amendment."
2023
2064
  },
2024
2065
  "appliedBy": {
2025
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Identity",
2066
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Identity",
2026
2067
  "description": "Identity of who applied this amendment."
2027
2068
  },
2028
2069
  "appliedAt": {
@@ -2038,20 +2079,20 @@
2038
2079
  "evidence": {
2039
2080
  "type": "array",
2040
2081
  "items": {
2041
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Evidence"
2082
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Evidence"
2042
2083
  },
2043
2084
  "description": "Supporting evidence (screenshots, logs, URLs, documents)."
2044
2085
  },
2045
2086
  "signature": {
2046
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Signature",
2087
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Signature",
2047
2088
  "description": "Digital signature for non-repudiation."
2048
2089
  },
2049
2090
  "previousChecksum": {
2050
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Checksum",
2091
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Checksum",
2051
2092
  "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."
2052
2093
  },
2053
2094
  "cvss": {
2054
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0#/$defs/Cvss",
2095
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0#/$defs/Cvss",
2055
2096
  "$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.",
2056
2097
  "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."
2057
2098
  },
@@ -2062,7 +2103,7 @@
2062
2103
  "milestones": {
2063
2104
  "type": "array",
2064
2105
  "items": {
2065
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.5.0#/$defs/Milestone"
2106
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/common/v3.7.0#/$defs/Milestone"
2066
2107
  },
2067
2108
  "description": "Remediation milestones (primarily for POA&M type amendments)."
2068
2109
  },
@@ -2079,11 +2120,12 @@
2079
2120
  "affectedPackages": {
2080
2121
  "type": "array",
2081
2122
  "items": {
2082
- "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0#/$defs/Affected_Package"
2123
+ "$ref": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0#/$defs/Affected_Package"
2083
2124
  },
2084
2125
  "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)."
2085
2126
  }
2086
2127
  },
2128
+ "$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.",
2087
2129
  "examples": [
2088
2130
  {
2089
2131
  "type": "waiver",
@@ -2185,7 +2227,6 @@
2185
2227
  "expiresAt": "2026-09-26T00:00:00Z"
2186
2228
  },
2187
2229
  {
2188
- "$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.",
2189
2230
  "type": "falsePositive",
2190
2231
  "requirementId": "CVE-2026-12345",
2191
2232
  "status": "notApplicable",
@@ -2212,9 +2253,9 @@
2212
2253
  }
2213
2254
  }
2214
2255
  },
2215
- "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0": {
2256
+ "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0": {
2216
2257
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2217
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.5.0",
2258
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/result/v3.7.0",
2218
2259
  "title": "HDF Result Primitives",
2219
2260
  "description": "Types for representing assessment results and statuses.",
2220
2261
  "$defs": {
@@ -2345,9 +2386,9 @@
2345
2386
  }
2346
2387
  }
2347
2388
  },
2348
- "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0": {
2389
+ "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0": {
2349
2390
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2350
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.5.0",
2391
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/cvss/v3.7.0",
2351
2392
  "title": "HDF CVSS Primitives",
2352
2393
  "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).",
2353
2394
  "$defs": {
@@ -2411,7 +2452,7 @@
2411
2452
  ]
2412
2453
  }
2413
2454
  ],
2414
- "$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.",
2455
+ "$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.",
2415
2456
  "properties": {
2416
2457
  "version": {
2417
2458
  "type": "string",
@@ -2491,7 +2532,6 @@
2491
2532
  },
2492
2533
  "examples": [
2493
2534
  {
2494
- "$comment": "Base-only: vendor-supplied CVSS 3.1 data exactly as a scanner (e.g., Nessus, Grype) would emit it. No consumer enrichment yet.",
2495
2535
  "version": "3.1",
2496
2536
  "source": "CVE-2024-12345",
2497
2537
  "baseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
@@ -2499,7 +2539,6 @@
2499
2539
  "baseSeverity": "critical"
2500
2540
  },
2501
2541
  {
2502
- "$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.",
2503
2542
  "version": "3.1",
2504
2543
  "source": "CVE-2023-44487",
2505
2544
  "baseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
@@ -2509,7 +2548,6 @@
2509
2548
  "threatScore": 5.5
2510
2549
  },
2511
2550
  {
2512
- "$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.",
2513
2551
  "version": "3.1",
2514
2552
  "source": "CVE-2024-3094",
2515
2553
  "baseVector": "CVSS:3.1/AV:L/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H",
@@ -2521,7 +2559,6 @@
2521
2559
  "computedSeverity": "critical"
2522
2560
  },
2523
2561
  {
2524
- "$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.",
2525
2562
  "version": "4.0",
2526
2563
  "source": "CVE-2024-21762",
2527
2564
  "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",
@@ -2536,7 +2573,6 @@
2536
2573
  "computedSeverity": "medium"
2537
2574
  },
2538
2575
  {
2539
- "$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.",
2540
2576
  "version": "2.0",
2541
2577
  "source": "CVE-2014-0160",
2542
2578
  "baseVector": "AV:N/AC:L/Au:N/C:P/I:N/A:N",
@@ -2549,9 +2585,9 @@
2549
2585
  }
2550
2586
  }
2551
2587
  },
2552
- "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0": {
2588
+ "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0": {
2553
2589
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2554
- "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.5.0",
2590
+ "$id": "https://mitre.github.io/hdf-libs/schemas/primitives/affected-package/v3.7.0",
2555
2591
  "title": "HDF Affected Package Primitives",
2556
2592
  "description": "Types for representing the software package(s) affected by a vulnerability finding.",
2557
2593
  "$defs": {
@@ -2617,9 +2653,9 @@
2617
2653
  "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'."
2618
2654
  }
2619
2655
  },
2656
+ "$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.",
2620
2657
  "examples": [
2621
2658
  {
2622
- "$comment": "RPM ecosystem with full CPE + PURL — typical Grype/Trivy output for a RHEL host scan.",
2623
2659
  "name": "openssl",
2624
2660
  "version": "1.1.1k-7.el8_4",
2625
2661
  "ecosystem": "rpm",
@@ -2628,7 +2664,6 @@
2628
2664
  "fixedInVersion": "1.1.1l"
2629
2665
  },
2630
2666
  {
2631
- "$comment": "NPM ecosystem with PURL only — the JavaScript world rarely emits CPEs; PURL is the canonical identifier.",
2632
2667
  "name": "lodash",
2633
2668
  "version": "4.17.20",
2634
2669
  "ecosystem": "npm",
@@ -2636,13 +2671,11 @@
2636
2671
  "fixedInVersion": "4.17.21"
2637
2672
  },
2638
2673
  {
2639
- "$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.",
2640
2674
  "name": "requests",
2641
2675
  "version": "2.28.1",
2642
2676
  "ecosystem": "pypi"
2643
2677
  },
2644
2678
  {
2645
- "$comment": "Maven ecosystem with full identifiers + fixedInVersion — log4j Log4Shell-style finding showing the patch path from vulnerable to fixed.",
2646
2679
  "name": "org.apache.logging.log4j:log4j-core",
2647
2680
  "version": "2.14.1",
2648
2681
  "ecosystem": "maven",
@@ -2651,11 +2684,9 @@
2651
2684
  "fixedInVersion": "2.17.1"
2652
2685
  },
2653
2686
  {
2654
- "$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.",
2655
2687
  "purl": "pkg:npm/lodash@4.17.20"
2656
2688
  },
2657
2689
  {
2658
- "$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.",
2659
2690
  "cpe": "cpe:2.3:a:openssl:openssl:1.1.1k:*:*:*:*:*:*:*"
2660
2691
  }
2661
2692
  ],