# 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) | | 8 | Unblu Chat Drittanbieter-DSE | Chat-Consent verweist auf Datenschutzerklaerung von unblu.com (Drittanbieter) statt auf EUIPO-eigene Cookie-/Chat-Richtlinie. EUIPO ist Verantwortlicher (Art. 4 Nr. 7 DSGVO), muss eigene DSE bereitstellen. | Art. 13 DSGVO (Informationspflichten), Art. 26 DSGVO (gemeinsame Verantwortlichkeit) | | 9 | Unblu Chat Cookies ohne eigene Rechtsgrundlage | "Unblu-Cookies muessen heruntergeladen werden" — EUIPO delegiert Cookie-Einwilligung an Drittanbieter-DSE statt eigene Rechtsgrundlage zu benennen | § 25 TDDDG / Art. 5(3) ePrivacy-RL | | 10 | Dismiss-by-Click = Consent | Klick neben das Chat-Consent-Fenster wird als "Akzeptieren" gewertet. Versehentlicher Klick ist KEINE aktive Einwilligung. Modal muss echte Wahl erzwingen. | EuGH C-673/17 Planet49 (aktive Handlung), Art. 7(1) DSGVO (Nachweispflicht) | --- ## Befund 2: Unblu Chat Consent (nach Login) Nach Registrierung und Login erscheint ein Chat-Fenster: > "Personenbezogene Daten werden gemaess der Datenschutzerklaerung fuer den Online-Chat > erhoben und verarbeitet. Fuer den Online-Chat muessen Unblu-Cookies heruntergeladen > werden, damit er ordnungsgemaess funktioniert und damit die Chat-Operatoren wissen, > wann Sie zuletzt per Chat mit dem Amt kommuniziert haben. Diese Cookies unterliegen > den Datenschutzbestimmungen des Unblu Chats und werden nur eingesetzt, wenn Sie sich > fuer die Nutzung des Chats entscheiden." > > [Abbrechen] [Akzeptieren] ### Was positiv ist: - Es gibt tatsaechlich einen "Abbrechen"-Button (besser als die Registrierung) - Der Text erklaert den Zweck der Cookies (Chat-Funktionalitaet + Verlauf) ### Was falsch ist: **1. Drittanbieter-DSE statt eigener:** Die Datenschutzerklaerung verlinkt auf unblu.com — aber EUIPO ist der Verantwortliche fuer die Datenverarbeitung, nicht Unblu. Unblu ist Auftragsverarbeiter. Die EUIPO muesste eine eigene Chat-Datenschutzerklaerung haben die beschreibt: - Welche Daten erhoben werden - Rechtsgrundlage (Art. 6(1)(a) Einwilligung) - Speicherdauer - Rechte des Betroffenen - Kontakt zum DSB **2. Klick daneben = Akzeptieren:** Das Chat-Fenster ist NICHT modal — ein Klick auf den Hintergrund neben dem Fenster schliesst es UND wertet dies als Einwilligung. Das verletzt: - **Art. 7(1) DSGVO**: Einwilligung muss nachweisbar sein (versehentlicher Klick ist kein Nachweis) - **EuGH Planet49**: Einwilligung erfordert eine eindeutige bestaetigende Handlung - **EDPB Guidelines 05/2020 Rn. 77**: "Silence, pre-ticked boxes or inactivity should not constitute consent" Ein Klick neben ein Fenster ist "inactivity" im Sinne der EDPB-Leitlinien — keine aktive Entscheidung. **3. "muessen heruntergeladen werden":** Die Formulierung suggeriert technische Notwendigkeit ("muessen"), obwohl die Cookies fuer den Zweck "wann Sie zuletzt per Chat kommuniziert haben" nicht technisch notwendig sind. Das ist eine Dunkle-Muster-Formulierung die den Nutzer zur Zustimmung draengt. --- ## 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" ### 5. Drittanbieter-DSE-Check (NEU — zu implementieren) - Consent-Dialog verweist auf DSE eines Drittanbieters statt auf eigene DSE - Pruefe ob href in Consent-Text auf andere Domain zeigt als die aktuelle Website - Finding: "Consent verweist auf Datenschutzerklaerung von {domain} — Verantwortlicher muss eigene DSE bereitstellen (Art. 13 DSGVO)" ### 6. Modal-Dismiss-Check (NEU — zu implementieren) - Pruefe ob Consent-Dialog durch Klick auf Hintergrund geschlossen wird - Wenn dismiss = accept → Verstoss - Playwright: Klick auf Overlay-Backdrop, pruefe ob Consent gesetzt wurde - Finding: "Consent-Dialog kann durch Klick neben das Fenster geschlossen werden, was als Einwilligung gewertet wird (Art. 7(1) DSGVO, Planet49)" ### 7. Dark-Pattern-Sprache (NEU — zu implementieren) - "muessen heruntergeladen werden" suggeriert technische Notwendigkeit - Pruefe auf Formulierungen die Zwang suggerieren: "muessen", "erforderlich", "notwendig" fuer nicht-essentielle Cookies - Finding: "Formulierung suggeriert technische Notwendigkeit fuer nicht-essentielle Cookies (Dark Pattern, EDPB Guidelines 05/2020 Rn. 70)" --- ## 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