Control Catalogue (rendered)¶
Generated from
catalogue/controls/controls.yamlbytools/catalogue/validate.py. Do not edit by hand.
Catalogue version 0.1.0: the default catalogue: review and adapt it with your control owner.
Tier columns: M mandatory · R recommended · – not applicable.
Mappings are framework references. Control wording, thresholds and evidence rules are organisation-specific.
48 controls: 37 automated, 7 hybrid, 4 manual.
Summary¶
| ID | Control | Type | T1 | T2 | T3 | T4 | Mode | Min confidence | Evidence | SAMM | SSDF |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ASC-GOV-01 | Application is registered with accountable owners | configuration | M | M | M | M | automated | C1 | registry.application | D-TA-A1 | PO.2.1 |
| ASC-GOV-02 | Application classification is current and approved | process | M | M | M | M | hybrid | T1:M2 / T2:M2 / T3:M1 / T4:M1 | registry.classification | D-TA-A2, D-TA-A3 | |
| ASC-GOV-03 | Security champion assigned and trained | process | M | M | R | – | automated | C1 | registry.application, training.completion | G-EG-B1 | PO.2.1, PO.2.2 |
| ASC-GOV-04 | Engineers have completed secure development training | outcome | M | M | R | R | automated | C3 | training.completion | G-EG-A1, G-EG-A2 | PO.2.2 |
| ASC-GOV-05 | Security contact and vulnerability disclosure route published | configuration | M | M | M | R | automated | C1 | registry.application | O-IM-B1 | RV.1.3 |
| ASC-REQ-01 | ASVS target level and applicability profile defined | configuration | M | M | M | R | automated | C1 | registry.application | D-SR-A1 | PO.1.2, PW.1.2 |
| ASC-REQ-02 | Applicable ASVS requirements have a verification status | outcome | M | M | R | – | hybrid | C2 | test.security, scan.sast, scan.dast, scan.api, assessment.manual_control | D-SR-A2, V-RT-A1 | PW.1.2, PO.4.1 |
| ASC-REQ-03 | Supplier and third-party service security requirements recorded | process | M | R | – | – | manual | M2 | assessment.manual_control | D-SR-B1, D-SR-B2 | PO.1.3 |
| ASC-TM-01 | Threat model exists, is structured, and has been reviewed | process | M | M | R | – | hybrid | T1:M2 / T2:M2 / T3:M1 | repo.threat_model, assessment.threat_model | D-TA-B1, D-TA-B2 | PW.1.1 |
| ASC-TM-02 | Threat model is current | process | M | M | R | – | hybrid | M1 | assessment.threat_model | D-TA-B2, D-TA-B3 | PW.1.1 |
| ASC-TM-03 | Threats are mitigated, linked or accepted | outcome | M | R | – | – | automated | C1 | repo.threat_model | D-TA-B3, V-AA-B1 | PW.1.2 |
| ASC-ARC-01 | Architecture security review completed | process | M | M | R | – | manual | M2 | assessment.architecture_review | V-AA-A1, V-AA-A2 | PW.2.1 |
| ASC-ARC-02 | No end-of-life runtimes or frameworks | outcome | M | M | M | R | automated | C2 | sbom, scan.container, sbom.eol | D-SA-B2, O-EM-B2 | PW.4.1 |
| ASC-ARC-03 | Architecture review findings tracked to closure | outcome | M | M | R | – | automated | C3 | vuln.posture | V-AA-B1, V-AA-B2 | RV.2.2 |
| ASC-SRC-01 | Default branch protected | configuration | M | M | M | R | automated | C1 | repo.ruleset | I-SB-A2 | PS.1.1, PW.7.2 |
| ASC-SRC-02 | CODEOWNERS covers security-sensitive paths | configuration | M | M | R | – | automated | C1 | repo.codeowners | I-SB-A2 | PS.1.1 |
| ASC-SRC-03 | Secret scanning and push protection enabled | configuration | M | M | M | M | automated | C1 | repo.security_settings | I-SD-B1 | PW.7.2, PS.1.1 |
| ASC-SRC-04 | No active exposed secrets | outcome | M | M | M | M | automated | C3 | scan.secrets | I-SD-B2 | RV.2.2 |
| ASC-SRC-05 | Repository access is least-privilege and visibility is approved | configuration | M | M | M | R | automated | C1 | repo.access | I-SB-A1 | PS.1.1 |
| ASC-SRC-06 | GitHub Actions workflows are hardened | outcome | M | M | M | R | automated | C2 | scan.workflow_hardening, repo.actions_policy | I-SB-A2, I-SB-B2 | PO.3.2, PO.5.1 |
| ASC-BLD-01 | SAST executes on every change to the default branch | activity | M | M | M | R | automated | C2 | scan.sast | V-ST-A1, I-SB-A2 | PW.7.2 |
| ASC-BLD-02 | Dependency vulnerability analysis (SCA) executes | activity | M | M | M | M | automated | C2 | scan.sca | I-SB-B2 | PW.4.4, RV.1.1 |
| ASC-BLD-03 | SBOM generated for every release artifact and ingested | activity | M | M | M | R | automated | C2 | sbom | I-SB-B1 | PS.3.2 |
| ASC-BLD-04 | IaC is scanned for misconfiguration | activity | M | M | M | R | automated | C2 | scan.iac | O-EM-A2, I-SB-A2 | PW.7.2, PW.9.1 |
| ASC-BLD-05 | Container images are scanned by digest | activity | M | M | M | R | automated | C2 | scan.container, sbom | I-SB-B2, O-EM-B2 | PW.4.4, RV.1.1 |
| ASC-BLD-06 | Release artifacts carry verified build provenance | activity | M | M | R | – | automated | C3 | provenance.attestation | I-SB-A3 | PS.2.1, PS.3.1 |
| ASC-BLD-07 | Dependency review gates new vulnerable or disallowed dependencies | configuration | M | M | R | – | automated | C2 | repo.ruleset, scan.sca | I-SB-B3 | PW.4.1 |
| ASC-BLD-08 | Licence policy compliance | outcome | M | M | M | R | automated | C2 | scan.licence | I-SB-B2, G-PC-B2 | PW.4.1 |
| ASC-BLD-09 | No malicious or compromised packages | outcome | M | M | M | M | automated | C2 | scan.malicious_package, sbom | I-SB-B3 | PW.4.4 |
| ASC-DEP-01 | Production deployments only through protected pipeline environments | configuration | M | M | R | – | automated | C1 | repo.environments, deploy.record | I-SD-A1, I-SD-A2 | PO.5.1 |
| ASC-DEP-02 | No long-lived cloud credentials in CI | configuration | M | M | M | R | automated | C1 | repo.environments, scan.workflow_hardening | I-SD-B2 | PO.5.1 |
| ASC-DEP-03 | Artifact integrity verified at deployment | activity | M | R | – | – | automated | C2 | deploy.record | I-SD-A3 | PS.2.1 |
| ASC-DEP-04 | Application runtime secrets held in a managed vault | configuration | M | M | R | – | hybrid | C2 | scan.iac, cloud.posture | I-SD-B2, I-SD-B3 | PO.5.1 |
| ASC-TST-01 | DAST executes against a deployed environment | activity | M | M | R | – | automated | C2 | scan.dast, deploy.record | V-ST-A2 | PW.8.2 |
| ASC-TST-02 | API security testing against the API definition | activity | M | M | R | – | automated | C2 | scan.api | V-ST-A2, V-RT-B2 | PW.8.2 |
| ASC-TST-03 | Independent penetration test within period | process | M | M | R | – | manual | M2 | assessment.pentest | V-ST-B2 | PW.8.2 |
| ASC-TST-04 | Abuse-case tests derived from the threat model | activity | M | R | – | – | automated | C2 | test.security, repo.threat_model | V-RT-B2, V-RT-A3 | PW.8.2 |
| ASC-TST-05 | Security regression tests run in CI | activity | M | M | R | – | automated | C2 | test.security | V-RT-A2, V-RT-A3 | PW.8.2 |
| ASC-VUL-01 | Findings are owned and triaged within SLA | outcome | M | M | M | M | automated | C3 | vuln.posture | I-DM-A1, I-DM-A2 | RV.2.1 |
| ASC-VUL-02 | Vulnerabilities remediated within SLA | outcome | M | M | M | M | automated | C3 | vuln.posture | I-DM-A2, I-DM-A3 | RV.2.2 |
| ASC-VUL-03 | Exceptions are approved, current and within limits | outcome | M | M | M | M | automated | C3 | vuln.posture | G-PC-B2, I-DM-A2 | |
| ASC-VUL-04 | Recurring weakness classes are analysed | process | M | R | – | – | hybrid | M1 | process.review_record | I-DM-B2, I-DM-B3 | RV.3.1, RV.3.2, RV.3.3 |
| ASC-OPS-01 | Security-relevant application logs reach the SIEM | activity | M | M | R | – | automated | C3 | siem.log_source_health | O-IM-A1, O-IM-A2 | |
| ASC-OPS-02 | Incident response readiness for the application | process | M | R | – | – | manual | T1:M2 / T2:M1 | assessment.manual_control | O-IM-B1, O-IM-B2 | |
| ASC-OPS-03 | Cloud posture findings on the application's scopes are within SLA | outcome | M | M | R | – | automated | C3 | cloud.posture | O-EM-A2, O-EM-A3 | |
| ASC-OPS-04 | Deployed images and runtimes are patched regularly | outcome | M | M | R | – | automated | C2 | deploy.record, scan.container | O-EM-B1, O-EM-B2 | |
| ASC-OPS-05 | Data stores are inventoried, encrypted and backed up per classification | configuration | M | R | – | – | hybrid | C1 | cloud.posture, registry.application | O-OM-A1, O-OM-A2 | |
| ASC-OPS-06 | Retired applications are fully decommissioned | outcome | M | M | M | M | automated | C1 | repo.access, cloud.posture | O-OM-B1, O-OM-B2 |
SAMM coverage by controls¶
Which SAMM stream levels have at least one control producing evidence. A gap (·) means that activity can only be assessed manually (SAMM interview). That is expected for much of Governance.
| Practice | Stream | L1 | L2 | L3 |
|---|---|---|---|---|
| Governance / Strategy & Metrics | G-SM-A Create and Promote | · | · | · |
| Governance / Strategy & Metrics | G-SM-B Measure and Improve | · | · | · |
| Governance / Policy & Compliance | G-PC-A Policy and Standards | · | · | · |
| Governance / Policy & Compliance | G-PC-B Compliance Management | · | ASC-BLD-08, ASC-VUL-03 | · |
| Governance / Education & Guidance | G-EG-A Training and Awareness | ASC-GOV-04 | ASC-GOV-04 | · |
| Governance / Education & Guidance | G-EG-B Organization and Culture | ASC-GOV-03 | · | · |
| Design / Threat Assessment | D-TA-A Application Risk Profile | ASC-GOV-01 | ASC-GOV-02 | ASC-GOV-02 |
| Design / Threat Assessment | D-TA-B Threat Modeling | ASC-TM-01 | ASC-TM-01, ASC-TM-02 | ASC-TM-02, ASC-TM-03 |
| Design / Security Requirements | D-SR-A Software Requirements | ASC-REQ-01 | ASC-REQ-02 | · |
| Design / Security Requirements | D-SR-B Supplier Security | ASC-REQ-03 | ASC-REQ-03 | · |
| Design / Secure Architecture | D-SA-A Architecture Design | · | · | · |
| Design / Secure Architecture | D-SA-B Technology Management | · | ASC-ARC-02 | · |
| Implementation / Secure Build | I-SB-A Build Process | ASC-SRC-05 | ASC-BLD-01, ASC-BLD-04, ASC-SRC-01, ASC-SRC-02, ASC-SRC-06 | ASC-BLD-06 |
| Implementation / Secure Build | I-SB-B Software Dependencies | ASC-BLD-03 | ASC-BLD-02, ASC-BLD-05, ASC-BLD-08, ASC-SRC-06 | ASC-BLD-07, ASC-BLD-09 |
| Implementation / Secure Deployment | I-SD-A Deployment Process | ASC-DEP-01 | ASC-DEP-01 | ASC-DEP-03 |
| Implementation / Secure Deployment | I-SD-B Secret Management | ASC-SRC-03 | ASC-DEP-02, ASC-DEP-04, ASC-SRC-04 | ASC-DEP-04 |
| Implementation / Defect Management | I-DM-A Defect Tracking | ASC-VUL-01 | ASC-VUL-01, ASC-VUL-02, ASC-VUL-03 | ASC-VUL-02 |
| Implementation / Defect Management | I-DM-B Metrics and Feedback | · | ASC-VUL-04 | ASC-VUL-04 |
| Verification / Architecture Assessment | V-AA-A Architecture Validation | ASC-ARC-01 | ASC-ARC-01 | · |
| Verification / Architecture Assessment | V-AA-B Architecture Mitigation | ASC-ARC-03, ASC-TM-03 | ASC-ARC-03 | · |
| Verification / Requirements-driven Testing | V-RT-A Control Verification | ASC-REQ-02 | ASC-TST-05 | ASC-TST-04, ASC-TST-05 |
| Verification / Requirements-driven Testing | V-RT-B Misuse/Abuse Testing | · | ASC-TST-02, ASC-TST-04 | · |
| Verification / Security Testing | V-ST-A Scalable Baseline | ASC-BLD-01 | ASC-TST-01, ASC-TST-02 | · |
| Verification / Security Testing | V-ST-B Deep Understanding | · | ASC-TST-03 | · |
| Operations / Incident Management | O-IM-A Incident Detection | ASC-OPS-01 | ASC-OPS-01 | · |
| Operations / Incident Management | O-IM-B Incident Response | ASC-GOV-05, ASC-OPS-02 | ASC-OPS-02 | · |
| Operations / Environment Management | O-EM-A Configuration Hardening | · | ASC-BLD-04, ASC-OPS-03 | ASC-OPS-03 |
| Operations / Environment Management | O-EM-B Patching and Updating | ASC-OPS-04 | ASC-ARC-02, ASC-BLD-05, ASC-OPS-04 | · |
| Operations / Operational Management | O-OM-A Data Protection | ASC-OPS-05 | ASC-OPS-05 | · |
| Operations / Operational Management | O-OM-B System Decommissioning / Legacy Management | ASC-OPS-06 | ASC-OPS-06 | · |
Control detail¶
ASC-GOV-01¶
Application is registered with accountable owners · domain GOV · configuration · owner appsec-governance · review every 12 months
The application has a schema-valid .security/application.yaml in its primary repository (or a registry entry for apps without a repo). Business owner and technical owner resolve to active identities, and every repository implementing the app is linked.
- Rationale: Without ownership and linkage nothing else can be attributed, prioritised or escalated.
- Applies when: always
- Assessment: automated · evaluator
registry_complete@1· min confidence C1 · evidenceregistry.application - Parameters:
{max_unlinked_repos: 0, owners_must_resolve: true} - How we prove it operates: The GitHub connector reads application.yaml daily and on push, validates it against the schema, and resolves owners against your identity provider and GitHub teams. Departed owners fail the control within 24h.
- Implementation: Merge the onboarding PR raised by the platform; complete owner and classification fields.
- Remediation: Update owners in application.yaml; the control re-evaluates on push.
- Exceptions: not permitted
- Mappings: SAMM: D-TA-A L1 · SSDF: PO.2.1 · CSF 2.0: ID.AM-02, GV.RR-02
ASC-GOV-02¶
Application classification is current and approved · domain GOV · process · owner appsec-governance · review every 12 months
The tier is computed by the classification model from current inputs, approved by AppSec for Tier 1/2, and reviewed at least every 12 months or when a classification input changes.
- Rationale: The tier determines every other control requirement; a stale tier silently under-protects.
- Applies when: always
- Assessment: hybrid · evaluator
classification_current@1· min confidence T1:M2 / T2:M2 / T3:M1 / T4:M1 · evidenceregistry.classification - How we prove it operates: The classification record stores inputs, model version, computed tier, approver and date. The event_bound freshness policy invalidates it when application.yaml classification inputs change.
- Implementation: Answer the classification questions in application.yaml; AppSec approves Tier 1/2 in the platform.
- Remediation: Re-attest classification in the platform; changes in tier re-baseline required controls.
- Exceptions: not permitted
- Mappings: SAMM: D-TA-A L2, D-TA-A L3 · CSF 2.0: ID.AM-05
ASC-GOV-03¶
Security champion assigned and trained · domain GOV · process · owner appsec-governance · review every 12 months
The owning team has a named security champion who has completed champion onboarding within 12 months.
- Rationale: Champions are the scaling mechanism for threat modelling, triage and guidance.
- Applies when: always
- Assessment: automated · evaluator
champion_assigned@1· min confidence C1 · evidenceregistry.application,training.completion - Parameters:
{training_course: champion-onboarding, within_days: 365} - How we prove it operates: Champion field in application.yaml resolved to an active user, and an LMS completion record for the champion course.
- Implementation: Nominate a champion; enrol them in the champion programme.
- Remediation: Nominate a replacement within 30 days of a champion leaving.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: G-EG-B L1 · SSDF: PO.2.1, PO.2.2 · CSF 2.0: PR.AT-02
ASC-GOV-04¶
Engineers have completed secure development training · domain GOV · outcome · owner appsec-governance · review every 12 months
At least 90% of engineers contributing to the app's repositories in the last 90 days hold a current secure-development training completion.
- Rationale: Baseline awareness reduces the introduction rate of common weakness classes.
- Applies when: always
- Assessment: automated · evaluator
team_training_coverage@1· min confidence C3 · evidencetraining.completion - Parameters:
{contributor_window_days: 90, threshold_pct: 90} - How we prove it operates: LMS completion export (connector) joined to GitHub contributors via the identity provider's link to GitHub accounts. Reported at TEAM level only, never per person (privacy, see platform security architecture section 6).
- Implementation: Assign the secure-development course to all engineers via the LMS.
- Remediation: Team lead schedules outstanding completions.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: G-EG-A L1, G-EG-A L2 · SSDF: PO.2.2 · CSF 2.0: PR.AT-01, PR.AT-02
- Notes: A learning-platform connector is planned; until it exists this control is evaluated from a quarterly HR export (M1).
ASC-GOV-05¶
Security contact and vulnerability disclosure route published · domain GOV · configuration · owner appsec-governance · review every 12 months
The repository contains SECURITY.md (or org default) describing how to report vulnerabilities, and .security/security-contact.yaml names a monitored contact.
- Rationale: External and internal reporters need a working route; SSDF RV.1.3.
- Applies when: always
- Assessment: automated · evaluator
security_policy_present@1· min confidence C1 · evidenceregistry.application - How we prove it operates: GitHub API community profile reports a security policy; contact address resolves to a monitored mailbox/group.
- Implementation: Inherit the org-level SECURITY.md from the .github repository; add security-contact.yaml.
- Remediation: Add the file; re-evaluates on push.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-IM-B L1 · SSDF: RV.1.3 · CSF 2.0: ID.RA-08
ASC-REQ-01¶
ASVS target level and applicability profile defined · domain REQ · configuration · owner appsec-governance · review every 12 months
.security/asvs.yaml declares the ASVS version and target level (≥ the tier's asvs_target) and the applicability profile (web UI, API, OAuth/OIDC, file handling, WebRTC, ...) used to scope requirements.
- Rationale: Makes the requirement set explicit and machine-scoped instead of a 300-line checklist.
- Applies when: always
- Assessment: automated · evaluator
asvs_profile_valid@1· min confidence C1 · evidenceregistry.application - How we prove it operates: Schema validation plus check target_level ≥ classification asvs_target.
- Implementation: Generated by onboarding from application.yaml capability flags; team reviews.
- Remediation: Raise target level or approve a tier override.
- Exceptions: not permitted
- Mappings: SAMM: D-SR-A L1 · ASVS 5.0: V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17 · SSDF: PO.1.2, PW.1.2
ASC-REQ-02¶
Applicable ASVS requirements have a verification status · domain REQ · outcome · owner appsec-governance · review every 12 months
Every applicable ASVS requirement for the target level has a status of verified (by automated test, scanner rule, or manual review evidence), not-verified, or excepted. Target: ≥ 80% verified for Tier 1/2.
- Rationale: Turns ASVS into tracked, evidenced requirements rather than a one-off checklist.
- Applies when: always
- Assessment: hybrid · evaluator
asvs_coverage@1· min confidence C2 · evidencetest.security,scan.sast,scan.dast,scan.api,assessment.manual_control - Parameters:
{verified_pct: {'1': 80, '2': 80, '3': 50}} - How we prove it operates: Requirement status is DERIVED from evidence: JUnit tests carrying an asvs property, scanner rules mapped to ASVS requirements, and manual review records. A requirement cannot be marked verified by hand.
- Implementation: Tag security tests with ASVS IDs; use the test-evidence workflow; book manual review for the rest.
- Remediation: Add tests or manual verification for unverified requirements, prioritised by threat model.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-SR-A L2, V-RT-A L1 · SSDF: PW.1.2, PO.4.1 · CSF 2.0: PR.PS-06
ASC-REQ-03¶
Supplier and third-party service security requirements recorded · domain REQ · process · owner appsec-governance · review every 12 months
Third-party services and suppliers listed in application.yaml have a recorded security assessment or contract security schedule reference.
- Rationale: SaaS and supplier components are part of the attack surface but invisible to code scanning.
- Applies when: has_third_party_services
- Assessment: manual · evaluator
manual_attestation@1· min confidence M2 · evidenceassessment.manual_control - How we prove it operates: Procurement/supplier-assurance reference recorded per supplier and reviewed by Security Governance.
- Implementation: List suppliers in application.yaml; link supplier assurance records.
- Remediation: Request supplier assessment through procurement.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-SR-B L1, D-SR-B L2 · SSDF: PO.1.3 · CSF 2.0: GV.SC-05, GV.SC-07
ASC-TM-01¶
Threat model exists, is structured, and has been reviewed · domain TM · process · owner appsec-governance · review every 12 months
.security/threat-model/ contains a schema-valid model (system context, data flows, trust boundaries, assets, threats with STRIDE category, mitigations, residual risk) and a review is recorded.
- Rationale: Design-level threats cannot be found by scanners.
- Applies when: always
- Assessment: hybrid · evaluator
threat_model_reviewed@1· min confidence T1:M2 / T2:M2 / T3:M1 · evidencerepo.threat_model,assessment.threat_model - How we prove it operates: Structural validity is automated (C1). "Reviewed" requires a review record by a reviewer outside the team for Tier 1/2 (M2), bound to the commit SHA of the threat-model files reviewed.
- Implementation: Use the threat-model kit (docs/standards/threat-modelling-standard.md); book AppSec facilitation for Tier 1.
- Remediation: Complete or update the model; request review in the platform.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-TA-B L1, D-TA-B L2 · SSDF: PW.1.1 · CSF 2.0: ID.RA-04, ID.RA-05
ASC-TM-02¶
Threat model is current · domain TM · process · owner appsec-governance · review every 12 months
The reviewed threat model is within its review period and no architecture-change event has occurred since review.
- Rationale: Stale threat models give false assurance.
- Applies when: always
- Assessment: hybrid · evaluator
evidence_fresh@1· min confidence M1 · evidenceassessment.threat_model - Parameters:
{architecture_change_signals: ['PR label: architecture-change', change to .security/threat-model/data-flow*, new internet exposure in application.yaml, new data store in application.yaml]} - How we prove it operates: Freshness engine; event_bound invalidation from the listed signals.
- Implementation: Label architecture-changing PRs; update data-flow on change.
- Remediation: Re-review the threat model.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-TA-B L2, D-TA-B L3 · SSDF: PW.1.1
ASC-TM-03¶
Threats are mitigated, linked or accepted · domain TM · outcome · owner appsec-governance · review every 12 months
Every threat rated high in threats.yaml links to a mitigation (control/requirement/ticket) or an approved residual-risk acceptance.
- Rationale: A threat model that lists threats but tracks nothing is documentation, not risk management.
- Applies when: always
- Assessment: automated · evaluator
threat_mitigation_linkage@1· min confidence C1 · evidencerepo.threat_model - How we prove it operates: Parser checks every high threat has mitigation refs that resolve (ASVS ID, ASC control, Jira key) or a residual-risk entry with approved exception ID.
- Implementation: Reference mitigations by ID in mitigations.yaml.
- Remediation: Link or raise mitigation tickets.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-TA-B L3, V-AA-B L1 · SSDF: PW.1.2 · CSF 2.0: ID.RA-06
ASC-ARC-01¶
Architecture security review completed · domain ARC · process · owner appsec-governance · review every 12 months
An architecture security review has been completed before first production release and after every material architecture change.
- Rationale: Catches design flaws (authN/authZ model, trust boundaries, data flows) that are expensive to fix later.
- Applies when: always
- Assessment: manual · evaluator
manual_attestation@1· min confidence M2 · evidenceassessment.architecture_review - How we prove it operates: Review record (reviewer, scope, commit of design docs, outcome, findings imported as findings) in the platform; independent reviewer enforced.
- Implementation: Request a review via the platform; provide threat model and architecture docs.
- Remediation: Address review findings; request re-review.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-AA-A L1, V-AA-A L2 · SSDF: PW.2.1 · CSF 2.0: ID.RA-05
ASC-ARC-02¶
No end-of-life runtimes or frameworks · domain ARC · outcome · owner appsec-governance · review every 12 months
No component in the current SBOM or deployed image is a runtime, framework or OS past its end-of-life date.
- Rationale: EOL components stop receiving security fixes; vulnerability scanners under-report them.
- Applies when: has_sbom_capable_stack
- Assessment: automated · evaluator
eol_components@1· min confidence C2 · evidencesbom,scan.container,sbom.eol - Parameters:
{eol_source: endoflife.date (config/eol-products.yaml), grace_days: 0} - How we prove it operates: SBOM components matched against cached EOL data; result recorded as derived evidence with the data snapshot date.
- Implementation: Keep runtimes on supported versions; plan upgrades ahead of EOL (warning at 180 days).
- Remediation: Upgrade, or raise a time-bound exception with a migration plan.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: D-SA-B L2, O-EM-B L2 · SSDF: PW.4.1 · CSF 2.0: PR.PS-02
ASC-ARC-03¶
Architecture review findings tracked to closure · domain ARC · outcome · owner appsec-governance · review every 12 months
Findings from architecture reviews are recorded as platform findings and remediated within SLA or excepted.
- Rationale: Closes the loop between assessment and mitigation.
- Applies when: always
- Assessment: automated · evaluator
findings_within_sla@1· min confidence C3 · evidencevuln.posture - Parameters:
{source: architecture_review} - How we prove it operates: Derived from finding records with source=architecture_review and their SLA state.
- Implementation: Reviewer records findings in the platform during review.
- Remediation: Remediate or except.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-AA-B L1, V-AA-B L2 · SSDF: RV.2.2
ASC-SRC-01¶
Default branch protected · domain SRC · configuration · owner appsec-governance · review every 12 months
Effective rules on the default branch require a pull request, ≥1 approving review (≥2 for Tier 1), dismissal of stale approvals, code-owner review, required status checks for the mandatory security workflows, and block force-push and deletion. Bypass is limited to a named break-glass team.
- Rationale: Guarantees code reaching production was reviewed and passed through the security pipeline.
- Applies when: has_source_code
- Assessment: automated · evaluator
branch_protection@1· min confidence C1 · evidencerepo.ruleset - Parameters:
{require_code_owner_review: true, required_approvals: {'1': 2, '2': 1, '3': 1, '4': 1}, required_checks: [aap / sast, aap / sca, aap / secrets]} - How we prove it operates: The effective rules for the branch are read from GitHub's "rules for a branch" API (rulesets and legacy protection merged). Configuration IS the operating control here; bypass actor list is also checked.
- Implementation: Apply the org ruleset "aap-default-branch" (Terraform-managed via the GitHub provider).
- Remediation: Opt the repo into the org ruleset.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-A L2 · SSDF: PS.1.1, PW.7.2 · CSF 2.0: PR.PS-01
ASC-SRC-02¶
CODEOWNERS covers security-sensitive paths · domain SRC · configuration · owner appsec-governance · review every 12 months
A valid CODEOWNERS file exists; .github/workflows/, .security/ and IaC paths have owners; GitHub reports no CODEOWNERS errors.
- Rationale: Ensures workflow and security-contract changes get the right reviewers (prevents silent removal of scans).
- Applies when: has_source_code
- Assessment: automated · evaluator
codeowners_coverage@1· min confidence C1 · evidencerepo.codeowners - Parameters:
{required_paths: [.github/workflows/, .security/]} - How we prove it operates: GitHub CODEOWNERS errors endpoint + platform path-coverage check.
- Implementation: Template CODEOWNERS from the repo template.
- Remediation: Add owners for uncovered paths.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-A L2 · SSDF: PS.1.1 · CSF 2.0: PR.AA-05
ASC-SRC-03¶
Secret scanning and push protection enabled · domain SRC · configuration · owner appsec-governance · review every 12 months
GHAS secret scanning, push protection and validity checks are enabled for the repository.
- Rationale: Prevents credential leaks at the point of push and detects historic leaks.
- Applies when: has_source_code
- Assessment: automated · evaluator
security_feature_enabled@1· min confidence C1 · evidencerepo.security_settings - Parameters:
{features: [secret_scanning, secret_scanning_push_protection, secret_scanning_validity_checks]} - How we prove it operates: security_and_analysis settings from the repos API; push-protection bypasses are separately ingested as findings.
- Implementation: Enforced by org security configuration.
- Remediation: Enable via the org security configuration.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SD-B L1 · SSDF: PW.7.2, PS.1.1 · CSF 2.0: PR.DS-01
ASC-SRC-04¶
No active exposed secrets · domain SRC · outcome · owner appsec-governance · review every 12 months
No open secret-scanning alert for a secret that is (or may be) valid; every alert revoked and closed within P1 SLA.
- Rationale: An exposed valid credential is the most directly exploitable finding class.
- Applies when: has_source_code
- Assessment: automated · evaluator
no_open_findings@1· min confidence C3 · evidencescan.secrets - Parameters:
{finding_type: secret, validity: [active, unknown]} - How we prove it operates: Pulled directly from the secret-scanning alerts API (C3 — authoritative source). Secret values are never stored.
- Implementation: Rotate first, then close the alert as revoked.
- Remediation: Revoke/rotate the credential; close alert as "revoked".
- Exceptions: not permitted
- Mappings: SAMM: I-SD-B L2 · SSDF: RV.2.2 · CSF 2.0: ID.RA-06
ASC-SRC-05¶
Repository access is least-privilege and visibility is approved · domain SRC · configuration · owner appsec-governance · review every 12 months
No outside collaborators with write/admin; admin limited to ≤ 3 users or a team; public visibility only with an approved open-source record.
- Rationale: Limits who can disable controls or exfiltrate code; prevents accidental publication.
- Applies when: always
- Assessment: automated · evaluator
repo_access_policy@1· min confidence C1 · evidencerepo.access - Parameters:
{max_admin_users: 3, public_requires: open_source_approval_id} - How we prove it operates: Collaborator/team permissions API, visibility; public repos cross-checked against open-source approval records.
- Implementation: Manage access through GitHub teams synced from your identity provider.
- Remediation: Remove direct admin grants; request open-source approval or make private.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-A L1 · SSDF: PS.1.1 · CSF 2.0: PR.AA-05
ASC-SRC-06¶
GitHub Actions workflows are hardened · domain SRC · outcome · owner appsec-governance · review every 12 months
Workflow static analysis reports no high-severity issues: third-party actions pinned to full SHA, no pull_request_target that checks out untrusted code, top-level permissions declared and minimal, no script injection from untrusted context, no long-lived cloud credentials.
- Rationale: CI is a privileged supply-chain entry point (cf. trivy-action tag compromise, Mar 2026).
- Applies when: has_workflows
- Assessment: automated · evaluator
scan_clean@1· min confidence C2 · evidencescan.workflow_hardening,repo.actions_policy - Parameters:
{max_severity: medium} - How we prove it operates: workflow-lint reusable workflow output (attested) on default branch + org Actions policy settings.
- Implementation: Use the org's allowed-actions list; pin by SHA (Dependabot keeps pins current).
- Remediation: Apply linter fixes; pin actions.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-A L2, I-SB-B L2 · SSDF: PO.3.2, PO.5.1 · CSF 2.0: GV.SC-04, PR.PS-01
ASC-BLD-01¶
SAST executes on every change to the default branch · domain BLD · activity · owner appsec-governance · review every 12 months
Static analysis (CodeQL via GHAS by default, or an approved alternative) runs on every push to the default branch and on PRs, covering every language detected in the repository, with the approved query suite.
- Rationale: Finds common code-level weakness classes (injection, XSS, unsafe deserialisation) early and cheaply.
- Applies when: has_source_code
- Assessment: automated · evaluator
scan_executed@1· min confidence C2 · evidencescan.sast - Parameters:
{language_coverage: all_detected, query_suite: {'1': security-extended, '2': security-extended, '3': default, '4': default}} - How we prove it operates: Evidence of an analysis on the current default-branch HEAD (or a commit within the freshness window whose diff to HEAD touches no source paths) from an approved workflow or the GHAS code-scanning analyses API, including tool version, languages and query suite. A workflow file alone is C1 and does NOT satisfy this.
- Implementation: Call security-workflows/sast or enable CodeQL default setup; both produce acceptable evidence.
- Remediation: Fix failing analysis; add missing languages.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-ST-A L1, I-SB-A L2 · ASVS 5.0: V1, V2, V15 · SSDF: PW.7.2 · CSF 2.0: PR.PS-06
ASC-BLD-02¶
Dependency vulnerability analysis (SCA) executes · domain BLD · activity · owner appsec-governance · review every 12 months
Resolved dependencies for all detected ecosystems are analysed for known vulnerabilities on each change to dependency manifests/lockfiles and at least every 30 days.
- Rationale: Most exploitable vulnerabilities in modern apps are in third-party components.
- Applies when: uses_dependencies
- Assessment: automated · evaluator
scan_executed@1· min confidence C2 · evidencescan.sca - Parameters:
{ecosystem_coverage: all_detected, require_lockfiles: true} - How we prove it operates: SCA evidence (approved workflow or Dependabot alerts API) for the current lockfile set; ecosystems compared to repository language/ecosystem detection.
- Implementation: Commit lockfiles; call security-workflows/sca.
- Remediation: Add lockfiles for unresolved ecosystems.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-B L2 · SSDF: PW.4.4, RV.1.1 · CSF 2.0: ID.RA-01
ASC-BLD-03¶
SBOM generated for every release artifact and ingested · domain BLD · activity · owner appsec-governance · review every 12 months
A CycloneDX SBOM (SPDX accepted and converted) is generated for each built artifact (source SBOM for repos without artifacts), bound to the artifact digest or commit, and ingested into Dependency-Track.
- Rationale: Enables "which apps are affected by CVE-X" and continuous monitoring without re-scanning.
- Applies when: uses_dependencies
- Assessment: automated · evaluator
sbom_current@1· min confidence C2 · evidencesbom - Parameters:
{bind_to: [artifact_digest, commit], min_components: 1, require_purl_pct: 95} - How we prove it operates: SBOM evidence with digest binding; ingestion confirmation from Dependency-Track (project UUID, processed timestamp); quality check (purl coverage, component count sanity).
- Implementation: Call security-workflows/sbom in the build job that produces the artifact.
- Remediation: Fix generator coverage (lockfiles, build context).
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-B L1 · SSDF: PS.3.2 · CSF 2.0: ID.AM-02 · Other: NTIA minimum elements, CycloneDX 1.5+
ASC-BLD-04¶
IaC is scanned for misconfiguration · domain BLD · activity · owner appsec-governance · review every 12 months
Terraform/Bicep/Kubernetes/Dockerfile content is scanned on each relevant change with the approved policy set.
- Rationale: Cloud misconfiguration is a leading cause of breaches and is cheapest to fix pre-deployment.
- Applies when: has_iac
- Assessment: automated · evaluator
scan_executed@1· min confidence C2 · evidencescan.iac - How we prove it operates: Attested IaC scan output on the commit, with policy-set version.
- Implementation: Call security-workflows/iac (Checkov + Trivy config; PSRule for Bicep optional).
- Remediation: Fix misconfigurations or record skip with justification (tracked as suppression).
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-EM-A L2, I-SB-A L2 · ASVS 5.0: V13 · SSDF: PW.7.2, PW.9.1 · CSF 2.0: PR.PS-01
ASC-BLD-05¶
Container images are scanned by digest · domain BLD · activity · owner appsec-governance · review every 12 months
Every image built or deployed for the application is scanned (vulnerabilities + misconfig) by digest at build, and re-evaluated continuously via its SBOM.
- Rationale: Base-image and OS-package vulnerabilities are invisible to source SCA.
- Applies when: builds_or_deploys_containers
- Assessment: automated · evaluator
artifact_scanned@1· min confidence C2 · evidencescan.container,sbom - Parameters:
{scope: deployed_digests_or_latest_build} - How we prove it operates: For each digest in deploy.record (or latest build), a scan evidence record with the same digest exists within freshness.
- Implementation: Call security-workflows/container after image build; also generate image SBOM.
- Remediation: Rebuild on a patched base image.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-B L2, O-EM-B L2 · SSDF: PW.4.4, RV.1.1 · CSF 2.0: ID.RA-01
ASC-BLD-06¶
Release artifacts carry verified build provenance · domain BLD · activity · owner appsec-governance · review every 12 months
Release artifacts (images, packages) have a SLSA build provenance attestation produced by an approved builder, verifiable via the GitHub attestations API / Sigstore.
- Rationale: Proves artifacts were built from the stated source by the stated pipeline; defeats artifact substitution.
- Applies when: publishes_artifacts
- Assessment: automated · evaluator
provenance_verified@1· min confidence C3 · evidenceprovenance.attestation - How we prove it operates: Platform verifies attestation signature, subject digest, and builder identity (approved reusable workflow).
- Implementation: Use actions/attest-build-provenance in the build job (via security-workflows/provenance).
- Remediation: Add attestation step; rebuild.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-A L3 · SSDF: PS.2.1, PS.3.1 · CSF 2.0: GV.SC-04 · Other: SLSA Build L2 (L3 with ephemeral, isolated builders)
ASC-BLD-07¶
Dependency review gates new vulnerable or disallowed dependencies · domain BLD · configuration · owner appsec-governance · review every 12 months
PRs that introduce dependencies with critical/high known vulnerabilities, malicious-package advisories or denied licences fail a required check.
- Rationale: Prevents new risk entering, rather than only detecting existing risk.
- Applies when: uses_dependencies
- Assessment: automated · evaluator
required_check_configured_and_executing@1· min confidence C2 · evidencerepo.ruleset,scan.sca - Parameters:
{check_name: aap / dependency-review, min_executions_30d: 1} - How we prove it operates: The check is required in effective branch rules (C1) AND has executed on at least one PR in 30 days (C2) — configured-but-never-run does not pass.
- Implementation: Call security-workflows/dependency-review on pull_request; add to required checks.
- Remediation: Enable the required check.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-B L3 · SSDF: PW.4.1 · CSF 2.0: GV.SC-04
ASC-BLD-08¶
Licence policy compliance · domain BLD · outcome · owner oss-governance · review every 12 months
No component in the current SBOM has a licence on the organisation's deny list without an approved exception; unknown licences ≤ 5% of components.
- Rationale: Legal and open-source governance risk (ADR-029).
- Applies when: uses_dependencies
- Assessment: automated · evaluator
licence_policy@1· min confidence C2 · evidencescan.licence - Parameters:
{max_unknown_pct: 5, policy: config/licence-policy.yaml} - How we prove it operates: Platform evaluates SBOM licences against a versioned policy; result is derived evidence.
- Implementation: Choose dependencies with approved licences; request OSS approval otherwise.
- Remediation: Replace component or obtain legal approval (exception).
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SB-B L2, G-PC-B L2 · SSDF: PW.4.1 · CSF 2.0: GV.SC-05
ASC-BLD-09¶
No malicious or compromised packages · domain BLD · outcome · owner appsec-governance · review every 12 months
The resolved dependency set contains no package version listed in malicious-package advisories (OSV MAL-*, GHSA malware).
- Rationale: Typosquats and hijacked packages execute at install/build time — before any other control.
- Applies when: uses_dependencies
- Assessment: automated · evaluator
no_open_findings@1· min confidence C2 · evidencescan.malicious_package,sbom - Parameters:
{finding_type: malicious_package} - How we prove it operates: OSV-based check in SCA workflow + platform re-matching of SBOM inventory against newly published MAL advisories (continuous).
- Implementation: Default in security-workflows/sca.
- Remediation: Remove the package, rotate any secrets exposed to the build, treat as incident (SOC escalation).
- Exceptions: not permitted
- Mappings: SAMM: I-SB-B L3 · SSDF: PW.4.4 · CSF 2.0: GV.SC-04, ID.RA-09
ASC-DEP-01¶
Production deployments only through protected pipeline environments · domain DEP · configuration · owner appsec-governance · review every 12 months
Production deployment uses a GitHub environment with required reviewers (Tier 1/2), restricted deployment branches, and environment-scoped secrets/OIDC; deployments are recorded.
- Rationale: Ensures what runs in production came through the controlled path.
- Applies when: deployed_via_github
- Assessment: automated · evaluator
environment_protection@1· min confidence C1 · evidencerepo.environments,deploy.record - Parameters:
{production_env_pattern: ^(prod|production), required_reviewers: {'1': 1, '2': 1}} - How we prove it operates: Environments API (protection rules, branch policies) + deployments API showing production deployments originate from those environments.
- Implementation: Define a production environment; deploy only from it.
- Remediation: Add protection rules.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SD-A L1, I-SD-A L2 · SSDF: PO.5.1 · CSF 2.0: PR.PS-01
ASC-DEP-02¶
No long-lived cloud credentials in CI · domain DEP · configuration · owner appsec-governance · review every 12 months
CI authenticates to Azure/AWS via OIDC federation; no repository/environment secrets hold cloud client secrets or access keys.
- Rationale: Long-lived CI credentials are a top supply-chain exfiltration target.
- Applies when: has_cloud_scope
- Assessment: automated · evaluator
no_static_cloud_credentials@1· min confidence C1 · evidencerepo.environments,scan.workflow_hardening - Parameters:
{secret_name_patterns: ['(?i)AZURE_CLIENT_SECRET', '(?i)AWS_SECRET_ACCESS_KEY', '(?i)AZURE_CREDENTIALS']} - How we prove it operates: Secret NAMES (never values) from repo/environment secrets API + workflow analysis for credential-based login actions.
- Implementation: Use OIDC federation from the pipeline to the cloud; never stored cloud keys.
- Remediation: Migrate to OIDC; delete the secret; rotate the old credential.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SD-B L2 · SSDF: PO.5.1 · CSF 2.0: PR.AA-01
ASC-DEP-03¶
Artifact integrity verified at deployment · domain DEP · activity · owner appsec-governance · review every 12 months
The deployment pipeline verifies the provenance attestation of the artifact digest before deploying (or the platform enforces via admission policy).
- Rationale: Closes the gap between "built securely" and "what is running".
- Applies when: publishes_artifacts
- Assessment: automated · evaluator
deploy_verification_executed@1· min confidence C2 · evidencedeploy.record - How we prove it operates: deploy-evidence workflow records
gh attestation verifyoutcome against the deployed digest. - Implementation: Use security-workflows/deploy-evidence in CD before the deploy step.
- Remediation: Add verification step.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SD-A L3 · SSDF: PS.2.1 · Other: SLSA verification
ASC-DEP-04¶
Application runtime secrets held in a managed vault · domain DEP · configuration · owner appsec-governance · review every 12 months
Runtime secrets are referenced from Key Vault / AWS Secrets Manager via managed identity, not set as plain app settings or env vars in IaC.
- Rationale: Centralised rotation, audit and access control for secrets.
- Applies when: has_cloud_scope
- Assessment: hybrid · evaluator
scan_clean@1· min confidence C2 · evidencescan.iac,cloud.posture - Parameters:
{policy_ids: [secrets-in-app-settings, kv-reference-required]} - How we prove it operates: IaC policy checks for plaintext secret settings + Defender recommendations on the app's cloud scope.
- Implementation: Use Key Vault references / Secrets Manager with managed identity.
- Remediation: Move secrets to vault; rotate.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-SD-B L2, I-SD-B L3 · ASVS 5.0: V13 · SSDF: PO.5.1 · CSF 2.0: PR.DS-01
ASC-TST-01¶
DAST executes against a deployed environment · domain TST · activity · owner appsec-governance · review every 12 months
A dynamic scan runs against a deployed non-production environment after each release (and at least every 90 days), authenticated for Tier 1/2.
- Rationale: Finds runtime issues (headers, session handling, injection reachable at runtime) that SAST cannot.
- Applies when: has_web_ui_or_api, deployed
- Assessment: automated · evaluator
dast_executed@1· min confidence C2 · evidencescan.dast,deploy.record - Parameters:
{authenticated: {'1': true, '2': true, '3': false}, min_urls_crawled: 10} - How we prove it operates: Attested DAST output naming the target URL, auth context and policy, linked to the release (deploy.record) it tested; a scan that crawled < min_urls is recorded as INCONCLUSIVE, not passing.
- Implementation: Call security-workflows/dast (OWASP ZAP baseline/full) post-deploy to test env.
- Remediation: Fix findings; fix auth configuration if the scan is inconclusive.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-ST-A L2 · ASVS 5.0: V3, V7, V12, V13 · SSDF: PW.8.2 · CSF 2.0: PR.PS-06
ASC-TST-02¶
API security testing against the API definition · domain TST · activity · owner appsec-governance · review every 12 months
APIs with an OpenAPI definition are tested for OWASP API Top 10 classes (authZ/BOLA, mass assignment, rate limiting) using the definition.
- Rationale: APIs are the dominant attack surface; generic DAST under-tests them.
- Applies when: has_api
- Assessment: automated · evaluator
scan_executed@1· min confidence C2 · evidencescan.api - How we prove it operates: Attested API scan evidence bound to the OpenAPI document digest and deployed release.
- Implementation: Publish OpenAPI in-repo; call security-workflows/api.
- Remediation: Fix findings; add authZ test cases.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-ST-A L2, V-RT-B L2 · ASVS 5.0: V4, V8, V9, V10 · SSDF: PW.8.2 · Other: OWASP API Security Top 10
ASC-TST-03¶
Independent penetration test within period · domain TST · process · owner appsec-governance · review every 12 months
Tier 1 apps have a penetration test annually and after major change; Tier 2 biennially; findings imported.
- Rationale: Expert testing finds business-logic and chained issues tools miss.
- Applies when: deployed
- Assessment: manual · evaluator
manual_attestation@1· min confidence M2 · evidenceassessment.pentest - Parameters:
{valid_days: {'1': 365, '2': 730}} - How we prove it operates: Pen-test record (tester org, scope, dates, report SHA-256 in WORM store, findings imported with source=pentest) recorded by AppSec.
- Implementation: Book via AppSec; provide test environment and accounts.
- Remediation: Remediate findings within SLA; retest.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-ST-B L2 · SSDF: PW.8.2 · CSF 2.0: ID.RA-01
ASC-TST-04¶
Abuse-case tests derived from the threat model · domain TST · activity · owner appsec-governance · review every 12 months
High-rated threats from the threat model have corresponding automated negative/abuse-case tests that run in CI.
- Rationale: Converts design threats into regression-protected tests.
- Applies when: always
- Assessment: automated · evaluator
threat_test_linkage@1· min confidence C2 · evidencetest.security,repo.threat_model - Parameters:
{min_pct_high_threats_tested: 60} - How we prove it operates: JUnit test properties reference threat IDs from threats.yaml; executed and passing on default branch.
- Implementation: Tag tests with a
threatproperty (e.g. TM-07); use security-workflows/test-evidence. - Remediation: Add tests for untested high threats.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-RT-B L2, V-RT-A L3 · SSDF: PW.8.2
ASC-TST-05¶
Security regression tests run in CI · domain TST · activity · owner appsec-governance · review every 12 months
Automated security tests (authN/authZ, input validation, headers) tagged with ASVS IDs run on every change and pass.
- Rationale: Requirements-driven verification that scales.
- Applies when: has_source_code
- Assessment: automated · evaluator
tests_executed@1· min confidence C2 · evidencetest.security - Parameters:
{min_tests: 5} - How we prove it operates: test-evidence workflow extracts JUnit testcases with asvs properties; pass/fail per requirement.
- Implementation: See ASVS implementation guide.
- Remediation: Add or fix tests.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: V-RT-A L2, V-RT-A L3 · ASVS 5.0: V6, V7, V8 · SSDF: PW.8.2
ASC-VUL-01¶
Findings are owned and triaged within SLA · domain VUL · outcome · owner appsec-governance · review every 12 months
Every open finding maps to an application and owner, and P1–P3 findings are triaged (ticketed, false-positive, or excepted) within the triage SLA.
- Rationale: Untriaged findings are invisible risk.
- Applies when: always
- Assessment: automated · evaluator
triage_within_sla@1· min confidence C3 · evidencevuln.posture - Parameters:
{max_breaches: 0} - How we prove it operates: Derived from finding state history and the risk model's triage SLA.
- Implementation: Champion triages from the platform/Jira queue.
- Remediation: Triage overdue findings.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-DM-A L1, I-DM-A L2 · SSDF: RV.2.1 · CSF 2.0: ID.RA-01, ID.RA-06
ASC-VUL-02¶
Vulnerabilities remediated within SLA · domain VUL · outcome · owner appsec-governance · review every 12 months
No P1 or P2 finding past remediation SLA; ≥ 90% of P3 within SLA over trailing 90 days. Remediation is verified by re-scan, not by ticket closure.
- Rationale: Measures what matters — risk reduction speed — without rewarding low detection.
- Applies when: always
- Assessment: automated · evaluator
findings_within_sla@1· min confidence C3 · evidencevuln.posture - Parameters:
{max_overdue: {P1: 0, P2: 0}, p3_within_sla_pct: 90} - How we prove it operates: Finding projection with SLA clock (from risk model version in force at detection); closure requires verification evidence.
- Implementation: Prioritise by platform priority; use exceptions when a fix is genuinely blocked.
- Remediation: Fix or raise an exception.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-DM-A L2, I-DM-A L3 · SSDF: RV.2.2 · CSF 2.0: ID.RA-06
ASC-VUL-03¶
Exceptions are approved, current and within limits · domain VUL · outcome · owner appsec-governance · review every 12 months
All exceptions for the app are approved by the correct approver, within max duration, and not expired; renewals ≤ 2.
- Rationale: Exceptions are legitimate risk decisions only if governed.
- Applies when: always
- Assessment: automated · evaluator
exceptions_governed@1· min confidence C3 · evidencevuln.posture - Parameters:
{max_renewals: 2} - How we prove it operates: Exception records and their approval audit trail; expiry generates a finding automatically (ADR-021).
- Implementation: Use the platform exception workflow; never suppress in tools as a substitute.
- Remediation: Remediate, or renew with fresh approval.
- Exceptions: not permitted
- Mappings: SAMM: G-PC-B L2, I-DM-A L2 · CSF 2.0: ID.RA-07, GV.RM-04
ASC-VUL-04¶
Recurring weakness classes are analysed · domain VUL · process · owner appsec-governance · review every 12 months
Quarterly, the team reviews its top recurring CWE classes (computed by the platform) and records a root-cause action.
- Rationale: Moves from fixing instances to eliminating classes.
- Applies when: always
- Assessment: hybrid · evaluator
periodic_process@1· min confidence M1 · evidenceprocess.review_record - How we prove it operates: Platform pre-generates the recurring-CWE report; the review record (attendees, decisions, linked tickets) is submitted within 120 days of the last.
- Implementation: Run in the team's retrospective with the champion.
- Remediation: Hold the review.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: I-DM-B L2, I-DM-B L3 · SSDF: RV.3.1, RV.3.2, RV.3.3 · CSF 2.0: ID.IM-02
ASC-OPS-01¶
Security-relevant application logs reach the SIEM · domain OPS · activity · owner appsec-governance · review every 12 months
Authentication, authorisation failures, admin actions and security exceptions are logged and delivered to the organization's SIEM (Sentinel, an HTTPS collector such as Splunk HEC, or syslog) with the application identifier; the log source is healthy.
- Rationale: Detection and incident response depend on it.
- Applies when: deployed
- Assessment: automated · evaluator
log_source_healthy@1· min confidence C3 · evidencesiem.log_source_health - Parameters:
{required_event_categories: [authentication], window_hours: 24} - How we prove it operates: Scheduled KQL query via the Log Analytics query API returns events for the app's tag in the window. Reader role created by
modules/sentinel; the app tagging convention is a project task. - Implementation: Use the logging standard; tag logs with the application ID.
- Remediation: Restore the log pipeline.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-IM-A L1, O-IM-A L2 · ASVS 5.0: V16 · CSF 2.0: PR.PS-04, DE.CM-09
ASC-OPS-02¶
Incident response readiness for the application · domain OPS · process · owner appsec-governance · review every 12 months
An app-specific incident runbook (contacts, kill switches, credential rotation steps, data-breach decision points) exists and has been exercised or reviewed in 12 months.
- Rationale: Reduces time to contain.
- Applies when: deployed
- Assessment: manual · evaluator
manual_attestation@1· min confidence T1:M2 / T2:M1 · evidenceassessment.manual_control - How we prove it operates: Runbook link (version-controlled) + exercise record reviewed by SOC/AppSec.
- Implementation: Template in docs/runbooks.
- Remediation: Write/exercise the runbook.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-IM-B L1, O-IM-B L2 · CSF 2.0: RS.MA-01
ASC-OPS-03¶
Cloud posture findings on the application's scopes are within SLA · domain OPS · outcome · owner cloud-security · review every 12 months
High/critical Defender for Cloud / Security Hub findings on subscriptions, resource groups or accounts mapped to the app are remediated within SLA.
- Rationale: Runtime configuration drift is invisible to repo scanning.
- Applies when: has_cloud_scope
- Assessment: automated · evaluator
findings_within_sla@1· min confidence C3 · evidencecloud.posture - Parameters:
{source: [defender, security_hub]} - How we prove it operates: Connector pulls findings scoped by the app's cloud mapping (subscription/RG/tag/account); risk engine assigns SLA.
- Implementation: Map cloud scopes in application.yaml; tag resources with app ID.
- Remediation: Fix configuration; or except with compensating control.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-EM-A L2, O-EM-A L3 · CSF 2.0: PR.PS-01, ID.RA-01
ASC-OPS-04¶
Deployed images and runtimes are patched regularly · domain OPS · outcome · owner appsec-governance · review every 12 months
Every deployed image digest was built within the last 30 days (Tier 1/2) or 90 days (Tier 3), or has no fixable high/critical OS-package vulnerabilities.
- Rationale: Base-image patches only reach production if images are rebuilt and redeployed.
- Applies when: builds_or_deploys_containers, deployed
- Assessment: automated · evaluator
image_patch_age@1· min confidence C2 · evidencedeploy.record,scan.container - Parameters:
{max_age_days: {'1': 30, '2': 30, '3': 90}} - How we prove it operates: deploy.record digests joined to build timestamp (provenance) and container scan results.
- Implementation: Scheduled rebuilds; Renovate/Dependabot for base images.
- Remediation: Rebuild and redeploy.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-EM-B L1, O-EM-B L2 · CSF 2.0: PR.PS-02
ASC-OPS-05¶
Data stores are inventoried, encrypted and backed up per classification · domain OPS · configuration · owner appsec-governance · review every 12 months
Data stores listed in application.yaml match discovered cloud data resources; encryption and backup settings meet the classification baseline.
- Rationale: SAMM Data Protection; prevents shadow data stores.
- Applies when: has_cloud_scope
- Assessment: hybrid · evaluator
data_store_baseline@1· min confidence C1 · evidencecloud.posture,registry.application - How we prove it operates: Azure Resource Graph / AWS Config resource inventory for mapped scopes compared to declared stores; encryption/backup properties checked.
- Implementation: Declare data stores in application.yaml.
- Remediation: Declare or remove undeclared stores; enable backups.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-OM-A L1, O-OM-A L2 · ASVS 5.0: V14 · CSF 2.0: ID.AM-07, PR.DS-01
- Notes: Planned for a later release; depends on reliable cloud-scope mapping.
ASC-OPS-06¶
Retired applications are fully decommissioned · domain OPS · outcome · owner appsec-governance · review every 12 months
Applications with lifecycle_status=retired have repos archived, cloud scopes empty or deleted, secrets revoked, and DNS removed within 90 days.
- Rationale: Abandoned assets are a common breach entry point (dangling DNS, forgotten credentials).
- Applies when: lifecycle_retired
- Assessment: automated · evaluator
decommission_complete@1· min confidence C1 · evidencerepo.access,cloud.posture - Parameters:
{within_days: 90} - How we prove it operates: Repo archived flag; no resources in mapped scopes; no active secrets in mapped vaults.
- Implementation: Follow the decommissioning runbook.
- Remediation: Complete outstanding decommission steps.
- Exceptions: allowed, max days T1:90 / T2:180 / T3:365 / T4:365
- Mappings: SAMM: O-OM-B L1, O-OM-B L2 · CSF 2.0: ID.AM-08