Skip to content

fix(data): reconcile 24 stale CIS M365 v6.0 recommendation IDs to v6.0.1 (closes #352)#396

Merged
Daren9m merged 3 commits into
mainfrom
fix/352-cis-stale-mappings
Apr 30, 2026
Merged

fix(data): reconcile 24 stale CIS M365 v6.0 recommendation IDs to v6.0.1 (closes #352)#396
Daren9m merged 3 commits into
mainfrom
fix/352-cis-stale-mappings

Conversation

@Daren9m
Copy link
Copy Markdown
Collaborator

@Daren9m Daren9m commented Apr 30, 2026

Summary

Closes #352. After #347 phase-1 enrichment landed, 24 of 180 CIS-mapped checks failed to pick up sectionNumber / assessmentStatus / cisSafeguardsByVersion / references because their cisM365ControlId referenced v6.0 numbering that CIS reorganized in v6.0.1. This PR reconciles all 24.

The reconciliation

Resolution Count Detail
Renumber (title-matched in v6.0.1) 11 e.g. EXO-DKIM-001 4.4 → 2.1.9
Remove cis-m365-v6 mapping 13 v6.0.1 no longer covers the surface
Total 24

Renumbered (11)

CheckID Title v6.0 v6.0.1
FORMS-CONFIG-004 Forms phishing protection 3.6.2 1.3.5
EXO-ANTISPAM-001 Anti-Spam Policy 4.3 2.1.6
EXO-DKIM-001 DKIM Signing 4.4 2.1.9
EXO-MALWARE-001 Malware Filter Policy 4.5 2.1.2
EXO-TRANSPORT-002 Transport rule for external forwarding 5.2 6.2.1
PURVIEW-AUDIT-001 Unified Audit Logging 5.3 3.1.1
INTUNE-SECURITY-001 Device Compliance Policy Baseline 6.1 4.1
INTUNE-ENROLLMENT-001 Device Enrollment Restrictions 6.3 4.2
PBI-TENANT-001 Power BI External Sharing 8.1 9.1.8
PBI-TENANT-002 Power BI Publish to Web 8.2 9.1.4
PBI-TENANT-003 Power BI Guest Access 8.3 9.1.1

Removed (13)

cis-m365-v6 mapping dropped — v6.0.1 doesn't itemize these surfaces:

Group CheckIDs Reason
Forms collaboration FORMS-CONFIG-001/002 No respond/collaborate controls (only 1.3.5 phishing)
PIM activation policy ENTRA-PIM-006/008/010 duration/MFA/notify not itemized in v6.0.1
Purview retention PURVIEW-RETENTION-001 no retention controls in v6.0.1
Compliance / Defender meta COMPLIANCE-ALERTPOLICY-001, DEFENDER-SECURESCORE-001 no alert-policy / Secure Score control
Intune device INTUNE-ENCRYPTION-001, INTUNE-UPDATE-001 moved to separate CIS Intune Benchmark
SPO scripting SPO-SCRIPT-001/002 no scripting controls
Teams guest TEAMS-GUEST-001 no Teams-guest-specific control (covered indirectly elsewhere)

These 13 retain their other framework mappings (NIST 800-53, CMMC, SOC 2, etc.); only the CIS M365 v6 mapping is dropped.

Pester gate

Added #352 every cis-m365-v6.controlId resolves to a recommendation # in data/cis-m365-crosswalk.json in tests/registry-integrity.Tests.ps1. Loads the crosswalk and asserts every CIS-mapped check's controlId is a known v6.0.1 recommendation #. Prevents regression.

Files

  • data/scf-check-mapping.json — 11 cisM365ControlId updates + 13 cleared (with empty cisM365Profiles)
  • data/registry.json — surgical edits to frameworks.cis-m365-v6 for the 24 affected checks (renumber + enrichment-refresh from crosswalk; or removal). Did NOT do a full Build-Registry.py rebuild because of unrelated SCF.db drift in the local checkout that would mask the real change — the surgical approach matches what a clean rebuild would produce for these 24 records.
  • tests/registry-integrity.Tests.ps1 — new Pester gate
  • CHANGELOG.md[Unreleased] / Fixed entry

Verification

After the change:

  • All 11 renumbered checks now have sectionNumber, assessmentStatus, cisSafeguardsByVersion, references populated
  • All 13 removed checks no longer have a cis-m365-v6 block
  • Invariant: 0 unresolved CIS mappings (was 24)
  • cis-m365-v6 mapped count unchanged at 167 — wait, was 180. -13 = 167 ✓ (the 11 renumbered stay mapped)

Test plan

  • Pester tests/registry-integrity.Tests.ps1 — 44/44 pass locally including the new gate
  • Pester tests/duplicate-keys.Tests.ps1, framework-definitions.Tests.ps1, scf-mapping.Tests.ps1, build-registry-guards.Tests.ps1, mapping-counts.Tests.ps1 — 254/254 pass
  • Verified all 11 renumbered checks now have phase-1 enrichment fields populated from crosswalk
  • Verified all 13 removed checks no longer carry cis-m365-v6 framework block
  • CI: validate-data + Pester jobs
  • CI: mapping-count-regression (will report 13 removed cis-m365-v6 mappings — expected)

Out of scope

Daren9m and others added 2 commits April 30, 2026 08:27
Fourteenth and FINAL domain audit under v3.4.0 umbrella (#326).
Resolves spike #335.

docs/audits/purview.md catalogs 27 unique patterns across 5
sub-domains (DLP policy coverage, sensitivity labels / MIP, retention,
eDiscovery + Insider Risk, anti-patterns). Maps against 16 existing
M365-scope Purview-related checks across PURVIEW-*, COMPLIANCE-*,
plus cross-domain Power BI sensitivity labels.

Surfaces:
- 14 gap CheckIDs covering DLP template currency, custom sensitive
  info types, Endpoint DLP location coverage, DLP rule action
  progression, sensitivity label encryption + defaults + auto-labeling
  gap, retention legal hold + records management, eDiscovery RBAC +
  Premium feature, Insider Risk Management policies + analyst
  assignments, audit log retention period, encryption offline-access
  duration
- 4 cross-spike CheckID consolidations:
  - Site-protection labels ↔ #337 (SPO/OneDrive)
  - Teams sensitivity labels ↔ #340 (Teams)
  - Copilot grounding labels ↔ #336 (Power Platform)
  - PBI sensitivity labels (already covered, with #336 dedup)
- 3 narrative-refresh chore: candidates

Threat-pattern map covers data theft by departing employee, outbound
DLP via email, sensitive label content cached on personal device,
Teams chat data loss without retention, MIP without auto-labeling,
eDiscovery role over-permissioning, Insider Risk alerts going
nowhere, audit log retention insufficient for IR, endpoint DLP gap,
custom org data not protected by templates.

Detection appendix documents 8 cmdlet patterns + 8 edge cases across
Security & Compliance PowerShell + Exchange Online connector. Like
#332 (MDO) and #336 (Power Platform), Purview lives almost entirely
outside Microsoft Graph. Specific edge cases:
- Multiple PowerShell modules required (S&C + ExchangeOnline + ComplianceCenter)
- Policy Mode enum (Enable, TestWithNotifications, etc.)
- Sensitivity labels are 3 distinct artifacts (label store + label
  policies + auto-labeling policies) — reconciliation required
- Retention labels vs retention policies (don't conflate)
- Endpoint DLP requires onboarded devices (#334 cross-domain)
- Insider Risk + Premium eDiscovery are E5+ addons (license-gated)
- Auto-labeling scope is per-location (Exchange / SPO / OneDrive each)
- Records management vs retention labels (immutable-vs-flexible
  distinction)

V3.4.0 AUDIT UMBRELLA COMPLETE: this is the fourteenth and final domain
audit. All 14 spikes (#327-#340 inclusive) resolved. Doc includes a
completion summary mapping each spike to its merged PR + 4 cross-cutting
themes surfaced across the audit work for v3.5 consideration:

  1. AZ-namespace boundary issues (5+ Entra controls in AZ namespace)
  2. Namespace duplications (DEFENDER/EXO 3 pairs, PBI/POWERBI 11 pairs,
     plus implicit COMPLIANCE-DLP / proposed PURVIEW-DLP overlap)
  3. Canonical data file pattern — 4 proposed:
     - data/role-tiers.json (#328)
     - data/microsoft-first-party-appids.json (#361)
     - data/transport-rule-actions.json (#339)
     - data/power-platform-connectors.json (#336)
  4. Detection-method surface diversity — 5 distinct contracts:
     - Microsoft Graph
     - Exchange Online PowerShell
     - Security & Compliance PowerShell
     - MDCA REST API (per-tenant URL)
     - Power Platform admin PowerShell

Same template as #327, #328, #329, #330, #331, #332, #333, #334, #336,
#337, #338, #339, #340.

Closes #335

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…0.1 (closes #352)

Surfaced after #347 phase-1 enrichment landed: 24 of 180 CIS-mapped checks
referenced v6.0 numbering that CIS reorganized in v6.0.1, so phase-1 fields
(sectionNumber, assessmentStatus, cisSafeguardsByVersion, references) didn't
populate.

Renumbered (11) by title-match against v6.0.1 crosswalk:
  FORMS-CONFIG-004       3.6.2 -> 1.3.5
  EXO-ANTISPAM-001       4.3   -> 2.1.6
  EXO-DKIM-001           4.4   -> 2.1.9
  EXO-MALWARE-001        4.5   -> 2.1.2
  EXO-TRANSPORT-002      5.2   -> 6.2.1
  PURVIEW-AUDIT-001      5.3   -> 3.1.1
  INTUNE-SECURITY-001    6.1   -> 4.1
  INTUNE-ENROLLMENT-001  6.3   -> 4.2
  PBI-TENANT-001         8.1   -> 9.1.8
  PBI-TENANT-002         8.2   -> 9.1.4
  PBI-TENANT-003         8.3   -> 9.1.1

Removed cis-m365-v6 mapping (13) — v6.0.1 no longer covers the surface:
  FORMS-CONFIG-001/002 (no Forms-respond/collaborate controls)
  ENTRA-PIM-006/008/010 (PIM activation policy details not itemized)
  PURVIEW-RETENTION-001 (no retention controls in v6.0.1)
  COMPLIANCE-ALERTPOLICY-001 (no alert-policy control)
  DEFENDER-SECURESCORE-001 (no Secure Score control)
  INTUNE-ENCRYPTION-001 / INTUNE-UPDATE-001 (moved to Intune Benchmark)
  SPO-SCRIPT-001/002 (no scripting controls)
  TEAMS-GUEST-001 (no Teams-guest-specific control)

New Pester gate prevents regression: every cis-m365-v6.controlId in registry
must resolve to a recommendation # in data/cis-m365-crosswalk.json.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

Content enrichment population

Overall (1105 checks): rationale 26.3% (291/1105) • impact 26.3% (291/1105) • references 26.3% (291/1105)

Framework n rationale impact references
cis-controls-v8 1020 25.1% (256/1020) 25.1% (256/1020) 25.1% (256/1020)
cis-m365-v6 167 100.0% (167/167) 100.0% (167/167) 100.0% (167/167)
cisa-scuba 52 100.0% (52/52) 100.0% (52/52) 100.0% (52/52)
cmmc 1080 26.3% (284/1080) 26.3% (284/1080) 26.3% (284/1080)
eidsca 21 100.0% (21/21) 100.0% (21/21) 100.0% (21/21)
essential-eight 630 22.2% (140/630) 22.2% (140/630) 22.2% (140/630)
fedramp 1072 27.1% (291/1072) 27.1% (291/1072) 27.1% (291/1072)
gdpr 11 100.0% (11/11) 100.0% (11/11) 100.0% (11/11)
hipaa 501 33.3% (167/501) 33.3% (167/501) 33.3% (167/501)
iso-27001 1020 26.6% (271/1020) 26.6% (271/1020) 26.6% (271/1020)
iso-27002 1020 26.6% (271/1020) 26.6% (271/1020) 26.6% (271/1020)
iso-27017 1012 26.0% (263/1012) 26.0% (263/1012) 26.0% (263/1012)
mitre-attack 892 30.7% (274/892) 30.7% (274/892) 30.7% (274/892)
nis2 311 25.7% (80/311) 25.7% (80/311) 25.7% (80/311)
nist-800-171 1080 26.3% (284/1080) 26.3% (284/1080) 26.3% (284/1080)
nist-800-53 1072 27.1% (291/1072) 27.1% (291/1072) 27.1% (291/1072)
nist-csf 826 31.1% (257/826) 31.1% (257/826) 31.1% (257/826)
pci-dss 1052 26.3% (277/1052) 26.3% (277/1052) 26.3% (277/1052)
soc2 1103 26.4% (291/1103) 26.4% (291/1103) 26.4% (291/1103)
stig 13 100.0% (13/13) 100.0% (13/13) 100.0% (13/13)

Informational only — does not gate the build. The hard release-gate for Critical/High enrichment lives in #281 (v3.2.0).

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

Framework mapping count delta

Framework main this PR Δ Δ% Status
cis-controls-v8 1020 1020 0 +0.00% ✓ OK
cis-m365-v6 180 167 -13 -7.22% ⚠️ WAIVED
cisa-scuba 52 52 0 +0.00% ✓ OK
cmmc 1080 1080 0 +0.00% ✓ OK
eidsca 21 21 0 +0.00% ✓ OK
essential-eight 630 630 0 +0.00% ✓ OK
fedramp 1072 1072 0 +0.00% ✓ OK
gdpr 11 11 0 +0.00% ✓ OK
hipaa 501 501 0 +0.00% ✓ OK
iso-27001 1020 1020 0 +0.00% ✓ OK
iso-27002 1020 1020 0 +0.00% ✓ OK
iso-27017 1012 1012 0 +0.00% ✓ OK
mitre-attack 892 892 0 +0.00% ✓ OK
nis2 311 311 0 +0.00% ✓ OK
nist-800-171 1080 1080 0 +0.00% ✓ OK
nist-800-53 1072 1072 0 +0.00% ✓ OK
nist-csf 826 826 0 +0.00% ✓ OK
pci-dss 1052 1052 0 +0.00% ✓ OK
soc2 1103 1103 0 +0.00% ✓ OK
stig 13 13 0 +0.00% ✓ OK

Result: ⚠️ PASS — drops in cis-m365-v6 were waived via ALLOW_MAPPING_DROP label(s).

@Daren9m Daren9m added the ALLOW_MAPPING_DROP=cis-m365-v6 Waiver: intentional drop of cis-m365-v6 mappings (e.g., #352 reconciliation) label Apr 30, 2026
@Daren9m Daren9m merged commit 9ea5789 into main Apr 30, 2026
9 checks passed
@Daren9m Daren9m deleted the fix/352-cis-stale-mappings branch April 30, 2026 18:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ALLOW_MAPPING_DROP=cis-m365-v6 Waiver: intentional drop of cis-m365-v6 mappings (e.g., #352 reconciliation)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

data-quality: 24 of 180 CIS-mapped checks reference recommendation #s not in v6.0.1 (likely v6.0 stale)

1 participant