@blamejs/exceptd-skills 0.12.26 → 0.12.28

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.
@@ -152,8 +152,10 @@
152
152
  "lag_notes": "RFC 7519 is the spec; RFC 8725 (Best Current Practices) is what implementations should follow. Many MCP servers still hand-roll JWT validation and miss BCP 225 guidance.",
153
153
  "skills_referencing": [
154
154
  "api-security",
155
+ "cloud-iam-incident",
155
156
  "cloud-security",
156
157
  "identity-assurance",
158
+ "idp-incident-response",
157
159
  "mcp-agent-trust",
158
160
  "sector-financial",
159
161
  "sector-healthcare",
@@ -301,8 +303,10 @@
301
303
  "relevance": "BCP 225. Required reading for any MCP / agent / AI-API auth implementation. Covers algorithm-confusion attacks, kid traversal, audience pinning. mcp-agent-trust uses this as the JWT-handling baseline.",
302
304
  "skills_referencing": [
303
305
  "api-security",
306
+ "cloud-iam-incident",
304
307
  "cloud-security",
305
308
  "identity-assurance",
309
+ "idp-incident-response",
306
310
  "mcp-agent-trust",
307
311
  "sector-financial",
308
312
  "webapp-security"
@@ -421,6 +425,7 @@
421
425
  "skills_referencing": [
422
426
  "ai-c2-detection",
423
427
  "api-security",
428
+ "idp-incident-response",
424
429
  "mcp-agent-trust",
425
430
  "sector-financial",
426
431
  "sector-healthcare"
@@ -557,5 +562,44 @@
557
562
  "coordinated-vuln-disclosure"
558
563
  ],
559
564
  "last_verified": "2026-05-13"
565
+ },
566
+ "RFC-7591": {
567
+ "number": 7591,
568
+ "title": "OAuth 2.0 Dynamic Client Registration Protocol",
569
+ "status": "Proposed Standard",
570
+ "published": "2015-07",
571
+ "tracker": "https://www.rfc-editor.org/info/rfc7591",
572
+ "relevance": "Dynamic Client Registration is the legitimate OAuth flow for self-service app onboarding into an IdP. Operator-facing: when DCR is enabled without strong attestation, a compromised tenant or compromised admin can register a malicious app whose redirect_uri exfiltrates auth codes — the 2023-2024 Microsoft Storm-0558 / Midnight Blizzard incidents exercised this surface via consent abuse on tenant-published apps. Pair with RFC 7592 (DCR Management Protocol) for full lifecycle controls.",
573
+ "skills_referencing": [
574
+ "idp-incident-response",
575
+ "identity-assurance"
576
+ ],
577
+ "last_verified": "2026-05-15"
578
+ },
579
+ "RFC-8693": {
580
+ "number": 8693,
581
+ "title": "OAuth 2.0 Token Exchange",
582
+ "status": "Proposed Standard",
583
+ "published": "2020-01",
584
+ "tracker": "https://www.rfc-editor.org/info/rfc8693",
585
+ "relevance": "Token exchange is the canonical mechanism for cloud IAM impersonation and service-account delegation chains (AWS STS AssumeRoleWithWebIdentity, GCP Workload Identity Federation, Azure Workload Identity). Operator-facing: token-exchange chains are the modern equivalent of pass-the-token — a compromised upstream token mints downstream tokens with widened audience claims. Audit chain depth + audience expansion + lifetime ladder.",
586
+ "skills_referencing": [
587
+ "cloud-iam-incident",
588
+ "identity-assurance"
589
+ ],
590
+ "last_verified": "2026-05-15"
591
+ },
592
+ "RFC-9068": {
593
+ "number": 9068,
594
+ "title": "JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens",
595
+ "status": "Proposed Standard",
596
+ "published": "2021-10",
597
+ "tracker": "https://www.rfc-editor.org/info/rfc9068",
598
+ "relevance": "Standardises the JWT claim set for OAuth access tokens (typ, scope, client_id, etc.) that cloud IAM and SaaS APIs accept as bearer credentials. Operator-facing: when tokens omit the audience claim or accept loose typ values, replay across services becomes trivial — most cloud-IAM token-forgery incidents (Azure storm-0558 key-leak class) reduce to insufficient claim validation. Pair with RFC 8725 (JWT BCP) for hardening.",
599
+ "skills_referencing": [
600
+ "cloud-iam-incident",
601
+ "identity-assurance"
602
+ ],
603
+ "last_verified": "2026-05-15"
560
604
  }
561
605
  }
@@ -79,21 +79,25 @@ const VERB_FLAG_ALLOWLIST = Object.freeze({
79
79
  'mode', 'air-gap', 'force-stale', 'operator', 'ack', 'csaf-status',
80
80
  'publisher-namespace', 'vex', 'all', 'scope', 'required', 'format',
81
81
  'strict-preconditions', 'block-on-jurisdiction-clock', 'tlp',
82
+ 'bundle-deterministic', 'bundle-epoch',
82
83
  ],
83
84
  'run-all': [
84
85
  'evidence', 'evidence-dir', 'session-id', 'force-overwrite', 'attestation-root',
85
86
  'mode', 'air-gap', 'force-stale', 'operator', 'ack', 'csaf-status',
86
87
  'publisher-namespace', 'vex', 'scope', 'strict-preconditions', 'tlp',
88
+ 'bundle-deterministic', 'bundle-epoch',
87
89
  ],
88
90
  'ai-run': [
89
91
  'evidence', 'no-stream', 'session-id', 'force-overwrite', 'attestation-root',
90
92
  'operator', 'ack', 'csaf-status', 'publisher-namespace', 'air-gap',
91
93
  'mode', 'force-stale', 'tlp',
94
+ 'bundle-deterministic', 'bundle-epoch',
92
95
  ],
93
96
  ingest: [
94
97
  'evidence', 'session-id', 'force-overwrite', 'attestation-root', 'operator',
95
98
  'ack', 'csaf-status', 'publisher-namespace', 'air-gap', 'force-stale',
96
99
  'strict-preconditions',
100
+ 'bundle-deterministic', 'bundle-epoch',
97
101
  ],
98
102
  brief: ['all', 'scope', 'directives', 'flat', 'phase'],
99
103
  discover: ['scan-only', 'scope'],
@@ -1515,6 +1515,13 @@ function close(playbookId, directiveId, analyzeResult, validateResult, agentSign
1515
1515
  // bypass run() (e.g. unit tests).
1516
1516
  const sessionId = runOpts.session_id || crypto.randomBytes(8).toString('hex');
1517
1517
 
1518
+ // v0.12.27: when opt-in deterministic bundle mode is set, resolve the
1519
+ // single frozen epoch used by every timestamp surface below. Cached for
1520
+ // the whole close() call so notification_actions, regression_schedule,
1521
+ // and the bundle emitter all agree on the same Date.
1522
+ const deterministic = runOpts.bundleDeterministic === true;
1523
+ const frozenEpoch = deterministic ? resolveFrozenEpoch(runOpts, playbook) : null;
1524
+
1518
1525
  // notification_actions — compute ISO deadlines from clock_starts events.
1519
1526
  // v0.11.12 (#123): enrich each entry with the matched obligation's
1520
1527
  // jurisdiction/regulation/window_hours/evidence_required fields. The
@@ -1605,7 +1612,10 @@ function close(playbookId, directiveId, analyzeResult, validateResult, agentSign
1605
1612
  framework_id: playbook.domain.frameworks_in_scope[0] || 'unspecified',
1606
1613
  control_id: analyzeResult.framework_gap_mapping?.[0]?.claimed_control || 'unspecified',
1607
1614
  ciso_name: agentSignals.ciso_name || '<CISO NAME>',
1608
- acceptance_date: new Date().toISOString().slice(0, 10),
1615
+ // v0.12.27: deterministic mode roots acceptance_date in the
1616
+ // frozen epoch so two runs against the same evidence emit the
1617
+ // same auditor-facing date.
1618
+ acceptance_date: (deterministic ? frozenEpoch : new Date().toISOString()).slice(0, 10),
1609
1619
  duration_expiry: agentSignals.duration_expiry || 'until vendor patch'
1610
1620
  })
1611
1621
  };
@@ -1628,7 +1638,11 @@ function close(playbookId, directiveId, analyzeResult, validateResult, agentSign
1628
1638
  // spurious millisecond drift on tracking.initial_release_date /
1629
1639
  // timestamp / current_release_date.
1630
1640
  const evidencePackage = c.evidence_package ? (() => {
1631
- const issuedAt = new Date().toISOString();
1641
+ // v0.12.27: deterministic mode pins issuedAt to the frozen epoch so
1642
+ // CSAF tracking.{initial_release_date,current_release_date,
1643
+ // generator.date,revision_history[0].date} and OpenVEX timestamp +
1644
+ // statements[].timestamp all collapse to a single, byte-stable value.
1645
+ const issuedAt = deterministic ? frozenEpoch : new Date().toISOString();
1632
1646
  const builtFormats = new Map();
1633
1647
  const buildOnce = (format) => {
1634
1648
  if (!builtFormats.has(format)) {
@@ -1680,11 +1694,27 @@ function close(playbookId, directiveId, analyzeResult, validateResult, agentSign
1680
1694
  } : { enabled: false };
1681
1695
 
1682
1696
  // regression_schedule
1683
- const regressionSchedule = c.regression_schedule ? {
1684
- next_run: validateResult.regression_next_run,
1685
- trigger: c.regression_schedule.trigger,
1686
- notify_on_skip: c.regression_schedule.notify_on_skip !== false
1687
- } : null;
1697
+ //
1698
+ // v0.12.27: deterministic mode re-derives next_run from the frozen epoch
1699
+ // rather than wall-clock-now-at-validate-time. Without this, two runs
1700
+ // against the same evidence diverge on next_run by the interval between
1701
+ // the two `validate()` invocations. Frozen base + the same interval set
1702
+ // = byte-identical schedule.
1703
+ const regressionSchedule = c.regression_schedule ? (() => {
1704
+ let nextRun = validateResult.regression_next_run;
1705
+ if (deterministic) {
1706
+ // Re-derive against the validate phase's trigger set (not the
1707
+ // close phase's regression_schedule subtree — close has no triggers
1708
+ // of its own, just the canonical interval declared upstream).
1709
+ const v = resolvedPhase(playbook, directiveId, 'validate');
1710
+ nextRun = frozenRegressionNextRun(v.regression_trigger || [], new Date(frozenEpoch));
1711
+ }
1712
+ return {
1713
+ next_run: nextRun,
1714
+ trigger: c.regression_schedule.trigger,
1715
+ notify_on_skip: c.regression_schedule.notify_on_skip !== false
1716
+ };
1717
+ })() : null;
1688
1718
 
1689
1719
  // feeds_into chaining — full analyze result is exposed so conditions can
1690
1720
  // reference `analyze.compliance_theater_check.verdict` etc.
@@ -1996,6 +2026,40 @@ function getEngineVersion() {
1996
2026
  return _CACHED_PKG_VERSION;
1997
2027
  }
1998
2028
 
2029
+ // v0.12.27: deterministic-bundle epoch resolution. Priority:
2030
+ // 1. runOpts.bundleEpoch (operator-supplied --bundle-epoch <ISO>)
2031
+ // 2. playbook._meta.last_threat_review (the freshness anchor that already
2032
+ // gates every shipped playbook — stable across re-runs of the same
2033
+ // catalog version)
2034
+ // 3. '1970-01-01T00:00:00Z' fallback (effectively impossible in practice
2035
+ // because every shipped playbook carries last_threat_review, but
2036
+ // guarantees the deterministic path never crashes on a malformed
2037
+ // playbook).
2038
+ // Returns a full ISO-8601 timestamp (date-only inputs are normalised).
2039
+ function resolveFrozenEpoch(runOpts, playbook) {
2040
+ const raw = runOpts && runOpts.bundleEpoch
2041
+ ? runOpts.bundleEpoch
2042
+ : (playbook && playbook._meta && playbook._meta.last_threat_review)
2043
+ || '1970-01-01T00:00:00Z';
2044
+ try { return new Date(raw).toISOString(); }
2045
+ catch { return '1970-01-01T00:00:00Z'; }
2046
+ }
2047
+
2048
+ // Recompute regression_schedule.next_run against a frozen `now` so two
2049
+ // deterministic-mode runs of the same playbook produce byte-identical
2050
+ // schedules. Mirrors computeRegressionNextRun but with an injected base
2051
+ // date. Returns the soonest ISO timestamp or null when no interval-based
2052
+ // trigger fired.
2053
+ function frozenRegressionNextRun(triggers, frozenNow) {
2054
+ let soonest = null;
2055
+ for (const t of (triggers || [])) {
2056
+ const parsed = parseInterval(t.interval, frozenNow);
2057
+ if (!parsed || !parsed.date) continue;
2058
+ if (!soonest || parsed.date < soonest) soonest = parsed.date;
2059
+ }
2060
+ return soonest ? soonest.toISOString() : null;
2061
+ }
2062
+
1999
2063
  // Operator-supplied identity strings (--operator) and publisher namespace
2000
2064
  // URLs (--publisher-namespace) flow into operator-facing CSAF surfaces.
2001
2065
  // Strip ASCII control characters as defence in depth — bin/exceptd.js
@@ -2410,7 +2474,19 @@ function buildEvidenceBundle(format, playbook, analyze, validate, agentSignals,
2410
2474
  if (branches.length > 0) tree.branches = branches;
2411
2475
  return tree;
2412
2476
  })(),
2413
- vulnerabilities: [...cveVulns, ...indicatorVulns],
2477
+ vulnerabilities: (function () {
2478
+ // v0.12.27: deterministic mode sorts vulnerabilities[] by their
2479
+ // primary identifier (cve_id for CVE entries, ids[0].text otherwise)
2480
+ // ascending. Default mode preserves insertion order so existing
2481
+ // operators see byte-identical output to pre-v0.12.27.
2482
+ const all = [...cveVulns, ...indicatorVulns];
2483
+ if (runOpts && runOpts.bundleDeterministic === true) {
2484
+ const keyOf = (v) => (typeof v.cve === 'string' && v.cve)
2485
+ || (Array.isArray(v.ids) && v.ids[0] && typeof v.ids[0].text === 'string' ? v.ids[0].text : '');
2486
+ return all.slice().sort((a, b) => keyOf(a).localeCompare(keyOf(b)));
2487
+ }
2488
+ return all;
2489
+ })(),
2414
2490
  exceptd_extension: {
2415
2491
  classification: analyze._detect_classification,
2416
2492
  rwep: analyze.rwep,
@@ -2642,7 +2718,17 @@ function buildEvidenceBundle(format, playbook, analyze, validate, agentSignals,
2642
2718
  author: 'exceptd',
2643
2719
  timestamp: issued,
2644
2720
  version: 1,
2645
- statements: [...cveStatements, ...indicatorStatements],
2721
+ statements: (function () {
2722
+ // v0.12.27: deterministic mode sorts statements[] by
2723
+ // vulnerability['@id'] ascending. Insertion order otherwise.
2724
+ const all = [...cveStatements, ...indicatorStatements];
2725
+ if (runOpts && runOpts.bundleDeterministic === true) {
2726
+ const keyOf = (s) => (s && s.vulnerability && typeof s.vulnerability['@id'] === 'string')
2727
+ ? s.vulnerability['@id'] : '';
2728
+ return all.slice().sort((a, b) => keyOf(a).localeCompare(keyOf(b)));
2729
+ }
2730
+ return all;
2731
+ })(),
2646
2732
  };
2647
2733
  }
2648
2734
 
@@ -2948,7 +3034,28 @@ function run(playbookId, directiveId, agentSubmission = {}, runOpts = {}) {
2948
3034
  // Without the single-source-of-truth, close() would mint its own id
2949
3035
  // and operators correlating attestation files to embedded bundle URNs
2950
3036
  // would see mismatches.
2951
- const sessionId = runOpts.session_id || crypto.randomBytes(8).toString('hex');
3037
+ //
3038
+ // v0.12.27: when runOpts.bundleDeterministic is set AND the operator did
3039
+ // not pass --session-id, derive the session_id from the submission shape
3040
+ // so two runs against identical evidence produce the same id (and
3041
+ // therefore the same CSAF tracking.id / OpenVEX @id / attestation file
3042
+ // name). Mirrors the evidence_hash path further down but is computed
3043
+ // here so close() can thread it through. Operator-supplied --session-id
3044
+ // still wins on collision.
3045
+ let sessionId;
3046
+ if (runOpts.session_id) {
3047
+ sessionId = runOpts.session_id;
3048
+ } else if (runOpts.bundleDeterministic) {
3049
+ const submissionDigest = crypto.createHash('sha256')
3050
+ .update(canonicalStringify(extractSubmissionForHash(agentSubmission)))
3051
+ .digest('hex');
3052
+ sessionId = crypto.createHash('sha256')
3053
+ .update(`${playbookId}\0${submissionDigest}\0${getEngineVersion()}`)
3054
+ .digest('hex')
3055
+ .slice(0, 16);
3056
+ } else {
3057
+ sessionId = crypto.randomBytes(8).toString('hex');
3058
+ }
2952
3059
  const cachedRunOpts = { ...runOpts, _playbookCache: playbook, session_id: sessionId };
2953
3060
  // Run-time error accumulator for evalCondition regex failures and other
2954
3061
  // non-fatal anomalies surfaced into analyze.runtime_errors[].
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "_comment": "Auto-generated by scripts/refresh-manifest-snapshot.js — do not hand-edit. Public skill surface used by check-manifest-snapshot.js to detect breaking removals.",
3
- "_generated_at": "2026-05-15T22:10:24.906Z",
3
+ "_generated_at": "2026-05-15T23:28:24.427Z",
4
4
  "atlas_version": "5.1.0",
5
- "skill_count": 39,
5
+ "skill_count": 42,
6
6
  "skills": [
7
7
  {
8
8
  "name": "age-gates-child-safety",
@@ -339,6 +339,82 @@
339
339
  ],
340
340
  "dlp_refs": []
341
341
  },
342
+ {
343
+ "name": "cloud-iam-incident",
344
+ "version": "1.0.0",
345
+ "triggers": [
346
+ "access key public repo",
347
+ "aws account takeover",
348
+ "aws sso compromise",
349
+ "azure managed identity replay",
350
+ "cloud iam compromise",
351
+ "cloudtrail anomaly",
352
+ "cross account assume role",
353
+ "crypto mining cloud",
354
+ "federated trust abuse",
355
+ "gcp service account compromise",
356
+ "iam access key leak",
357
+ "iam identity center",
358
+ "imds metadata abuse",
359
+ "imdsv1 ssrf",
360
+ "oidc trust policy",
361
+ "scattered spider aws",
362
+ "snowflake aa24",
363
+ "workload identity federation"
364
+ ],
365
+ "data_deps": [
366
+ "atlas-ttps.json",
367
+ "attack-techniques.json",
368
+ "cve-catalog.json",
369
+ "cwe-catalog.json",
370
+ "d3fend-catalog.json",
371
+ "framework-control-gaps.json",
372
+ "global-frameworks.json"
373
+ ],
374
+ "atlas_refs": [
375
+ "AML.T0051"
376
+ ],
377
+ "attack_refs": [
378
+ "T1078",
379
+ "T1078.004",
380
+ "T1098.001",
381
+ "T1538",
382
+ "T1552.005",
383
+ "T1580"
384
+ ],
385
+ "framework_gaps": [
386
+ "AU-ISM-1546-Cloud-Service-Account",
387
+ "AWS-Security-Hub-Coverage-Gap",
388
+ "CISA-Snowflake-AA24-IdP-Cloud",
389
+ "FedRAMP-IL5-IAM-Federated",
390
+ "ISO-27017-Cloud-IAM",
391
+ "NIST-800-53-AC-2-Cross-Account",
392
+ "SOC2-CC6-Access-Key-Leak-Public-Repo",
393
+ "UK-CAF-B2-Cloud-IAM"
394
+ ],
395
+ "rfc_refs": [
396
+ "RFC-7519",
397
+ "RFC-8693",
398
+ "RFC-8725",
399
+ "RFC-9068"
400
+ ],
401
+ "cwe_refs": [
402
+ "CWE-269",
403
+ "CWE-287",
404
+ "CWE-522",
405
+ "CWE-732",
406
+ "CWE-798",
407
+ "CWE-863"
408
+ ],
409
+ "d3fend_refs": [
410
+ "D3-CAA",
411
+ "D3-CBAN",
412
+ "D3-IOPR",
413
+ "D3-MFA",
414
+ "D3-NTA"
415
+ ],
416
+ "dlp_refs": []
417
+ },
342
418
  {
343
419
  "name": "cloud-security",
344
420
  "version": "1.0.0",
@@ -894,6 +970,83 @@
894
970
  "d3fend_refs": [],
895
971
  "dlp_refs": []
896
972
  },
973
+ {
974
+ "name": "idp-incident-response",
975
+ "version": "1.0.0",
976
+ "triggers": [
977
+ "apt29 entra",
978
+ "auth0 breach",
979
+ "cozy bear",
980
+ "cross-tenant abuse",
981
+ "entra app consent",
982
+ "entra id compromise",
983
+ "federated trust abuse",
984
+ "help-desk social engineering",
985
+ "identity provider incident",
986
+ "idp incident",
987
+ "management api token leak",
988
+ "mfa factor swap",
989
+ "midnight blizzard",
990
+ "oauth consent abuse",
991
+ "octo tempest",
992
+ "okta breach",
993
+ "okta compromise",
994
+ "onelogin breach",
995
+ "ping identity breach",
996
+ "saml token forgery",
997
+ "scattered spider",
998
+ "service account compromise",
999
+ "storm-0875",
1000
+ "tenant compromise"
1001
+ ],
1002
+ "data_deps": [
1003
+ "attack-techniques.json",
1004
+ "cve-catalog.json",
1005
+ "cwe-catalog.json",
1006
+ "d3fend-catalog.json",
1007
+ "framework-control-gaps.json",
1008
+ "global-frameworks.json"
1009
+ ],
1010
+ "atlas_refs": [],
1011
+ "attack_refs": [
1012
+ "T1078.004",
1013
+ "T1098.001",
1014
+ "T1199",
1015
+ "T1556.007",
1016
+ "T1606.002"
1017
+ ],
1018
+ "framework_gaps": [
1019
+ "AU-ISM-1559-IdP",
1020
+ "DORA-Art-19-IdP-4h",
1021
+ "ISO-27001-2022-A.5.16-Federated",
1022
+ "NIS2-Art-21-Federated-Identity",
1023
+ "NIST-800-53-IA-5-Federated",
1024
+ "OFAC-Sanctions-Threat-Actor-Negotiation",
1025
+ "SOC2-CC6-OAuth-Consent",
1026
+ "UK-CAF-B2-IdP-Tenant"
1027
+ ],
1028
+ "rfc_refs": [
1029
+ "RFC-7519",
1030
+ "RFC-7591",
1031
+ "RFC-8725",
1032
+ "RFC-9421"
1033
+ ],
1034
+ "cwe_refs": [
1035
+ "CWE-269",
1036
+ "CWE-284",
1037
+ "CWE-287",
1038
+ "CWE-345",
1039
+ "CWE-522",
1040
+ "CWE-863"
1041
+ ],
1042
+ "d3fend_refs": [
1043
+ "D3-CBAN",
1044
+ "D3-IOPR",
1045
+ "D3-MFA",
1046
+ "D3-NTA"
1047
+ ],
1048
+ "dlp_refs": []
1049
+ },
897
1050
  {
898
1051
  "name": "incident-response-playbook",
899
1052
  "version": "1.0.0",
@@ -1289,6 +1442,70 @@
1289
1442
  ],
1290
1443
  "dlp_refs": []
1291
1444
  },
1445
+ {
1446
+ "name": "ransomware-response",
1447
+ "version": "1.0.0",
1448
+ "triggers": [
1449
+ "akira ransomware",
1450
+ "alphv",
1451
+ "blackcat",
1452
+ "blacksuit",
1453
+ "cuba ransomware",
1454
+ "cyber insurance ransomware",
1455
+ "data theft before encryption",
1456
+ "decryptor availability",
1457
+ "double extortion",
1458
+ "encryption event",
1459
+ "exfil before encrypt",
1460
+ "hunters international",
1461
+ "immutable backup",
1462
+ "lockbit",
1463
+ "no more ransom",
1464
+ "ofac sanctions ransomware",
1465
+ "ransom payment",
1466
+ "ransomhub",
1467
+ "ransomware",
1468
+ "ransomware incident",
1469
+ "royal ransomware",
1470
+ "shadow copy deletion"
1471
+ ],
1472
+ "data_deps": [
1473
+ "atlas-ttps.json",
1474
+ "cve-catalog.json",
1475
+ "cwe-catalog.json",
1476
+ "d3fend-catalog.json",
1477
+ "framework-control-gaps.json",
1478
+ "global-frameworks.json",
1479
+ "zeroday-lessons.json"
1480
+ ],
1481
+ "atlas_refs": [],
1482
+ "attack_refs": [
1483
+ "T1059",
1484
+ "T1078",
1485
+ "T1486",
1486
+ "T1567"
1487
+ ],
1488
+ "framework_gaps": [
1489
+ "Decryptor-Availability-Pre-Decision",
1490
+ "EU-Sanctions-Reg-2014-833-Cyber",
1491
+ "Immutable-Backup-Recovery",
1492
+ "Insurance-Carrier-24h-Notification",
1493
+ "OFAC-SDN-Payment-Block",
1494
+ "PHI-Exfil-Before-Encrypt-Breach-Class"
1495
+ ],
1496
+ "rfc_refs": [],
1497
+ "cwe_refs": [
1498
+ "CWE-287",
1499
+ "CWE-798"
1500
+ ],
1501
+ "d3fend_refs": [
1502
+ "D3-CSPP",
1503
+ "D3-IOPR",
1504
+ "D3-NTA",
1505
+ "D3-RPA"
1506
+ ],
1507
+ "dlp_refs": []
1508
+ },
1292
1509
  {
1293
1510
  "name": "researcher",
1294
1511
  "version": "1.0.0",
@@ -1570,7 +1787,14 @@
1570
1787
  "uk tsa 2021",
1571
1788
  "volt typhoon"
1572
1789
  ],
1573
- "data_deps": [],
1790
+ "data_deps": [
1791
+ "atlas-ttps.json",
1792
+ "cve-catalog.json",
1793
+ "cwe-catalog.json",
1794
+ "d3fend-catalog.json",
1795
+ "framework-control-gaps.json",
1796
+ "global-frameworks.json"
1797
+ ],
1574
1798
  "atlas_refs": [
1575
1799
  "AML.T0040"
1576
1800
  ],
@@ -1 +1 @@
1
- 3b2e3c3a40554d760ee71eded57828b0dcd3237ed0c4499ee123606d041bf1dc manifest-snapshot.json
1
+ ac16c35fbc0c164c00294ca821b6e44c12908800b5e6cfb339ea472c9a9ed5e0 manifest-snapshot.json