@blamejs/exceptd-skills 0.9.5 → 0.10.0
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/AGENTS.md +45 -0
- package/CHANGELOG.md +66 -0
- package/README.md +30 -5
- package/bin/exceptd.js +400 -1
- package/data/_indexes/_meta.json +2 -2
- package/data/playbooks/ai-api.json +763 -0
- package/data/playbooks/containers.json +766 -0
- package/data/playbooks/cred-stores.json +715 -0
- package/data/playbooks/crypto.json +726 -0
- package/data/playbooks/framework.json +725 -0
- package/data/playbooks/hardening.json +672 -0
- package/data/playbooks/kernel.json +549 -0
- package/data/playbooks/mcp.json +727 -0
- package/data/playbooks/runtime.json +649 -0
- package/data/playbooks/sbom.json +893 -0
- package/data/playbooks/secrets.json +690 -0
- package/lib/cross-ref-api.js +224 -0
- package/lib/playbook-runner.js +826 -0
- package/lib/schemas/playbook.schema.json +652 -0
- package/manifest-snapshot.json +1 -1
- package/manifest.json +39 -39
- package/orchestrator/scanner.js +23 -1
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
|
@@ -0,0 +1,893 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"id": "sbom",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"last_threat_review": "2026-05-11",
|
|
6
|
+
"threat_currency_score": 95,
|
|
7
|
+
"changelog": [
|
|
8
|
+
{
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"date": "2026-05-11",
|
|
11
|
+
"summary": "Initial seven-phase supply-chain SBOM playbook. Inventories installed packages via dpkg-query / rpm -qa / brew list / npm ls / pip freeze / cargo tree / gem list, walks repo lockfiles (package-lock.json / yarn.lock / pnpm-lock.yaml / Pipfile.lock / poetry.lock / requirements.txt / Cargo.lock / go.sum / Gemfile.lock), and matches versions to data/cve-catalog.json. Tests SLSA provenance, Sigstore attestation, and VEX status. Full GRC closure with NIS2 / DORA / EU CRA notification clocks.",
|
|
12
|
+
"cves_added": ["CVE-2026-31431", "CVE-2026-43284", "CVE-2026-43500", "CVE-2025-53773", "CVE-2026-30615"],
|
|
13
|
+
"framework_gaps_updated": ["nist-800-53-SA-12", "nist-800-218-SSDF", "iso-27001-2022-A.8.30", "eu-cra-art13", "nis2-art21-2d", "dora-art28"]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"owner": "@blamejs/supply-chain",
|
|
17
|
+
"air_gap_mode": false,
|
|
18
|
+
"preconditions": [
|
|
19
|
+
{
|
|
20
|
+
"id": "filesystem-read",
|
|
21
|
+
"description": "Agent must be able to read system package directories, /usr/lib, /var/lib/dpkg, /var/lib/rpm, $HOME, and the cwd.",
|
|
22
|
+
"check": "agent_has_filesystem_read == true",
|
|
23
|
+
"on_fail": "halt"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "any-package-manager-present",
|
|
27
|
+
"description": "At least one supported package manager or lockfile must be present, otherwise there is no supply chain inventory this playbook can build.",
|
|
28
|
+
"check": "agent_has_command('dpkg-query') OR agent_has_command('rpm') OR agent_has_command('brew') OR agent_has_command('npm') OR agent_has_command('pip') OR agent_has_command('cargo') OR exists_any_lockfile",
|
|
29
|
+
"on_fail": "warn"
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"mutex": [],
|
|
33
|
+
"feeds_into": [
|
|
34
|
+
{
|
|
35
|
+
"playbook_id": "framework",
|
|
36
|
+
"condition": "analyze.compliance_theater_check.verdict == 'theater'"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"playbook_id": "kernel",
|
|
40
|
+
"condition": "any matched_cve.attack_class == 'kernel-lpe'"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"playbook_id": "mcp",
|
|
44
|
+
"condition": "any matched_cve.attack_class == 'mcp-supply-chain'"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"playbook_id": "ai-api",
|
|
48
|
+
"condition": "any matched_cve.attack_class IN ['ai-c2', 'prompt-injection']"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
"domain": {
|
|
54
|
+
"name": "Software bill of materials + supply-chain integrity",
|
|
55
|
+
"attack_class": "supply-chain",
|
|
56
|
+
"atlas_refs": ["AML.T0010", "AML.T0018"],
|
|
57
|
+
"attack_refs": ["T1195.001", "T1195.002", "T1554"],
|
|
58
|
+
"cve_refs": ["CVE-2026-31431", "CVE-2026-43284", "CVE-2026-43500", "CVE-2025-53773", "CVE-2026-30615"],
|
|
59
|
+
"cwe_refs": ["CWE-1357", "CWE-1395", "CWE-494", "CWE-502", "CWE-829"],
|
|
60
|
+
"d3fend_refs": ["D3-CBAN", "D3-EAL", "D3-EHB"],
|
|
61
|
+
"frameworks_in_scope": [
|
|
62
|
+
"nist-800-53", "nist-csf-2", "iso-27001-2022",
|
|
63
|
+
"soc2", "pci-dss-4", "nis2", "dora", "eu-cra",
|
|
64
|
+
"uk-caf", "au-ism", "au-essential-8", "cmmc", "hipaa"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
"phases": {
|
|
69
|
+
|
|
70
|
+
"govern": {
|
|
71
|
+
"jurisdiction_obligations": [
|
|
72
|
+
{
|
|
73
|
+
"jurisdiction": "EU",
|
|
74
|
+
"regulation": "NIS2 Art.21(2)(d)",
|
|
75
|
+
"obligation": "submit_supply_chain_evidence",
|
|
76
|
+
"window_hours": 720,
|
|
77
|
+
"clock_starts": "manual",
|
|
78
|
+
"evidence_required": ["sbom_inventory", "cve_match_register", "vex_statements", "remediation_plan"]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"jurisdiction": "EU",
|
|
82
|
+
"regulation": "NIS2 Art.23",
|
|
83
|
+
"obligation": "notify_regulator",
|
|
84
|
+
"window_hours": 24,
|
|
85
|
+
"clock_starts": "detect_confirmed",
|
|
86
|
+
"evidence_required": ["affected_systems_inventory", "matched_cves_with_active_exploitation", "interim_mitigation_record"]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"jurisdiction": "EU",
|
|
90
|
+
"regulation": "NIS2 Art.23",
|
|
91
|
+
"obligation": "notify_regulator",
|
|
92
|
+
"window_hours": 72,
|
|
93
|
+
"clock_starts": "analyze_complete",
|
|
94
|
+
"evidence_required": ["full_incident_assessment", "remediation_plan", "vex_status_per_matched_cve"]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"jurisdiction": "EU",
|
|
98
|
+
"regulation": "DORA Art.28",
|
|
99
|
+
"obligation": "submit_third_party_ict_risk_evidence",
|
|
100
|
+
"window_hours": 720,
|
|
101
|
+
"clock_starts": "manual",
|
|
102
|
+
"evidence_required": ["ict_third_party_register", "concentration_risk_assessment", "subcontracting_inventory"]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"jurisdiction": "EU",
|
|
106
|
+
"regulation": "DORA Art.19",
|
|
107
|
+
"obligation": "notify_regulator",
|
|
108
|
+
"window_hours": 4,
|
|
109
|
+
"clock_starts": "detect_confirmed",
|
|
110
|
+
"evidence_required": ["initial_notification", "ict_third_party_dependencies"]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"jurisdiction": "EU",
|
|
114
|
+
"regulation": "EU CRA Art.13 / Annex I",
|
|
115
|
+
"obligation": "submit_technical_documentation",
|
|
116
|
+
"window_hours": 8760,
|
|
117
|
+
"clock_starts": "manual",
|
|
118
|
+
"evidence_required": ["sbom_per_product", "vulnerability_handling_evidence", "security_update_record"]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"jurisdiction": "EU",
|
|
122
|
+
"regulation": "EU CRA Art.14",
|
|
123
|
+
"obligation": "notify_actively_exploited_vulnerability",
|
|
124
|
+
"window_hours": 24,
|
|
125
|
+
"clock_starts": "detect_confirmed",
|
|
126
|
+
"evidence_required": ["affected_product_identification", "exploitation_evidence", "mitigation_status"]
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"jurisdiction": "AU",
|
|
130
|
+
"regulation": "APRA CPS 234",
|
|
131
|
+
"obligation": "notify_regulator",
|
|
132
|
+
"window_hours": 72,
|
|
133
|
+
"clock_starts": "validate_complete",
|
|
134
|
+
"evidence_required": ["materiality_assessment", "remediation_completed_evidence"]
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"theater_fingerprints": [
|
|
138
|
+
{
|
|
139
|
+
"pattern_id": "sbom-without-cve-correlation",
|
|
140
|
+
"claim": "We produce SBOMs per release — supply chain transparency requirement is met.",
|
|
141
|
+
"fast_detection_test": "Pull the most recent SBOM. Cross-reference its component list against data/cve-catalog.json. If the SBOM exists but no automated CVE correlation runs against it — i.e. the SBOM is a deliverable not a control — that is the canonical SBOM theater. SBOM as artifact without continuous correlation = paper compliance.",
|
|
142
|
+
"implicated_controls": ["nist-800-53-SA-12", "nist-800-218-SSDF-PS-3", "eu-cra-art13"]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"pattern_id": "lockfile-without-integrity",
|
|
146
|
+
"claim": "Dependencies are pinned in lockfiles — supply chain is reproducible.",
|
|
147
|
+
"fast_detection_test": "Walk all lockfiles (package-lock.json / yarn.lock / pnpm-lock.yaml / Pipfile.lock / poetry.lock / Cargo.lock / go.sum / Gemfile.lock). For each pinned entry, confirm it carries an integrity hash (sha512/sha384/sha256, sri-integrity, or go.sum cryptographic hash). Theater if any pinned entry lacks integrity — version-pin alone is a name that can be re-published over.",
|
|
148
|
+
"implicated_controls": ["nist-800-53-SA-12", "iso-27001-2022-A.8.30", "slsa-l3"]
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"pattern_id": "transitive-deps-unsbomed",
|
|
152
|
+
"claim": "Our SBOM lists all dependencies.",
|
|
153
|
+
"fast_detection_test": "Diff the SBOM component count against the lockfile transitive count (npm ls --depth=Infinity, pip freeze + resolve transitively, cargo tree --depth=Infinity). Theater if transitive count exceeds SBOM count by > 5% — direct deps only is incomplete SBOM.",
|
|
154
|
+
"implicated_controls": ["nist-800-218-SSDF-PS-3", "eu-cra-art13", "cyclonedx-1-6"]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"pattern_id": "no-vex-statements",
|
|
158
|
+
"claim": "We respond to vulnerability alerts as they arise.",
|
|
159
|
+
"fast_detection_test": "For each matched CVE in the org's SBOM, check whether a VEX (Vulnerability Exploitability eXchange) statement exists. Theater if matched CVEs lack VEX status (not_affected / affected / fixed / under_investigation) — without VEX, every match becomes a manual investigation each time, and the org cannot demonstrate which matches are not exploitable in their context.",
|
|
160
|
+
"implicated_controls": ["nist-800-218-SSDF", "vex-csaf-2-1", "eu-cra-art14"]
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"pattern_id": "ai-generated-code-not-in-sbom",
|
|
164
|
+
"claim": "Our SBOM is complete.",
|
|
165
|
+
"fast_detection_test": "AI coding assistants (Copilot, Cursor, Claude Code, Windsurf, Codex, Gemini CLI) commit code without provenance attestation. Theater if the org uses AI coding assistants AND no SBOM field captures AI-generated code provenance (which model produced the code, against what context, with what training cutoff). The SBOM lists npm:lodash@4.17.21 but not 'function parseUrl was emitted by Copilot from a docstring that contained indirect prompt injection.'",
|
|
166
|
+
"implicated_controls": ["nist-800-218-SSDF", "cyclonedx-1-7-ml-bom", "spdx-3-1-ai-profile"]
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"pattern_id": "model-weights-not-treated-as-supply-chain",
|
|
170
|
+
"claim": "We treat models as artifacts.",
|
|
171
|
+
"fast_detection_test": "Inventory model weight files (.pt, .ckpt, .bin, .safetensors) on the host or in repo storage. For each, check (a) signed publisher key, (b) Sigstore-rekor entry, (c) format that doesn't execute code on load (safetensors versus .pt code-executing-deserialization formats). Theater if model weights are pulled from Hugging Face / GitHub LFS with hash-pinning only — hash-pinning a malicious blob does not prevent execution; only signature verification plus non-executing format closes the class (CWE-502).",
|
|
172
|
+
"implicated_controls": ["nist-800-218-SSDF", "openssf-model-signing", "atlas-aml-t0018"]
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"framework_context": {
|
|
176
|
+
"gap_summary": "Supply-chain frameworks have advanced fastest of any class in this exceptd release: SLSA v1.0, in-toto attestations, Sigstore signing, CycloneDX 1.6 / SPDX 3.0 SBOM, CSAF 2.0 VEX are all operational. Frameworks have begun to incorporate them: EU CRA (2024/2847) makes SBOM and vulnerability handling mandatory for products with digital elements; US NIST 800-218 SSDF + EO 14028 mandate SBOM for federal procurement; NIS2 Art.21(2)(d) makes supply chain security an essential measure. The gap is implementation: orgs produce SBOMs as deliverables without continuous CVE correlation, lockfiles without integrity hashes, no VEX statements, no AI-generated-code provenance, model weights treated as content blobs not supply-chain artifacts. The XZ Utils backdoor (2024, CVE-2024-3094) remains the canonical example of maintainer-position long-game supply-chain compromise that no SBOM-only program detects — the defense is in-toto attestation chain plus reproducible builds plus maintainer-key transparency, none of which are mandated by current compliance frameworks. CVE-2026-30615 (Windsurf MCP zero-interaction RCE) extends the supply-chain attack surface to developer tools themselves. CVE-2026-31431 (Copy Fail) demonstrates the SBOM-to-RWEP path: a single matched CVE in the kernel package list, KEV-listed and AI-discovered, becomes a 4-hour incident.",
|
|
177
|
+
"lag_score": 90,
|
|
178
|
+
"per_framework_gaps": [
|
|
179
|
+
{
|
|
180
|
+
"framework": "nist-800-53",
|
|
181
|
+
"control_id": "SA-12",
|
|
182
|
+
"designed_for": "Supply chain protection for traditional software acquisition.",
|
|
183
|
+
"insufficient_because": "Does not require continuous CVE correlation against produced SBOMs. SBOM as deliverable satisfies SA-12; SBOM as control does not."
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"framework": "nist-800-218",
|
|
187
|
+
"control_id": "SSDF PS.3 / PW.4",
|
|
188
|
+
"designed_for": "Secure software development practices including SBOM generation.",
|
|
189
|
+
"insufficient_because": "Mandates SBOM generation; does not mandate (a) integrity-hashed lockfiles, (b) transitive completeness check, (c) VEX statements, (d) AI-generated code provenance, (e) model weights as supply-chain artifacts."
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"framework": "iso-27001-2022",
|
|
193
|
+
"control_id": "A.8.30",
|
|
194
|
+
"designed_for": "Outsourced development.",
|
|
195
|
+
"insufficient_because": "Procurement-event lens. Continuous lockfile drift + transitive dependency change is not captured by procurement review."
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"framework": "iso-27001-2022",
|
|
199
|
+
"control_id": "A.5.20",
|
|
200
|
+
"designed_for": "Addressing information security within supplier agreements.",
|
|
201
|
+
"insufficient_because": "Supplier-agreement lens does not produce signature-attestation requirements for community-maintained packages."
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"framework": "soc2",
|
|
205
|
+
"control_id": "CC9.2",
|
|
206
|
+
"designed_for": "Vendor and business partner risk management.",
|
|
207
|
+
"insufficient_because": "Vendor inventory excludes open-source dependencies and AI-coding-assistant-emitted code."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"framework": "pci-dss-4",
|
|
211
|
+
"control_id": "6.3.2 / 6.3.3",
|
|
212
|
+
"designed_for": "Bespoke and custom software vulnerability tracking + patches.",
|
|
213
|
+
"insufficient_because": "Tracks vulnerabilities; does not mandate continuous SBOM-to-CVE correlation or VEX. 30-day patch window inadequate for KEV-listed dependency CVEs."
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"framework": "nis2",
|
|
217
|
+
"control_id": "Art.21(2)(d)",
|
|
218
|
+
"designed_for": "Supply chain security, including security-related aspects of relationships with direct suppliers.",
|
|
219
|
+
"insufficient_because": "Names supply chain security as essential measure; defers specifics. Implementing acts have not bound (a)-(e) above."
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"framework": "dora",
|
|
223
|
+
"control_id": "Art.28",
|
|
224
|
+
"designed_for": "ICT third-party risk management.",
|
|
225
|
+
"insufficient_because": "Captures direct ICT third parties (e.g. SaaS, cloud). Open-source dependency layer + AI-coding-assistant-emitted code is not a contractual third party."
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"framework": "eu-cra",
|
|
229
|
+
"control_id": "Art.13 / Annex I",
|
|
230
|
+
"designed_for": "Essential cybersecurity requirements for products with digital elements.",
|
|
231
|
+
"insufficient_because": "Mandates SBOM and vulnerability handling; implementing acts for technical documentation through 2027. Until then, SBOM format and content vary; transitive completeness, VEX, AI-code provenance, model weights not binding."
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"framework": "eu-cra",
|
|
235
|
+
"control_id": "Art.14",
|
|
236
|
+
"designed_for": "Actively-exploited-vulnerability 24-hour notification.",
|
|
237
|
+
"insufficient_because": "Notification window is tight; many orgs lack the SBOM-to-active-exploit correlation infrastructure to detect within window. Process gap, not control-text gap."
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
"skill_preload": ["supply-chain-integrity", "exploit-scoring", "framework-gap-analysis", "compliance-theater", "policy-exception-gen"]
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
"direct": {
|
|
245
|
+
"threat_context": "Supply-chain landscape Q1-Q2 2026: in-scope artifacts are every build-pipeline input, CI runner image, container base, transitive package, model weight loaded at inference, and AI-coding-assistant-emitted code committed to the repo. Defining incidents driving the current state: (1) CVE-2026-30615 (Windsurf MCP zero-interaction RCE, 150M+ download blast radius) — developer tool with no enforced manifest signing executes attacker-controlled code with zero user interaction. (2) CVE-2026-31431 (Copy Fail) — KEV-listed kernel LPE that matches via dpkg/rpm package inventory in seconds, becomes a 4-hour incident. (3) XZ Utils backdoor (CVE-2024-3094, 2024) — maintainer-position long-game compromise that no SBOM-only program detected. Typosquat campaigns target MCP, Hugging Face, npm @modelcontextprotocol/*, and PyPI ML namespaces (ATLAS AML.T0010). Model weights in code-executing serialization formats are CWE-502 deserialization vectors (ATLAS AML.T0018); hash-pinning a malicious blob does not prevent execution. AI-generated code is opaque-provenance code: Copilot/Cursor/Claude Code/Windsurf/Codex/Gemini emit code committed without attestation of which model produced it. Compliance trajectory: EU CRA (Art.13/14) and NIST SSDF have established SBOM as mandatory deliverable; implementing acts and program maturity continue to lag — orgs produce SBOMs without continuous correlation, VEX, transitive completeness, AI-code provenance, or model-weight signature verification.",
|
|
246
|
+
"rwep_threshold": {
|
|
247
|
+
"escalate": 80,
|
|
248
|
+
"monitor": 50,
|
|
249
|
+
"close": 30
|
|
250
|
+
},
|
|
251
|
+
"framework_lag_declaration": "Supply-chain frameworks have advanced fastest of any class in this exceptd release, but implementation gaps are pervasive. NIST 800-53 SA-12, NIST 800-218 SSDF, ISO 27001:2022 A.8.30/A.5.20, SOC 2 CC9.2, PCI DSS 4.0 sect.6.3, NIS2 Art.21(2)(d), DORA Art.28, EU CRA Art.13/14 all permit (a) SBOM as deliverable without continuous correlation, (b) lockfile-pinning without integrity hash, (c) direct-deps-only SBOM, (d) absence of VEX statements, (e) absence of AI-generated-code provenance, (f) model weights treated as content blobs. Lag = ~90 days behind operational tooling (SLSA / Sigstore / in-toto / VEX-CSAF) and ~210 days behind AI-coding-assistant adoption tempo. Compensating controls (continuous CVE correlation, integrity-pinned lockfiles, transitive SBOM completeness, VEX maintenance, AI-code provenance, model weight signature verification + safetensors-only loading) MUST close the gap before SBOM-as-deliverable compliance can be accepted.",
|
|
252
|
+
"skill_chain": [
|
|
253
|
+
{ "skill": "supply-chain-integrity", "purpose": "Inventory installed packages and walk lockfiles. Test SLSA build provenance, Sigstore signing, in-toto attestation, VEX status, AI-code provenance, model weight signing.", "required": true },
|
|
254
|
+
{ "skill": "exploit-scoring", "purpose": "For each matched CVE: compute RWEP using catalog kev / poc / ai-discovery / active-exploitation / patch / live-patch fields. Rank for triage.", "required": true },
|
|
255
|
+
{ "skill": "framework-gap-analysis", "purpose": "Map matched CVEs and theater fingerprints to framework controls that fail to cover them.", "skip_if": "analyze.framework_gap_mapping.length == 0", "required": false },
|
|
256
|
+
{ "skill": "compliance-theater", "purpose": "Run the six theater fingerprints in govern.theater_fingerprints; emit verdict per pattern.", "required": true },
|
|
257
|
+
{ "skill": "policy-exception-gen", "purpose": "Generate auditor-ready exception for any matched CVE that cannot be remediated within the relevant compliance window.", "skip_if": "close.exception_generation.trigger_condition == false", "required": false }
|
|
258
|
+
],
|
|
259
|
+
"token_budget": {
|
|
260
|
+
"estimated_total": 26000,
|
|
261
|
+
"breakdown": {
|
|
262
|
+
"govern": 3000,
|
|
263
|
+
"direct": 1700,
|
|
264
|
+
"look": 3200,
|
|
265
|
+
"detect": 3800,
|
|
266
|
+
"analyze": 5500,
|
|
267
|
+
"validate": 5400,
|
|
268
|
+
"close": 3400
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
"look": {
|
|
274
|
+
"artifacts": [
|
|
275
|
+
{
|
|
276
|
+
"id": "dpkg-packages",
|
|
277
|
+
"type": "process_list",
|
|
278
|
+
"source": "dpkg-query -W -f='${Package}\\t${Version}\\t${Architecture}\\t${Source}\\n' 2>/dev/null",
|
|
279
|
+
"description": "Debian/Ubuntu installed packages — name, version, architecture, source package.",
|
|
280
|
+
"required": false,
|
|
281
|
+
"air_gap_alternative": "Read /var/lib/dpkg/status directly if dpkg-query unavailable."
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"id": "rpm-packages",
|
|
285
|
+
"type": "process_list",
|
|
286
|
+
"source": "rpm -qa --queryformat '%{NAME}\\t%{VERSION}-%{RELEASE}\\t%{ARCH}\\t%{SOURCERPM}\\n' 2>/dev/null",
|
|
287
|
+
"description": "RHEL/Fedora/SUSE installed packages — name, version-release, architecture, source RPM.",
|
|
288
|
+
"required": false,
|
|
289
|
+
"air_gap_alternative": "Read /var/lib/rpm directly if rpm command unavailable."
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"id": "brew-packages",
|
|
293
|
+
"type": "process_list",
|
|
294
|
+
"source": "brew list --formula --versions 2>/dev/null AND brew list --cask --versions 2>/dev/null",
|
|
295
|
+
"description": "macOS Homebrew installed packages.",
|
|
296
|
+
"required": false
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"id": "npm-global-packages",
|
|
300
|
+
"type": "process_list",
|
|
301
|
+
"source": "npm ls -g --depth=Infinity --json 2>/dev/null",
|
|
302
|
+
"description": "npm global packages with full transitive tree.",
|
|
303
|
+
"required": false,
|
|
304
|
+
"air_gap_alternative": "Walk $(npm root -g) directory listing for installed packages."
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"id": "pip-packages",
|
|
308
|
+
"type": "process_list",
|
|
309
|
+
"source": "pip list --format=json 2>/dev/null AND pip freeze 2>/dev/null AND pipx list --json 2>/dev/null",
|
|
310
|
+
"description": "System / user Python packages.",
|
|
311
|
+
"required": false
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"id": "cargo-installed",
|
|
315
|
+
"type": "process_list",
|
|
316
|
+
"source": "cargo install --list 2>/dev/null",
|
|
317
|
+
"description": "Rust binaries installed via cargo.",
|
|
318
|
+
"required": false
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"id": "gem-packages",
|
|
322
|
+
"type": "process_list",
|
|
323
|
+
"source": "gem list --local 2>/dev/null",
|
|
324
|
+
"description": "Ruby gems installed system/user-wide.",
|
|
325
|
+
"required": false
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"id": "go-binaries",
|
|
329
|
+
"type": "process_list",
|
|
330
|
+
"source": "ls -la $GOPATH/bin /usr/local/go/bin 2>/dev/null AND for each Go binary, run 'go version -m <bin>' to extract build info + dependencies",
|
|
331
|
+
"description": "Go binaries with embedded build info (BuildID, module versions).",
|
|
332
|
+
"required": false
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"id": "repo-lockfiles",
|
|
336
|
+
"type": "config_file",
|
|
337
|
+
"source": "Recursive walk of $(pwd) and configured search roots for: package-lock.json, yarn.lock, pnpm-lock.yaml, Pipfile.lock, poetry.lock, requirements.txt, Cargo.lock, go.sum, Gemfile.lock, composer.lock, gradle.lockfile",
|
|
338
|
+
"description": "Repo-level lockfiles — primary source of pinned transitive dependencies.",
|
|
339
|
+
"required": false
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "container-image-layers",
|
|
343
|
+
"type": "config_file",
|
|
344
|
+
"source": "If docker / podman / nerdctl available: list running containers AND inspect each image's package layers (docker history <image> AND for each layer, dpkg-query / rpm -qa inside the layer).",
|
|
345
|
+
"description": "Containerized package inventory — different from host packages.",
|
|
346
|
+
"required": false
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"id": "ai-coding-assistant-inventory",
|
|
350
|
+
"type": "config_file",
|
|
351
|
+
"source": "$HOME/.cursor, $HOME/.codeium, $HOME/.config/claude, $HOME/.config/Code, $HOME/.gemini — versions of installed assistants",
|
|
352
|
+
"description": "AI coding assistant versions — needed to match against CVE-2025-53773 (Copilot) / CVE-2026-30615 (Windsurf).",
|
|
353
|
+
"required": false
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"id": "model-weight-files",
|
|
357
|
+
"type": "file_path",
|
|
358
|
+
"source": "find $HOME ~/.cache/huggingface ~/.cache/torch /var/lib/model-store -type f \\( -name '*.pt' -o -name '*.ckpt' -o -name '*.bin' -o -name '*.safetensors' -o -name '*.gguf' \\) 2>/dev/null AND for each: file <path> AND attempt to identify Sigstore signature / OpenSSF model-signing attestation",
|
|
359
|
+
"description": "Model weight artifacts — needed for AI-supply-chain analysis (ATLAS AML.T0018).",
|
|
360
|
+
"required": false
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"id": "sbom-artifacts",
|
|
364
|
+
"type": "config_file",
|
|
365
|
+
"source": "Find existing SBOMs in repo / artifact storage: *.cdx.json (CycloneDX), *.spdx.json (SPDX), bom.json, sbom.json",
|
|
366
|
+
"description": "Existing SBOM artifacts — needed to test theater fingerprint #1 (sbom-without-cve-correlation).",
|
|
367
|
+
"required": false
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"id": "vex-statements",
|
|
371
|
+
"type": "config_file",
|
|
372
|
+
"source": "Find existing VEX statements: *.vex.json, *.csaf.json (CSAF VEX profile)",
|
|
373
|
+
"description": "VEX statements — needed to test theater fingerprint #4 (no-vex-statements).",
|
|
374
|
+
"required": false
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"id": "cve-catalog",
|
|
378
|
+
"type": "config_file",
|
|
379
|
+
"source": "data/cve-catalog.json — local exceptd CVE catalog with full per-CVE RWEP scoring inputs",
|
|
380
|
+
"description": "Authoritative catalog for matched-CVE correlation.",
|
|
381
|
+
"required": true,
|
|
382
|
+
"air_gap_alternative": "Catalog is shipped with exceptd; available offline."
|
|
383
|
+
}
|
|
384
|
+
],
|
|
385
|
+
"collection_scope": {
|
|
386
|
+
"time_window": "current",
|
|
387
|
+
"asset_scope": "local_host_and_attached_repos",
|
|
388
|
+
"depth": "deep",
|
|
389
|
+
"sampling": "Single-host point-in-time inventory. Fleet rollout requires per-host execution OR central package-management system integration. Per-repo lockfile walk requires repo-clone or CI-integrated execution."
|
|
390
|
+
},
|
|
391
|
+
"environment_assumptions": [
|
|
392
|
+
{
|
|
393
|
+
"assumption": "host has at least one supported package manager OR lockfile in cwd",
|
|
394
|
+
"if_false": "Return visibility_gap=no_supply_chain_surface. Host genuinely has no manageable supply chain (e.g. minimal container with only static binary)."
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"assumption": "agent has read access to /var/lib/dpkg, /var/lib/rpm, package-manager state dirs, repo-cwd",
|
|
398
|
+
"if_false": "Halt — without read access to package state, inventory is empty and matching is impossible."
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"assumption": "data/cve-catalog.json is loadable",
|
|
402
|
+
"if_false": "Halt — without the catalog, no matched-CVE correlation is possible."
|
|
403
|
+
}
|
|
404
|
+
],
|
|
405
|
+
"fallback_if_unavailable": [
|
|
406
|
+
{ "artifact_id": "sbom-artifacts", "fallback_action": "mark_inconclusive", "confidence_impact": "low" },
|
|
407
|
+
{ "artifact_id": "vex-statements", "fallback_action": "mark_inconclusive", "confidence_impact": "medium" },
|
|
408
|
+
{ "artifact_id": "container-image-layers", "fallback_action": "use_compensating_artifact", "confidence_impact": "medium" },
|
|
409
|
+
{ "artifact_id": "ai-coding-assistant-inventory", "fallback_action": "use_compensating_artifact", "confidence_impact": "low" },
|
|
410
|
+
{ "artifact_id": "model-weight-files", "fallback_action": "use_compensating_artifact", "confidence_impact": "low" },
|
|
411
|
+
{ "artifact_id": "cve-catalog", "fallback_action": "escalate_to_human", "confidence_impact": "high" }
|
|
412
|
+
]
|
|
413
|
+
},
|
|
414
|
+
|
|
415
|
+
"detect": {
|
|
416
|
+
"indicators": [
|
|
417
|
+
{
|
|
418
|
+
"id": "package-matches-catalogued-cve",
|
|
419
|
+
"type": "log_pattern",
|
|
420
|
+
"value": "Any inventoried package version falls inside any catalogued CVE's affected_versions range, where the CVE's framework and category match the package's class",
|
|
421
|
+
"description": "Primary detector — installed-package version matches a catalogued CVE.",
|
|
422
|
+
"confidence": "high",
|
|
423
|
+
"deterministic": false,
|
|
424
|
+
"attack_ref": "T1195.002"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"id": "lockfile-no-integrity",
|
|
428
|
+
"type": "log_pattern",
|
|
429
|
+
"value": "Any pinned dependency in walked lockfiles lacks an integrity field (sha512/sha384/sha256, sri-integrity, go.sum-style hash)",
|
|
430
|
+
"description": "Theater fingerprint #2 detection — name-pinned without integrity.",
|
|
431
|
+
"confidence": "deterministic",
|
|
432
|
+
"deterministic": true
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"id": "transitive-deps-incomplete-sbom",
|
|
436
|
+
"type": "log_pattern",
|
|
437
|
+
"value": "SBOM artifact present AND transitive dep count > SBOM component count * 1.05",
|
|
438
|
+
"description": "Theater fingerprint #3 — SBOM lists direct deps only.",
|
|
439
|
+
"confidence": "high",
|
|
440
|
+
"deterministic": false
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"id": "matched-cve-without-vex",
|
|
444
|
+
"type": "log_pattern",
|
|
445
|
+
"value": "package-matches-catalogued-cve == true AND no VEX statement exists for the matched CVE in the org's VEX register",
|
|
446
|
+
"description": "Theater fingerprint #4 detection — matched CVE without exploitability declaration.",
|
|
447
|
+
"confidence": "deterministic",
|
|
448
|
+
"deterministic": true
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"id": "ai-code-no-provenance",
|
|
452
|
+
"type": "behavioral_signal",
|
|
453
|
+
"value": "ai-coding-assistant-inventory shows at least one installed assistant AND SBOM has no fields capturing AI-emitted code (no ml-bom, no spdx ai-profile, no commit-trailer convention)",
|
|
454
|
+
"description": "Theater fingerprint #5 detection — AI in use, AI-emitted code not in SBOM.",
|
|
455
|
+
"confidence": "high",
|
|
456
|
+
"deterministic": false
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"id": "model-weight-unsigned-and-executable-format",
|
|
460
|
+
"type": "file_path",
|
|
461
|
+
"value": "model-weight-files lists any .pt / .ckpt / .bin file without Sigstore / OpenSSF model-signing attestation",
|
|
462
|
+
"description": "Theater fingerprint #6 detection — code-executing model format without publisher signature.",
|
|
463
|
+
"confidence": "deterministic",
|
|
464
|
+
"deterministic": true,
|
|
465
|
+
"atlas_ref": "AML.T0018"
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
"id": "windsurf-vulnerable-version",
|
|
469
|
+
"type": "file_path",
|
|
470
|
+
"value": "ai-coding-assistant-inventory shows Windsurf with version <= patched version for CVE-2026-30615",
|
|
471
|
+
"description": "Direct match for CVE-2026-30615.",
|
|
472
|
+
"confidence": "deterministic",
|
|
473
|
+
"deterministic": true,
|
|
474
|
+
"attack_ref": "T1190"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"id": "kev-listed-match",
|
|
478
|
+
"type": "log_pattern",
|
|
479
|
+
"value": "Any package-matches-catalogued-cve match resolves to a CVE with cisa_kev=true in the catalog",
|
|
480
|
+
"description": "KEV-listed match — fast-path escalation required.",
|
|
481
|
+
"confidence": "deterministic",
|
|
482
|
+
"deterministic": true
|
|
483
|
+
}
|
|
484
|
+
],
|
|
485
|
+
"false_positive_profile": [
|
|
486
|
+
{
|
|
487
|
+
"indicator_id": "package-matches-catalogued-cve",
|
|
488
|
+
"benign_pattern": "Vendor-shipped package whose version-string matches an upstream affected range but contains backported fixes (RHEL/Ubuntu/Debian commonly do this).",
|
|
489
|
+
"distinguishing_test": "Cross-reference the matched package against the vendor's CVE backport tracker (Red Hat CVE database, Ubuntu USN, Debian DSA). If vendor confirms backport in the package version, downgrade match to medium confidence and emit a backport_confirmed=true signal."
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"indicator_id": "lockfile-no-integrity",
|
|
493
|
+
"benign_pattern": "Some Go module entries in go.sum use h1: hashes which are integrity; the playbook is correctly matching these as integrity-present.",
|
|
494
|
+
"distinguishing_test": "For Go entries, presence of h1: hash IS integrity; do not flag. Apply only to lockfiles where the manifest format permits an integrity field but the entry omits it."
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"indicator_id": "ai-code-no-provenance",
|
|
498
|
+
"benign_pattern": "Org has documented internal commit-trailer convention (Co-Authored-By:, Generated-By:, AI-Model:) but it isn't reflected in machine-readable SBOM.",
|
|
499
|
+
"distinguishing_test": "Sample 20 commits in the repo. If commit-trailer convention is consistently used, downgrade to medium and recommend SBOM integration rather than flagging absence outright."
|
|
500
|
+
}
|
|
501
|
+
],
|
|
502
|
+
"minimum_signal": {
|
|
503
|
+
"detected": "Any of: (a) kev-listed-match=true, (b) package-matches-catalogued-cve=true with no benign-pattern match, (c) windsurf-vulnerable-version=true, (d) model-weight-unsigned-and-executable-format=true, (e) any theater fingerprint deterministic firing.",
|
|
504
|
+
"inconclusive": "Inventory captured but SBOM / VEX / model artifacts unavailable. Cannot test theater fingerprints #1, #4, #6.",
|
|
505
|
+
"not_detected": "Zero matched CVEs against current package inventory AND all lockfiles integrity-hashed AND SBOM-to-inventory count match AND every previously-matched CVE has a current VEX statement AND no executable-format unsigned model weights AND no Windsurf vulnerable installs."
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
|
|
509
|
+
"analyze": {
|
|
510
|
+
"rwep_inputs": [
|
|
511
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "active_exploitation", "weight": 25, "notes": "Multiplier from catalog entry's active_exploitation field (confirmed=25, suspected=12, none=0)." },
|
|
512
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "cisa_kev", "weight": 20, "notes": "KEV-listed = full weight." },
|
|
513
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "public_poc", "weight": 15, "notes": "PoC availability per catalog." },
|
|
514
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "ai_weaponization", "weight": 10, "notes": "AI-discovered or AI-assisted-weaponization flagged in catalog." },
|
|
515
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "patch_available", "weight": -10, "notes": "Patch available reduces RWEP by 10." },
|
|
516
|
+
{ "signal_id": "package-matches-catalogued-cve", "rwep_factor": "live_patch_available", "weight": -15, "notes": "Live patch available reduces RWEP by 15." },
|
|
517
|
+
{ "signal_id": "kev-listed-match", "rwep_factor": "cisa_kev", "weight": 20, "notes": "Direct KEV signal." },
|
|
518
|
+
{ "signal_id": "windsurf-vulnerable-version", "rwep_factor": "blast_radius", "weight": 25, "notes": "Zero-interaction RCE in developer endpoint." },
|
|
519
|
+
{ "signal_id": "model-weight-unsigned-and-executable-format", "rwep_factor": "blast_radius", "weight": 20, "notes": "Deserialization vector on load; ATLAS AML.T0018." },
|
|
520
|
+
{ "signal_id": "lockfile-no-integrity", "rwep_factor": "active_exploitation", "weight": 5, "notes": "Re-publication-over attack documented; modest active-exploitation signal." }
|
|
521
|
+
],
|
|
522
|
+
"blast_radius_model": {
|
|
523
|
+
"scope_question": "If a matched-CVE in this host's supply chain is exploited, OR the supply chain is compromised at the publisher level, what scope of compromise does this host realistically deliver?",
|
|
524
|
+
"scoring_rubric": [
|
|
525
|
+
{ "condition": "host runs single-tenant dev workload with isolated dependencies, no production access, no CI signing keys", "blast_radius_score": 1, "description": "Local dev compromise only." },
|
|
526
|
+
{ "condition": "host has prod-adjacent CI runners or test environments with non-prod credentials", "blast_radius_score": 2, "description": "Staging/dev cloud compromise." },
|
|
527
|
+
{ "condition": "host is a production application server or k8s node with shared package surface", "blast_radius_score": 3, "description": "Production tenancy compromise via runtime dependency." },
|
|
528
|
+
{ "condition": "host has package-publishing rights (npm/PyPI maintainer keys, cosign signing keys, GitHub-package writer)", "blast_radius_score": 4, "description": "Publisher-position compromise; downstream propagation." },
|
|
529
|
+
{ "condition": "host is a release-engineering bootstrap with cross-account assume-role + publishing rights to org namespaces + CI signing keys + multi-platform cosign chains", "blast_radius_score": 5, "description": "Org-wide supply-chain pivot; XZ-Utils-class compromise." }
|
|
530
|
+
]
|
|
531
|
+
},
|
|
532
|
+
"compliance_theater_check": {
|
|
533
|
+
"claim": "SBOM generation per release + dependency pinning + vulnerability tracking satisfies NIST SSDF / SA-12 / A.8.30 / NIS2 Art.21(2)(d) / DORA Art.28 / EU CRA Art.13/14.",
|
|
534
|
+
"audit_evidence": "Per-release SBOM artifact, lockfile present, vulnerability scanner reports, vendor-management records.",
|
|
535
|
+
"reality_test": "Run all six theater fingerprints in govern.theater_fingerprints. For each fingerprint: (1) cross-reference the most recent SBOM against data/cve-catalog.json — is there an automated correlation job or only manual lookup?; (2) walk lockfiles for integrity hashes — does every pinned entry have one?; (3) compare SBOM count to transitive count — is the SBOM complete?; (4) for each matched CVE, is there a VEX statement?; (5) does the SBOM capture AI-generated-code provenance?; (6) are model weights signed and in non-executing format? Theater if any fails AND no compensating control with current test exists.",
|
|
536
|
+
"theater_verdict_if_gap": "Org demonstrates SBOM-generation compliance that nonetheless leaves matched CVEs uncorrelated, lockfiles with name-pin-only entries vulnerable to publisher-key compromise, AI-generated code unattested, and model weights as silent deserialization vectors. Either (a) deploy continuous SBOM-to-CVE correlation with alerting (e.g. exceptd's own SBOM-match pipeline), (b) enforce integrity-hashed lockfiles in CI gate, (c) extend SBOM to transitive completeness, (d) maintain VEX register per matched CVE, (e) integrate AI-coding-assistant commit attestation, (f) restrict model loading to safetensors with Sigstore verification, OR (g) generate a defensible policy exception with compensating controls."
|
|
537
|
+
},
|
|
538
|
+
"framework_gap_mapping": [
|
|
539
|
+
{
|
|
540
|
+
"finding_id": "supply-chain-detected",
|
|
541
|
+
"framework": "nist-800-53",
|
|
542
|
+
"claimed_control": "SA-12 — Supply Chain Protection",
|
|
543
|
+
"actual_gap": "Procurement-event lens. Continuous lockfile drift, transitive dependency change, and AI-emitted code are not captured by procurement review.",
|
|
544
|
+
"required_control": "Add SA-12 variant requiring continuous SBOM-to-CVE correlation, integrity-hashed lockfiles, transitive completeness, VEX maintenance, AI-code provenance, signed model weights."
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"finding_id": "supply-chain-detected",
|
|
548
|
+
"framework": "nist-800-218",
|
|
549
|
+
"claimed_control": "SSDF PS.3 / PW.4",
|
|
550
|
+
"actual_gap": "Mandates SBOM generation but not (a)-(f) above.",
|
|
551
|
+
"required_control": "SSDF v1.2+ extension explicitly requiring continuous correlation, transitive completeness, VEX, AI-code provenance, model weight signing."
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
"finding_id": "supply-chain-detected",
|
|
555
|
+
"framework": "iso-27001-2022",
|
|
556
|
+
"claimed_control": "A.8.30 — Outsourced development",
|
|
557
|
+
"actual_gap": "Procurement-event lens; does not cover community-maintained packages or AI-coding-assistant-emitted code.",
|
|
558
|
+
"required_control": "A.8.30 amendment for community-maintained dependency continuous attestation + AI-emitted code provenance."
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
"finding_id": "supply-chain-detected",
|
|
562
|
+
"framework": "soc2",
|
|
563
|
+
"claimed_control": "CC9.2 — Vendor risk management",
|
|
564
|
+
"actual_gap": "Vendor inventory omits open-source dependencies and AI-coding-assistant-emitted code.",
|
|
565
|
+
"required_control": "Trust Services Criteria amendment requiring supply-chain inventory completeness as CC9.2 sub-objective."
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"finding_id": "supply-chain-detected",
|
|
569
|
+
"framework": "pci-dss-4",
|
|
570
|
+
"claimed_control": "6.3.2 / 6.3.3 — Vulnerability tracking and patches",
|
|
571
|
+
"actual_gap": "30-day patch window inadequate for KEV-listed dependency CVEs; no continuous SBOM correlation requirement.",
|
|
572
|
+
"required_control": "v4.1+ amendment with KEV-fast-path for dependency CVEs and mandatory SBOM-correlation cadence."
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"finding_id": "supply-chain-detected",
|
|
576
|
+
"framework": "nis2",
|
|
577
|
+
"claimed_control": "Art.21(2)(d) — Supply chain security",
|
|
578
|
+
"actual_gap": "Names supply chain security; implementing acts have not bound continuous correlation, VEX, AI-code, model weights.",
|
|
579
|
+
"required_control": "Implementing acts to bind (a)-(f) above for essential entities."
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
"finding_id": "supply-chain-detected",
|
|
583
|
+
"framework": "dora",
|
|
584
|
+
"claimed_control": "Art.28 — ICT third-party risk",
|
|
585
|
+
"actual_gap": "Captures contractual ICT third parties; open-source layer + AI-coding-assistant-emitted code is not a contractual party.",
|
|
586
|
+
"required_control": "RTS/ITS extending Art.28 obligations to dependency layer + AI-emitted code for financial entities."
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
"finding_id": "supply-chain-detected",
|
|
590
|
+
"framework": "eu-cra",
|
|
591
|
+
"claimed_control": "Art.13 / Annex I — Essential cybersecurity requirements",
|
|
592
|
+
"actual_gap": "SBOM mandated; format/content/completeness implementing acts in publication.",
|
|
593
|
+
"required_control": "Implementing acts must bind transitive completeness, VEX, AI-code provenance, model-weight signature requirements."
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"finding_id": "supply-chain-detected",
|
|
597
|
+
"framework": "eu-cra",
|
|
598
|
+
"claimed_control": "Art.14 — Actively-exploited-vulnerability 24h notification",
|
|
599
|
+
"actual_gap": "Notification window tight; many orgs lack SBOM-to-active-exploit correlation to detect within window.",
|
|
600
|
+
"required_control": "Operational guidance: continuous correlation job with KEV listing + active-exploitation feeds; automated notification draft on match."
|
|
601
|
+
}
|
|
602
|
+
],
|
|
603
|
+
"escalation_criteria": [
|
|
604
|
+
{ "condition": "kev-listed-match == true", "action": "page_on_call" },
|
|
605
|
+
{ "condition": "rwep >= 80 AND patch_available == false", "action": "page_on_call" },
|
|
606
|
+
{ "condition": "windsurf-vulnerable-version == true", "action": "trigger_playbook", "target_playbook": "mcp" },
|
|
607
|
+
{ "condition": "any matched_cve.attack_class == 'kernel-lpe'", "action": "trigger_playbook", "target_playbook": "kernel" },
|
|
608
|
+
{ "condition": "model-weight-unsigned-and-executable-format == true AND blast_radius_score >= 3", "action": "raise_severity" },
|
|
609
|
+
{ "condition": "blast_radius_score >= 4", "action": "trigger_playbook", "target_playbook": "framework" },
|
|
610
|
+
{ "condition": "compliance_theater_check.verdict == 'theater' AND jurisdiction_obligations contains 'EU'", "action": "notify_legal" },
|
|
611
|
+
{ "condition": "any actively_exploited_match AND jurisdiction_obligations contains 'EU/EU CRA Art.14 24h'", "action": "notify_legal" }
|
|
612
|
+
]
|
|
613
|
+
},
|
|
614
|
+
|
|
615
|
+
"validate": {
|
|
616
|
+
"remediation_paths": [
|
|
617
|
+
{
|
|
618
|
+
"id": "patch-matched-cves",
|
|
619
|
+
"description": "For each matched CVE: apply vendor patch via package manager (apt/yum/dnf/brew/npm/pip/cargo/gem), live-patch if available, or container-image rebuild.",
|
|
620
|
+
"preconditions": ["patch_available == true", "operator_authorized_for_package_upgrade == true"],
|
|
621
|
+
"priority": 1,
|
|
622
|
+
"compensating_controls": ["restart_affected_services_post_upgrade", "regression_test_post_upgrade"],
|
|
623
|
+
"estimated_time_hours": 4
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
"id": "enforce-integrity-pinned-lockfiles",
|
|
627
|
+
"description": "Add CI gate that rejects any lockfile entry without an integrity hash. For npm: re-run with --package-lock-only to populate integrity. For pip: use pip-compile --generate-hashes. For others: regenerate with integrity-aware tooling.",
|
|
628
|
+
"preconditions": ["ci_pipeline_modifiable == true"],
|
|
629
|
+
"priority": 2,
|
|
630
|
+
"compensating_controls": ["lockfile_review_in_pr_template"],
|
|
631
|
+
"estimated_time_hours": 8
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"id": "deploy-continuous-sbom-correlation",
|
|
635
|
+
"description": "Stand up automated SBOM-to-CVE correlation: on every SBOM generation, run against data/cve-catalog.json + upstream NVD/CISA-KEV feeds; alert on match with RWEP score and VEX prompt.",
|
|
636
|
+
"preconditions": ["sbom_generation_in_ci == true OR sbom_artifact_storage_accessible == true"],
|
|
637
|
+
"priority": 3,
|
|
638
|
+
"compensating_controls": ["alert_routing_to_secops"],
|
|
639
|
+
"estimated_time_hours": 16
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"id": "extend-sbom-transitive-completeness",
|
|
643
|
+
"description": "Regenerate SBOMs with transitive depth (CycloneDX 1.6 deep mode, SPDX 3.0 with relationships, or per-tool deep flag). Verify component count matches transitive lockfile resolution.",
|
|
644
|
+
"preconditions": ["sbom_tooling_supports_transitive == true"],
|
|
645
|
+
"priority": 4,
|
|
646
|
+
"compensating_controls": ["sbom_completeness_gate_in_ci"],
|
|
647
|
+
"estimated_time_hours": 8
|
|
648
|
+
},
|
|
649
|
+
{
|
|
650
|
+
"id": "maintain-vex-register",
|
|
651
|
+
"description": "For each matched CVE: produce a VEX statement (not_affected / affected / fixed / under_investigation) with justification. Use CSAF 2.0 VEX profile.",
|
|
652
|
+
"preconditions": ["security_team_capacity_for_vex == true"],
|
|
653
|
+
"priority": 5,
|
|
654
|
+
"compensating_controls": ["vex_template_in_security_playbook"],
|
|
655
|
+
"estimated_time_hours": 12
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"id": "ai-code-provenance",
|
|
659
|
+
"description": "Adopt commit-trailer convention or SBOM AI profile (CycloneDX 1.7 ML-BOM / SPDX 3.1 AI profile) capturing model + context + cutoff for AI-emitted code.",
|
|
660
|
+
"preconditions": ["org_uses_ai_coding_assistants == true", "ci_or_pre-commit_modifiable == true"],
|
|
661
|
+
"priority": 6,
|
|
662
|
+
"compensating_controls": ["pr_review_for_ai_emitted_code", "ai_code_review_checklist"],
|
|
663
|
+
"estimated_time_hours": 16
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"id": "model-weight-signing-and-safetensors",
|
|
667
|
+
"description": "Restrict model-loader to safetensors format only AND require Sigstore (OpenSSF model-signing) verification before load.",
|
|
668
|
+
"preconditions": ["ml_loader_modifiable == true OR ml_inference_pipeline_owned == true"],
|
|
669
|
+
"priority": 7,
|
|
670
|
+
"compensating_controls": ["model_inventory_review", "non-safetensors_models_quarantined"],
|
|
671
|
+
"estimated_time_hours": 24
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
"id": "policy-exception",
|
|
675
|
+
"description": "Where a matched CVE cannot be remediated within compliance window (vendor pending, blocker dependency, architectural impossibility): generate auditor-ready policy exception via policy-exception-gen.",
|
|
676
|
+
"preconditions": ["remediation_paths[1..7] blocked for at least one matched CVE", "ciso_acceptance_obtainable == true"],
|
|
677
|
+
"priority": 8,
|
|
678
|
+
"compensating_controls": ["network_segmentation", "enhanced_logging_for_affected_component", "vendor_engagement_tracking"],
|
|
679
|
+
"estimated_time_hours": 8
|
|
680
|
+
}
|
|
681
|
+
],
|
|
682
|
+
"validation_tests": [
|
|
683
|
+
{
|
|
684
|
+
"id": "matched-cves-resolved",
|
|
685
|
+
"test": "Re-inventory packages and re-run CVE-catalog matching. Confirm zero remaining matches OR each remaining match has a current VEX statement justifying not_affected / fixed / accepted-residual.",
|
|
686
|
+
"expected_result": "Zero unresolved matches OR all matches VEX-covered.",
|
|
687
|
+
"test_type": "functional"
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"id": "lockfile-integrity-gate",
|
|
691
|
+
"test": "Add a deliberately-malformed lockfile entry without integrity hash to a test branch. Confirm CI pipeline rejects the PR.",
|
|
692
|
+
"expected_result": "CI rejects; gate fires.",
|
|
693
|
+
"test_type": "negative"
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
"id": "sbom-cve-correlation-firing",
|
|
697
|
+
"test": "Add a known-vulnerable test dependency to a test branch. Confirm continuous correlation alert fires within target detection window with RWEP score.",
|
|
698
|
+
"expected_result": "Alert fires with correct match details.",
|
|
699
|
+
"test_type": "functional"
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"id": "sbom-transitive-complete",
|
|
703
|
+
"test": "Compare SBOM component count against transitive lockfile resolution count (npm ls --depth=Infinity --json | jq '..|.dependencies?|length' summed; pip freeze --all; cargo tree --depth=Infinity).",
|
|
704
|
+
"expected_result": "SBOM count >= transitive count (within rounding).",
|
|
705
|
+
"test_type": "functional"
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"id": "vex-coverage",
|
|
709
|
+
"test": "List all matched CVEs over last 30 days. Confirm each has a VEX statement in the register.",
|
|
710
|
+
"expected_result": "100% VEX coverage.",
|
|
711
|
+
"test_type": "functional"
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"id": "windsurf-version-post-patch",
|
|
715
|
+
"test": "If windsurf-vulnerable-version fired: re-read Windsurf version, confirm > patched_version_for_CVE-2026-30615.",
|
|
716
|
+
"expected_result": "Windsurf version above CVE-2026-30615 patched.",
|
|
717
|
+
"test_type": "functional"
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"id": "model-loader-safetensors-only",
|
|
721
|
+
"test": "Attempt to load a deliberately-non-safetensors model. Confirm loader refuses.",
|
|
722
|
+
"expected_result": "Loader rejects non-safetensors format.",
|
|
723
|
+
"test_type": "negative"
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
"id": "regression-no-supply-chain-breakage",
|
|
727
|
+
"test": "Run full repo build + test suite post-remediation. Confirm no regressions in legitimate dependency resolution.",
|
|
728
|
+
"expected_result": "Build green; tests pass.",
|
|
729
|
+
"test_type": "regression"
|
|
730
|
+
}
|
|
731
|
+
],
|
|
732
|
+
"residual_risk_statement": {
|
|
733
|
+
"risk": "Supply chain mutates continuously. Every new dependency release, every new AI-coding-assistant emission, every new model publication introduces a fresh attestation requirement. Maintainer-position long-game compromise (XZ-Utils class) bypasses signature-based controls until the maintainer's transparency-log entry is revoked.",
|
|
734
|
+
"why_remains": "Signature verification proves authorship not safety; provenance attestation depends on publisher discipline; VEX maintenance requires sustained security-team capacity; AI-code provenance depends on tooling that's still standardizing (CycloneDX 1.7 / SPDX 3.1 draft). Crypto-agility for signing infrastructure is itself a multi-year program.",
|
|
735
|
+
"acceptance_level": "ciso",
|
|
736
|
+
"compensating_controls_in_place": ["continuous_sbom_to_cve_correlation_with_alerting", "ci_gate_for_lockfile_integrity", "vex_register_with_quarterly_review", "ai_code_review_checklist", "model_loader_safetensors_enforcement", "maintainer_key_transparency_monitoring"]
|
|
737
|
+
},
|
|
738
|
+
"evidence_requirements": [
|
|
739
|
+
{
|
|
740
|
+
"evidence_type": "scan_report",
|
|
741
|
+
"description": "Full package inventory across all package managers + lockfile walk; matched-CVE list with per-match RWEP + VEX status.",
|
|
742
|
+
"retention_period": "7_years",
|
|
743
|
+
"framework_satisfied": ["nist-800-53-SA-12", "nist-800-218-PS-3", "iso-27001-2022-A.8.30", "nis2-art21-2d", "eu-cra-art13"]
|
|
744
|
+
},
|
|
745
|
+
{
|
|
746
|
+
"evidence_type": "config_diff",
|
|
747
|
+
"description": "Before/after lockfile diff showing integrity hashes added; SBOM before/after showing transitive completeness; CI pipeline diff showing integrity-gate addition.",
|
|
748
|
+
"retention_period": "7_years",
|
|
749
|
+
"framework_satisfied": ["nist-800-53-CM-3", "iso-27001-2022-A.8.32"]
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"evidence_type": "patch_record",
|
|
753
|
+
"description": "Package upgrade tickets with timestamps for each matched-CVE remediation; container-image rebuild records.",
|
|
754
|
+
"retention_period": "7_years",
|
|
755
|
+
"framework_satisfied": ["nist-800-53-SI-2", "iso-27001-2022-A.8.8", "pci-dss-4-6.3", "nis2-art21-2c"]
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"evidence_type": "attestation",
|
|
759
|
+
"description": "Signed exceptd attestation file with evidence_hash, matched-CVE count at detection, count post-remediation, RWEP delta, VEX coverage percentage.",
|
|
760
|
+
"retention_period": "7_years",
|
|
761
|
+
"framework_satisfied": ["nist-800-53-CA-7", "iso-27001-2022-A.5.36", "nis2-art21-2d", "dora-art28", "eu-cra-art13"]
|
|
762
|
+
}
|
|
763
|
+
],
|
|
764
|
+
"regression_trigger": [
|
|
765
|
+
{ "condition": "new_cve_in_class == true", "interval": "on_event" },
|
|
766
|
+
{ "condition": "new_kev_listing_for_inventoried_package", "interval": "on_event" },
|
|
767
|
+
{ "condition": "new_dependency_added", "interval": "on_event" },
|
|
768
|
+
{ "condition": "new_release", "interval": "on_event" },
|
|
769
|
+
{ "condition": "monthly", "interval": "30d" }
|
|
770
|
+
]
|
|
771
|
+
},
|
|
772
|
+
|
|
773
|
+
"close": {
|
|
774
|
+
"evidence_package": {
|
|
775
|
+
"bundle_format": "csaf-2.0",
|
|
776
|
+
"contents": ["scan_report", "config_diff", "patch_record", "attestation", "framework_gap_mapping", "compliance_theater_verdict", "residual_risk_statement"],
|
|
777
|
+
"destination": "grc_platform_api",
|
|
778
|
+
"signed": true
|
|
779
|
+
},
|
|
780
|
+
"learning_loop": {
|
|
781
|
+
"enabled": true,
|
|
782
|
+
"lesson_template": {
|
|
783
|
+
"attack_vector": "Supply-chain compromise via (a) matched-CVE in installed package, (b) lockfile name-pin with re-publication-over, (c) transitive dependency missed by direct-only SBOM, (d) AI-coding-assistant emitting code with embedded prompt injection, (e) model weight in code-executing deserialization format triggering on load (CWE-502), (f) developer-tool RCE (Windsurf CVE-2026-30615).",
|
|
784
|
+
"control_gap": "SBOM-as-deliverable controls (SSDF, SA-12, A.8.30, CC9.2) did not generate signal because they don't require continuous CVE correlation, integrity-hashed lockfiles, transitive completeness, VEX maintenance, AI-code provenance, or model-weight signing.",
|
|
785
|
+
"framework_gap": "NIST 800-53 SA-12, NIST 800-218 SSDF, ISO 27001:2022 A.8.30, SOC 2 CC9.2, PCI DSS 4.0 6.3, NIS2 Art.21(2)(d), DORA Art.28, EU CRA Art.13/14 all permit SBOM-as-deliverable compliance over a fully exposed supply chain. Implementation lag = ~90 days behind operational tooling (SLSA / Sigstore / VEX) and ~210 days behind AI-coding-assistant adoption.",
|
|
786
|
+
"new_control_requirement": "Add supply-chain control class with: (a) continuous SBOM-to-CVE correlation with KEV / active-exploitation feeds and RWEP scoring, (b) CI gate enforcing integrity-hashed lockfiles, (c) transitive completeness check vs lockfile resolution, (d) VEX maintenance per matched CVE (CSAF 2.0 profile), (e) AI-code provenance via commit-trailer convention OR CycloneDX 1.7 ML-BOM / SPDX 3.1 AI profile, (f) model-loader restricted to safetensors with Sigstore/OpenSSF model-signing verification."
|
|
787
|
+
},
|
|
788
|
+
"feeds_back_to_skills": ["supply-chain-integrity", "exploit-scoring", "framework-gap-analysis", "compliance-theater", "zeroday-gap-learn"]
|
|
789
|
+
},
|
|
790
|
+
"notification_actions": [
|
|
791
|
+
{
|
|
792
|
+
"obligation_ref": "EU/NIS2 Art.21(2)(d) 720h",
|
|
793
|
+
"deadline": "computed_at_runtime",
|
|
794
|
+
"recipient": "internal_legal",
|
|
795
|
+
"evidence_attached": ["sbom_inventory", "cve_match_register", "vex_statements", "remediation_plan"],
|
|
796
|
+
"draft_notification": "NIS2 Art.21(2)(d) supply chain security evidence: ${entity_name} attests supply chain security per Art.21(2)(d). SBOM inventory: ${sbom_summary}. Matched CVEs: ${match_count}; KEV-listed: ${kev_count}; remediated: ${remediated_count}; VEX-covered: ${vex_count}. Remediation plan attached."
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
"obligation_ref": "EU/NIS2 Art.23 24h",
|
|
800
|
+
"deadline": "computed_at_runtime",
|
|
801
|
+
"recipient": "internal_legal",
|
|
802
|
+
"evidence_attached": ["affected_systems_inventory", "matched_cves_with_active_exploitation", "interim_mitigation_record"],
|
|
803
|
+
"draft_notification": "NIS2 Art.23 24-hour early-warning: Supply-chain incident — matched CVE(s) ${matched_cve_ids} with active-exploitation on ${affected_host_count} host(s). KEV-listed: ${kev_count}. Interim mitigation: ${interim_mitigation}. Full assessment to follow within 72 hours per Art.23(4)."
|
|
804
|
+
},
|
|
805
|
+
{
|
|
806
|
+
"obligation_ref": "EU/NIS2 Art.23 72h",
|
|
807
|
+
"deadline": "computed_at_runtime",
|
|
808
|
+
"recipient": "regulator_email",
|
|
809
|
+
"evidence_attached": ["full_incident_assessment", "remediation_plan", "vex_status_per_matched_cve"],
|
|
810
|
+
"draft_notification": "NIS2 Art.23 incident notification (72h): full assessment of supply-chain incident. Affected systems: ${affected_systems}. Remediation plan: ${remediation_summary}. VEX status: ${vex_summary}."
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"obligation_ref": "EU/DORA Art.28 720h",
|
|
814
|
+
"deadline": "computed_at_runtime",
|
|
815
|
+
"recipient": "internal_legal",
|
|
816
|
+
"evidence_attached": ["ict_third_party_register", "concentration_risk_assessment", "subcontracting_inventory"],
|
|
817
|
+
"draft_notification": "DORA Art.28 third-party ICT risk submission: ${entity_name} (financial entity) attests third-party ICT risk management per Art.28. Register: ${register_summary}. Concentration risk: ${concentration_summary}."
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
"obligation_ref": "EU/DORA Art.19 4h",
|
|
821
|
+
"deadline": "computed_at_runtime",
|
|
822
|
+
"recipient": "internal_legal",
|
|
823
|
+
"evidence_attached": ["initial_notification", "ict_third_party_dependencies"],
|
|
824
|
+
"draft_notification": "DORA Art.19 initial notification: major ICT-related incident — supply-chain matched-CVE exposure on financial-entity systems. ICT third-party dependencies affected: ${ict_dependencies}. Full classification to follow."
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
"obligation_ref": "EU/EU CRA Art.13 / Annex I 8760h",
|
|
828
|
+
"deadline": "computed_at_runtime",
|
|
829
|
+
"recipient": "internal_legal",
|
|
830
|
+
"evidence_attached": ["sbom_per_product", "vulnerability_handling_evidence", "security_update_record"],
|
|
831
|
+
"draft_notification": "EU CRA Art.13 / Annex I technical documentation submission: ${entity_name} attests product cybersecurity requirements. SBOM per product attached. Vulnerability handling: ${vh_summary}. Security update record: ${update_record}."
|
|
832
|
+
},
|
|
833
|
+
{
|
|
834
|
+
"obligation_ref": "EU/EU CRA Art.14 24h",
|
|
835
|
+
"deadline": "computed_at_runtime",
|
|
836
|
+
"recipient": "regulator_email",
|
|
837
|
+
"evidence_attached": ["affected_product_identification", "exploitation_evidence", "mitigation_status"],
|
|
838
|
+
"draft_notification": "EU CRA Art.14 actively-exploited vulnerability notification: Product ${product_id} contains actively-exploited vulnerability ${matched_cve_id}. Affected versions: ${affected_versions}. Exploitation evidence: ${exploitation_evidence}. Mitigation: ${mitigation_status}. Updates: ${update_url}."
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
"obligation_ref": "AU/APRA CPS 234 72h",
|
|
842
|
+
"deadline": "computed_at_runtime",
|
|
843
|
+
"recipient": "regulator_email",
|
|
844
|
+
"evidence_attached": ["materiality_assessment", "remediation_completed_evidence"],
|
|
845
|
+
"draft_notification": "APRA CPS 234 notification: material information security incident — supply-chain matched-CVE exposure. Materiality: ${materiality_justification}. Remediation summary: ${remediation_summary}."
|
|
846
|
+
}
|
|
847
|
+
],
|
|
848
|
+
"exception_generation": {
|
|
849
|
+
"trigger_condition": "remediation_blocked == true OR (matched_cve_unpatched == true AND vendor_patch_pending == true)",
|
|
850
|
+
"exception_template": {
|
|
851
|
+
"scope": "Matched CVE(s) ${matched_cve_ids} affect package(s) ${affected_packages} which cannot be remediated within the compliance window. Blocking factors: ${blocking_factors} (vendor patch pending, blocker dependency, architectural impossibility, EOL package without backport).",
|
|
852
|
+
"duration": "until_vendor_patch",
|
|
853
|
+
"compensating_controls": ["network_segmentation_isolating_affected_component", "enhanced_logging_for_exploit_indicators", "ci_gate_blocking_new_uses_of_affected_package", "vendor_engagement_tracking_with_weekly_re-poll", "monthly_residual_risk_review"],
|
|
854
|
+
"risk_acceptance_owner": "ciso",
|
|
855
|
+
"auditor_ready_language": "Pursuant to ${framework_id} ${control_id} (Supply Chain Protection / Outsourced Development / Vendor and Business Partner Risk Management / Vulnerability Handling), the organization documents a time-bound risk acceptance for matched CVE(s) ${matched_cve_ids} in package(s) ${affected_packages} on ${affected_host_count} host(s). Vendor patch availability: ${patch_available_status}. Live-patch availability: ${livepatch_status}. KEV listing: ${kev_status}. Active exploitation: ${active_exploitation_status}. Public PoC: ${poc_status}. AI-discovery: ${ai_discovered_status}. RWEP at exception submission: ${rwep_score}. The organization accepts that current framework controls (NIST 800-53 SA-12 / NIST 800-218 SSDF / ISO 27001:2022 A.8.30 / SOC 2 CC9.2 / PCI DSS 4.0 6.3 / NIS2 Art.21(2)(d) / DORA Art.28 / EU CRA Art.13/14) permit SBOM-as-deliverable compliance over the exposed package surface, that this structural gap is documented in ${exceptd_framework_gap_mapping_ref}, and that the organization's compensating controls during the exception window are: ${compensating_controls}. VEX statement: ${vex_statement} (under_investigation / not_affected / affected). Detection coverage during exception: continuous SBOM-to-CVE correlation, enhanced logging for exploit indicators, KEV-feed integration alerting on new KEV listing for the affected component. Risk accepted by ${ciso_name} on ${acceptance_date}. Time-bound until ${duration_expiry} (vendor patch publication, replacement dependency selection, OR ${default_30d_expiry}, whichever is first). Re-evaluation triggers: vendor patch publication, new KEV listing for affected package, active-exploitation indicator fires, new PoC published, OR scheduled expiry."
|
|
856
|
+
}
|
|
857
|
+
},
|
|
858
|
+
"regression_schedule": {
|
|
859
|
+
"next_run": "computed_at_runtime",
|
|
860
|
+
"trigger": "both",
|
|
861
|
+
"notify_on_skip": true
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
},
|
|
865
|
+
|
|
866
|
+
"directives": [
|
|
867
|
+
{
|
|
868
|
+
"id": "all-installed-packages-and-lockfiles",
|
|
869
|
+
"title": "Full supply-chain inventory and matched-CVE triage",
|
|
870
|
+
"applies_to": { "always": true }
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
"id": "kernel-lpe-copy-fail",
|
|
874
|
+
"title": "Targeted match for CVE-2026-31431 'Copy Fail' (KEV, AI-discovered, deterministic kernel LPE)",
|
|
875
|
+
"applies_to": { "cve": "CVE-2026-31431" },
|
|
876
|
+
"phase_overrides": {
|
|
877
|
+
"direct": {
|
|
878
|
+
"rwep_threshold": { "escalate": 70, "monitor": 40, "close": 25 }
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"id": "ml-supply-chain-aml-t0010",
|
|
884
|
+
"title": "ATLAS AML.T0010 — ML Supply Chain Compromise",
|
|
885
|
+
"applies_to": { "atlas_ttp": "AML.T0010" }
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"id": "compromised-model-weight-aml-t0018",
|
|
889
|
+
"title": "ATLAS AML.T0018 — Compromised model weight",
|
|
890
|
+
"applies_to": { "atlas_ttp": "AML.T0018" }
|
|
891
|
+
}
|
|
892
|
+
]
|
|
893
|
+
}
|