diff --git a/zeroclaw/tests/reference-cases/README.md b/zeroclaw/tests/reference-cases/README.md new file mode 100644 index 0000000..bcdc5f8 --- /dev/null +++ b/zeroclaw/tests/reference-cases/README.md @@ -0,0 +1,13 @@ +# Compliance Agent — Reference Test Cases + +Reale Befunde von echten Websites. Jeder Case dokumentiert: +- Was gefunden wurde +- Welche Rechtsgrundlage verletzt ist +- Was der Agent erkennen sollte +- Wie die Korrektur aussehen muss + +## Cases + +| Case | Website | Typ | Schwere | +|------|---------|-----|---------| +| [EUIPO Registration](euipo-registration-consent.md) | login.euipo.europa.eu | Consent-Text + Koppelungsverbot | HIGH | diff --git a/zeroclaw/tests/reference-cases/euipo-registration-consent.md b/zeroclaw/tests/reference-cases/euipo-registration-consent.md new file mode 100644 index 0000000..5153d5b --- /dev/null +++ b/zeroclaw/tests/reference-cases/euipo-registration-consent.md @@ -0,0 +1,127 @@ +# Test Case: EUIPO Registration — Consent-Formulierung + +**Quelle:** EU-Behoerde (Amt der Europaeischen Union fuer geistiges Eigentum) +**URL:** https://login.euipo.europa.eu (Registrierungsseite) +**Entdeckt:** 2026-05-04 +**Typ:** Consent-Text-Fehler + Koppelungsverbot +**Schwere:** HIGH + +--- + +## Befund + +Auf der Registrierungsseite des EUIPO steht (vollstaendiger Text): + +> "Wenn Sie auf Anmelden klicken, stimmen Sie unseren zu +> Nutzungsbedingungen und Datenschutz-Bestimmungen gelesen und verstanden +> Registrieren +> Haben Sie bereits ein Konto? Anmelden +> Datenschutz-Bestimmungen gelesen und verstanden +> Nutzungsbedingungen +> Deutsch" + +Der Text "Datenschutz-Bestimmungen gelesen und verstanden" und +"Nutzungsbedingungen" erscheinen als separate Links unterhalb des +Registrieren-Buttons — vermutlich soll der obere Satz darauf verweisen, +aber die Verknuepfung ist kaputt (Links nach dem Button statt inline). + +### Fehler + +| # | Typ | Beschreibung | Rechtsgrundlage | +|---|-----|-------------|-----------------| +| 1 | Sprachfehler | Satz grammatisch unvollstaendig ("stimmen Sie unseren zu" ergibt keinen Sinn) | Art. 12(1) DSGVO (klare und verstaendliche Sprache) | +| 2 | Zwangs-Consent | Login = automatische Zustimmung, kein separater Opt-in | Art. 7(4) DSGVO (Koppelungsverbot) | +| 3 | Keine Ablehnung | Kein Button um NICHT zuzustimmen (nur Login oder Seite verlassen) | Art. 7(3) DSGVO (Widerruf so einfach wie Erteilung) | +| 4 | Keine Granularitaet | Nutzungsbedingungen und Datenschutz werden in einer Zustimmung zusammengefasst | EDPB Guidelines 05/2020 Rn. 43 (Granularitaet) | +| 5 | Kein aktiver Consent | Kein Checkbox oder aktive Handlung — blosse Nutzung gilt als Zustimmung | EuGH C-673/17 Planet49 (aktive Einwilligung) | +| 6 | Kaputtes Link-Layout | Links zu DSE und Nutzungsbedingungen erscheinen NACH dem Registrieren-Button statt inline im Consent-Text — der Satz oben verweist ins Leere | Art. 12(1) DSGVO (leicht zugaenglich) | +| 7 | Uebersetzungsfehler | Offensichtlich maschinell aus EN uebersetzt ("stimmen Sie unseren zu" ist kein korrektes Deutsch) — widerspricht Anforderung an Muttersprache des Nutzers | Art. 12(1) DSGVO (klare und einfache Sprache) | + +--- + +## Erwartete Agent-Erkennung + +Der Compliance Agent sollte folgende Checks ausfuehren: + +### 1. Consent-Text-Analyse (consent_scanner.py) +- `banner_text_violations`: Grammatisch fehlerhafte Consent-Formulierung erkennen +- Severity: HIGH +- Finding: "Consent-Text ist grammatisch unvollstaendig und nicht verstaendlich (Art. 12(1) DSGVO)" + +### 2. Koppelungs-Check (authenticated_scanner.py) +- Login-Button darf nicht gleichzeitig Consent erteilen +- Finding: "Einwilligung wird an Registrierung/Login gekoppelt (Art. 7(4) DSGVO)" + +### 3. Ablehn-Button-Check (consent_scanner.py) +- `reject_button_check`: Kein gleichwertiger Ablehn-Button vorhanden +- Finding: "Keine Moeglichkeit die Einwilligung abzulehnen" + +### 4. Granularitaets-Check (NEU — zu implementieren) +- Nutzungsbedingungen ≠ Datenschutz-Einwilligung +- Muessen separat zustimmbar sein +- Finding: "Nutzungsbedingungen und Datenschutz in einer Zustimmung zusammengefasst" + +--- + +## Korrekturvorschlag + +### Korrekte Formulierung + +``` +☐ Ich habe die Nutzungsbedingungen gelesen und stimme ihnen zu. (Pflichtfeld) + +☐ Ich habe die Datenschutzerklaerung gelesen und erklaere mich mit der + Verarbeitung meiner personenbezogenen Daten gemaess Art. 6(1)(a) DSGVO + einverstanden. (Freiwillig — Registrierung auch ohne moeglich) + +[Registrieren] [Abbrechen] +``` + +### Warum korrekt: +- Zwei separate Checkboxen (Granularitaet) +- Aktive Handlung noetig (Checkbox ankreuzen, nicht nur Button klicken) +- Datenschutz-Consent ist freiwillig (Koppelungsverbot) +- Klare Sprache, vollstaendige Saetze +- Abbrechen-Button als Alternativhandlung + +--- + +## Technische Implementierung als Agent-Check + +### Neuer Check: `consent_text_quality` + +```python +# In consent_scanner.py oder neuer Check +CONSENT_TEXT_PATTERNS = [ + # Zwangs-Consent bei Login/Registrierung + r"(?:klicken|anmelden|registrieren).*stimmen\s+(?:Sie|sie|du).*zu", + r"(?:login|sign.?up|register).*(?:agree|accept|consent)", + # Grammatisch unvollstaendige Saetze + r"stimmen\s+(?:Sie|sie|du)\s+unseren?\s+zu", + # Fehlende Granularitaet + r"(?:nutzungsbedingungen|terms).*(?:und|and).*(?:datenschutz|privacy).*(?:zu|agree|accept)", +] + +MISSING_ELEMENTS = [ + "checkbox", # Aktive Zustimmung (nicht nur Button) + "button.*ablehnen", # Ablehn-Option + "button.*cancel", # Abbrechen-Option +] +``` + +### Neuer Check: `coupling_prohibition` + +Prueft ob Einwilligung an Registrierung/Login/Kauf gekoppelt ist: +- Login-Button text enthalt "zustimmen/agree/accept" → Koppelungsverbot +- Kein separater Consent-Checkbox vor Login-Button → Koppelungsverbot +- Einwilligung als Pflichtfeld bei Registrierung → Koppelungsverbot (wenn Service auch ohne nutzbar) + +--- + +## Relevanz + +Dieser Case ist besonders relevant weil: +1. **EU-Behoerde** — wenn selbst das EUIPO es falsch macht, wie sollen KMUs es richtig machen? +2. **OIDC-Registrierung** — sehr haeufiges Pattern bei SaaS-Produkten +3. **Mehrsprachig** — der deutsche Text ist offensichtlich schlecht uebersetzt +4. **Systemisch** — WSO2 Identity Server Templates enthalten dieses Pattern standardmaessig