0837680e03
Finding 8: Unblu chat consent links to third-party DSE (unblu.com) instead of EUIPO's own privacy policy (Art. 13 DSGVO) Finding 9: Cookie consent delegated to third-party terms without own legal basis (§25 TDDDG) Finding 10: Click-outside-dialog = accept — accidental click counts as consent (Planet49, Art. 7(1) DSGVO) New planned agent checks: - Drittanbieter-DSE-Check: detect consent linking to external DSE - Modal-Dismiss-Check: Playwright test if backdrop click = consent - Dark-Pattern-Sprache: detect "muessen/erforderlich" for non-essential cookies Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
197 lines
9.2 KiB
Markdown
197 lines
9.2 KiB
Markdown
# 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
|