diff --git a/control-pipeline/tests/golden_controls.yaml b/control-pipeline/tests/golden_controls.yaml new file mode 100644 index 0000000..c4e3450 --- /dev/null +++ b/control-pipeline/tests/golden_controls.yaml @@ -0,0 +1,353 @@ +# Golden Test Suite v1 — 40 Regression Tests for Pass 0b Pipeline +# Tests atomic control generation quality, deduplication, and classification. +version: "1.0" +purpose: "Regression tests for obligation-to-atomic-control pipeline" + +global_quality_gates: + max_controls_per_single_obligation: 6 + max_duplicate_title_count: 1 + truncated_titles_allowed: false + evidence_as_atomic_control_allowed: false + framework_container_as_atomic_allowed: false + composite_control_as_atomic_allowed: false + +tests: + + # A. Duplicate Explosion (5) + + - id: GT-DEDUPE-001 + name: API Rate Limiting duplicates merge + category: duplicate_explosion + input: "Rate-Limiting für alle API-Endpunkte einführen." + expected: + create: ["Rate-Limiting für API-Endpunkte technisch durchgesetzt"] + max_duplicate_title_count: 1 + + - id: GT-DEDUPE-002 + name: Payload limit duplicate variants merge + category: duplicate_explosion + input: "Maximale Payload-Größen definieren und technisch durchsetzen." + expected: + create: ["Maximale Payload-Größen definiert", "Payload-Grenzen technisch durchgesetzt"] + max_duplicate_title_count: 1 + + - id: GT-DEDUPE-003 + name: Session cookie duplicate variants merge + category: duplicate_explosion + input: "Session-Cookies müssen Secure, HttpOnly und SameSite setzen." + expected: + create: ["Sichere Cookie-Attribute für Session-Cookies gesetzt"] + max_duplicate_title_count: 1 + + - id: GT-DEDUPE-004 + name: MFA repeated wording merges + category: duplicate_explosion + input: "Privilegierte Accounts müssen MFA nutzen. MFA ist für Administrationskonten verpflichtend." + expected: + create: ["MFA für privilegierte Accounts aktiviert"] + max_duplicate_title_count: 1 + + - id: GT-DEDUPE-005 + name: SBOM variants merge + category: duplicate_explosion + input: "Ein SBOM ist zu führen. Ein Komponentenverzeichnis ist zu pflegen." + expected: + create: ["Verzeichnis aller Drittkomponenten geführt"] + max_duplicate_title_count: 1 + + # B. Compound Action Split (5) + + - id: GT-SPLIT-001 + name: Define and enforce API payload limits + category: compound_action_split + input: "Maximale Payload-Größen für API-Anfragen und -Antworten definieren und technisch durchsetzen." + expected: + create: + - {action_type: define, object: api_payload_limits} + - {action_type: implement, object: api_payload_enforcement} + + - id: GT-SPLIT-002 + name: Create and implement maintenance policy + category: compound_action_split + input: "Eine Wartungsrichtlinie ist zu erstellen und zu implementieren." + expected: + create: ["Wartungsrichtlinie definiert", "Wartungsrichtlinie umgesetzt"] + + - id: GT-SPLIT-003 + name: Identify assess remediate monitor vulnerabilities + category: compound_action_split + input: "Schwachstellen in Drittkomponenten sind zu identifizieren, zu bewerten, zu adressieren und zu überwachen." + expected: + create: + - "Schwachstellen in Drittkomponenten identifiziert" + - "Schwachstellen in Drittkomponenten bewertet" + - "Schwachstellen in Drittkomponenten behandelt" + - "Schwachstellen in Drittkomponenten überwacht" + + - id: GT-SPLIT-004 + name: Report and document incident + category: compound_action_split + input: "Sicherheitsvorfälle sind zu melden und zu dokumentieren." + expected: + create: ["Sicherheitsvorfälle gemeldet"] + evidence_attach: ["Incident-Dokumentation"] + + - id: GT-SPLIT-005 + name: Test and validate control + category: compound_action_split + input: "Rate-Limits und Timeouts sind zu testen und zu validieren." + expected: + create: ["Rate-Limits und Timeouts getestet", "Rate-Limits und Timeouts validiert"] + + # C. Negative Obligations (5) + + - id: GT-NEG-001 + name: Sensitive data not in tokens or URLs + category: negative_obligation_handling + input: "Session-Management-Mechanismen dürfen keine sensiblen Daten im Token oder in der URL übertragen." + expected: + create: ["Sensible Daten nicht in Session-Token oder URLs übertragen"] + forbidden: ["sensible Daten im Token umgesetzt"] + + - id: GT-NEG-002 + name: SMS OTP excluded + category: negative_obligation_handling + input: "SMS-basierte OTP sind für privilegierte Accounts nicht zulässig." + expected: + create: ["SMS-OTP für privilegierte Accounts ausgeschlossen"] + action_type: exclude + + - id: GT-NEG-003 + name: Assertion reuse prevented + category: negative_obligation_handling + input: "Assertions bei föderierter Re-Authentifizierung dürfen nicht wiederverwendet werden." + expected: + create: ["Wiederverwendung föderierter Assertions verhindert"] + action_type: prevent + + - id: GT-NEG-004 + name: No weak crypto + category: negative_obligation_handling + input: "Veraltete kryptografische Algorithmen dürfen nicht verwendet werden." + expected: + create: ["Veraltete kryptografische Algorithmen ausgeschlossen"] + action_type: exclude + + - id: GT-NEG-005 + name: No secrets in logs + category: negative_obligation_handling + input: "Geheimnisse dürfen nicht in Logs gespeichert werden." + expected: + create: ["Geheimnisse in Logs verhindert"] + action_type: prevent + + # D. Container Detection (5) + + - id: GT-CONTAINER-001 + name: Secure session management is composite + category: container_control_detection + input: "Sichere Sitzungsverwaltung muss umgesetzt werden." + expected: + routing_type: composite + atomic_control_created: false + + - id: GT-CONTAINER-002 + name: Token protection is composite + category: container_control_detection + input: "Token-Schutz muss umgesetzt werden." + expected: + routing_type: composite + atomic_control_created: false + + - id: GT-CONTAINER-003 + name: Third-party due diligence is composite + category: container_control_detection + input: "Sorgfaltspflichten für Drittkomponenten müssen umgesetzt werden." + expected: + routing_type: composite + atomic_control_created: false + + - id: GT-CONTAINER-004 + name: AI risk management system is composite + category: container_control_detection + input: "Ein Risikomanagementsystem für KI-Systeme muss eingerichtet und betrieben werden." + expected: + routing_type: composite + decompose_required: true + + - id: GT-CONTAINER-005 + name: Secure development lifecycle is composite + category: container_control_detection + input: "Ein sicherer Softwareentwicklungsprozess ist umzusetzen." + expected: + routing_type: composite + decompose_required: true + + # E. Framework Decomposition (5) + + - id: GT-FRAMEWORK-001 + name: CSA CCM AIS decomposes + category: framework_decomposition + input: "Die CCM-Praktiken für Application and Interface Security müssen implementiert werden." + expected: + routing_type: framework_container + atomic_control_created_from_container_directly: false + + - id: GT-FRAMEWORK-002 + name: OWASP ASVS V3 decomposes + category: framework_decomposition + input: "OWASP ASVS V3 Session Management Anforderungen sind umzusetzen." + expected: + routing_type: framework_container + + - id: GT-FRAMEWORK-003 + name: NIST IA family decomposes + category: framework_decomposition + input: "NIST IA-Anforderungen zur Identifikation und Authentisierung sind umzusetzen." + expected: + routing_type: framework_container + + - id: GT-FRAMEWORK-004 + name: OWASP API6 resource consumption decomposes + category: framework_decomposition + input: "OWASP API6 Anforderungen zu unrestricted resource consumption sind umzusetzen." + expected: + routing_type: framework_container + + - id: GT-FRAMEWORK-005 + name: Framework domain not direct atomic + category: framework_decomposition + input: "Alle Controls der Kategorie Access Control müssen implementiert werden." + expected: + atomic_control_created_from_container_directly: false + + # F. Evidence Leakage (5) + + - id: GT-EVIDENCE-001 + name: SBOM evidence not duplicate control + category: evidence_not_control + input: "Ein SBOM-Nachweis muss vorliegen." + expected: + classification: evidence + new_master_control_created: false + + - id: GT-EVIDENCE-002 + name: Screenshot is evidence + category: evidence_not_control + input: "Ein Screenshot der MFA-Konfiguration ist vorzulegen." + expected: + classification: evidence + new_master_control_created: false + + - id: GT-EVIDENCE-003 + name: Audit report is evidence + category: evidence_not_control + input: "Ein Auditbericht zur Zugriffskontrolle muss vorhanden sein." + expected: + classification: evidence + new_master_control_created: false + + - id: GT-EVIDENCE-004 + name: Certification is evidence + category: evidence_not_control + input: "Eine Zertifizierung der Komponente ist nachzuweisen." + expected: + classification: evidence + new_master_control_created: false + + - id: GT-EVIDENCE-005 + name: Jira ticket export is evidence + category: evidence_not_control + input: "JIRA-Tickets zur Behebung nicht konformer Accounts müssen exportiert werden." + expected: + classification: evidence + new_master_control_created: false + + # G. Scope Dimension (5) + + - id: GT-SCOPE-001 + name: Confidentiality actor scopes stay separate + category: scope_dimension + input: + - "Mitarbeiter müssen Vertraulichkeit wahren." + - "Unterauftragnehmer müssen Vertraulichkeit wahren." + - "Externe Stellen müssen Vertraulichkeit wahren." + expected: + master_controls_count: 3 + + - id: GT-SCOPE-002 + name: Impartiality organization vs assessment + category: scope_dimension + input: + - "Unparteilichkeit muss in Leitlinien verankert sein." + - "Unparteilichkeit muss bei Konformitätsbewertungen sichergestellt sein." + expected: + master_controls_count: 2 + + - id: GT-SCOPE-003 + name: Provider size and AI complexity separate + category: scope_dimension + input: + - "Verfahren müssen die Größe des Anbieters berücksichtigen." + - "Verfahren müssen die Komplexität des KI-Systems berücksichtigen." + expected: + master_controls_count: 2 + + - id: GT-SCOPE-004 + name: Third-party and open-source components separate + category: scope_dimension + input: + - "Drittkomponenten müssen geprüft werden." + - "Open-Source-Komponenten müssen separat geprüft werden." + expected: + master_controls_count: 2 + + - id: GT-SCOPE-005 + name: Admin accounts and all users do not collapse + category: scope_dimension + input: + - "Privilegierte Accounts müssen MFA verwenden." + - "Alle Nutzer müssen MFA verwenden." + expected: + master_controls_count: 2 + + # H. Title Quality (5) + + - id: GT-TITLE-001 + name: No truncated titles + category: title_quality + input: "Ressourcenkontingente für kostenpflichtige Drittanbieter-API-Integrationen definieren und überwachen." + expected: + truncated_title_allowed: false + forbidden_title_endings: ["defin", "überw"] + + - id: GT-TITLE-002 + name: Legal disclosure title safe + category: title_quality + input: "Informationen dürfen nur offengelegt werden, wenn dies gesetzlich erforderlich ist." + expected: + create: ["Gesetzlich erforderliche Offenlegung kontrolliert"] + forbidden: ["Offenlegung erlangter Informationen"] + + - id: GT-TITLE-003 + name: No generic implemented suffix for prohibitions + category: title_quality + input: "Session-IDs dürfen nicht in URLs oder Logs erscheinen." + expected: + create: ["Session-IDs in URLs oder Logs verhindert"] + forbidden: ["Session-IDs in URLs oder Logs umgesetzt"] + + - id: GT-TITLE-004 + name: German title normalization + category: title_quality + input: "maximale Payload-Größen für API-Anfragen definieren." + expected: + canonical_title: "Maximale Payload-Größen definiert" + + - id: GT-TITLE-005 + name: No broad object as atomic title + category: title_quality + input: "Token-Schutz muss umgesetzt werden." + expected: + forbidden: ["Token-Schutz umgesetzt"] + routing_type: composite