Lab 02 — Control Crosswalk & Coverage Engine

Frameworks: NIST 800-53, OWASP ASVS, ISO 27002, PCI DSS, SOC 2. Kind: catalog of controls + process. Builds toward: Phase 15, Phase 07.

The problem (and the threat model)

The naive compliance program runs N separate efforts for N frameworks — re-documenting "we encrypt data in transit" five times, five ways, for five auditors. That is how a company spends three years on what should take nine months. The "threat" here is wasted, un-leveraged effort and un-evidenced claims: a control marked "done" in a spreadsheet with no fresh evidence behind it, or a requirement everyone assumed some other control covered. The control is a crosswalk engine: engineer each control once, map it to the requirement it satisfies in every framework, and prove — mechanically — that every required item has a substantiated control behind it.

one control ("TLS 1.2+ enforced & tested")
   ├─ NIST:SC-8        (FedRAMP)
   ├─ PCI:4.2.1        (PCI DSS)
   ├─ ISO:8.24         (ISO 27002)
   ├─ ASVS:9.1.1       (OWASP ASVS)
   └─ SOC2:CC6.7       (SOC 2)        → implement once, satisfy five

A control only counts when it is implemented, has evidence, and that evidence is fresh (an implemented control with stale or missing evidence is an assertion, not a control — the ConMon lesson from Phase 07/15).

What you build (lab.py)

  • is_substantiated(control) — implemented and evidenced and fresh.
  • validate_crosswalk(controls) — sorted findings of three kinds:
    • gap:{framework}:{req} — a required item no control even maps to;
    • unsubstantiated:{framework}:{req} — mapped, but no substantiated control behind it;
    • dangling-claim:{control}:{req} — a control claims a requirement no framework demands (a typo / stale mapping).
  • coverage(controls) — per framework: {required, satisfied, gaps}.
  • leverage(controls) — rank substantiated controls by how many real requirements each satisfies (the "one control, many frameworks" metric — where to invest).
  • is_ready(framework, controls) — zero gaps for that framework.

Attack / failure cases the tests cover

  • One control, many frameworks: a clean five-control library fully covers all five frameworks; the three highest-leverage controls each satisfy 5 requirements.
  • Gap: a requirement with no mapped control fails coverage and readiness.
  • Unsubstantiated: a mapped control with no evidence or stale evidence (> 365 days) does not satisfy its requirements — it becomes a coverage gap, not a free pass.
  • Dangling claim: a control claiming a requirement no framework demands is flagged.
  • Determinism: findings are sorted and stable.

Run

pip install -r requirements.txt
LAB_MODULE=solution pytest -q
pytest -q

Hardening / extensions

  • Import a real OSCAL catalog/profile and emit OSCAL assessment-results (Phase 15).
  • Add partial satisfaction (a requirement needing two controls) and weighted coverage.
  • Pull the crosswalk from CSA's Cloud Controls Matrix mappings instead of a hand-built table.
  • Add an exception path (owner + expiry) so a gap can be accepted with a tracked POA&M (Phase 15).

Interview / resume

"Built a multi-framework control-crosswalk engine that maps one engineered, evidenced control to its requirement in NIST 800-53, PCI DSS, ISO 27002, OWASP ASVS, and SOC 2 — computing coverage, flagging unsubstantiated and dangling mappings, and ranking controls by cross-framework leverage. The point: implement once, satisfy many; an un-evidenced control is a gap, not a checkbox."

Limitations: a representative requirement slice, not the full catalogs; one-to-one control→requirement satisfaction (no partial/composite controls); freshness is a single global window.