~/blog/consent-mode-is-not-a-consent-gatePOSTED
von Shady Nathan Tawfik · 7. Oktober 2026 · 6 min

Consent Mode ist kein Consent-Gate

Die Website einer Digitalagentur hatte eine aktuelle Consent-Plattform, einen korrekt rendenden Banner und aktivierten Google Consent Mode — und feuerte trotzdem Analytics, Ads, Meta und LinkedIn vor jeder Einwilligung, schrieb Cookies ohne Einwilligung und ohne Secure und ließ das Session-Cookie ungeschützt. Warum Signalisieren kein Blockieren ist und wie der Fix gemessen statt diskutiert wurde.

Interaktiv[blog-2.0]

TL;DR: Die Consent-Plattform war installiert, lizenziert und aktuell. Der Banner rendert. Google Consent Mode war aktiv. Und trotzdem verließ ein frisches Browser-Profil den ersten Seitenaufruf mit _ga, _gcl_au, _fbp und nmstat im Jar — nach Kontakt mit acht Dritt-Anbietern, von denen keiner einen Klick verlangte. Die Plattform lief im Beobachtungsmodus, nicht im Erzwingungsmodus: Consent Mode signalisiert eine Entscheidung, er verhindert nicht das Laden des Tags. Die Abhilfe wurde im Lab-Spiegel desselben Stacks bewiesen: vier Pre-Consent-Feuerungen wurden null.

Die Ausgangslage

Eine mittelgroße Digitalagentur — genau die Art Unternehmen, deren eigene Website als Referenz für die Kunden gelten soll — bat um einen externen Blick auf ihre öffentliche Web-Oberfläche. Kein Penetrationstest, kein Eindringen: eine Black-Box-Prüfung dessen, was ein normaler Besucher (und ein normaler Crawler, und ein normaler Wettbewerber) ohne Anmeldung sehen kann.

Das Perimeter entpuppte sich als langweilig im guten Sinne. Der Reverse-Proxy blockte Dotfiles und Management-Pfade, kein Actuator, kein Jenkins, kein Solr, keine Debug-Konsole, das Zertifikat deckte die komplette Marken-Familie ab, und die Seite war eine Individualentwicklung statt eines Plugin-CMS. Wer das gebaut hat, hat mitgedacht.

Dann startete der Browser-Test, und die Geschichte kippte.

Ich habe alle identifizierenden Informationen entfernt. Das Ziel ist nur über Branche und Technologieklasse beschrieben, alle Tag-IDs sind unkenntlich gemacht, damit das Muster wiederverwendbar bleibt, ohne jemanden zu exponieren.

Das Muster

Die Verwechslung ist verständlich. Eine Consent-Plattform tut zwei grundverschiedene Dinge: Sie erhebt eine Entscheidung und sie erzwingt sie. Banner, Einstellungsdialog, Rechtstexte — das ist die Erhebungshälfte. Die Erzwingungshälfte ist eine Konfiguration: Welcher Dienst darf in welchem Zustand laden, und was passiert mit einem Tag, der noch nicht erlaubt ist.

Hier war die Erzwingungshälfte nie konfiguriert. Jeder Dienst lief effektiv im „Beobachten"-Modus — sichtbar in den Dashboards, gemeldet in den Reports, und trotzdem geladen. Der Banner sah perfekt aus, weil der Banner perfekt war. Er beantwortete eine Frage, auf die niemand reagierte.

Google Consent Mode verdient einen eigenen Absatz, weil er die häufigste Quelle dieses falschen Sicherheitsgefühls ist. Consent Mode übergibt einen Zustand an Googles Tags: „dieser Nutzer hat Analytics abgelehnt", „dieser Nutzer hat Ads abgelehnt". Was Google mit diesem Signal tut, ist Googles Sache — es beeinflusst, wie Daten verwendet werden, nicht ob der Tag läuft. Das Skript lädt, das Cookie wird geschrieben, die Anfrage verlässt den Browser des Besuchers.

Wer Blockieren will, muss dafür sorgen, dass der Tag bis zur Erlaubnis nicht ausgeführt wird. Das ist eine Loader-Entscheidung, keine Signal-Entscheidung.

Der Beleg ist nicht „der Banner sieht gut aus" — es ist ein frisches Profil

Der einzige Test, der etwas beweist, ist ein frisches Browser-Profil, ohne Cache, ohne früheren Consent-Zustand, ohne jede Interaktion, das Netzwerk und Cookie-Jar beim ersten Seitenaufruf beobachtet. Warme Profile und bereits erteilte Einwilligungen verstecken den Defekt vollständig. In unserem Lauf:

  • acht Dritt-Anbieter-Hosts wurden vor jeder Interaktion kontaktiert
  • fünf Tracking-Cookies plus das Session-Cookie der Anwendung wurden gesetzt
  • kein First-Party-Cookie trug Secure — auf einer HTTPS-only-Seite
  • das Session-Cookie war HttpOnly, aber nicht Secure

Der Rest des Perimeters erzählte seine eigene Geschichte

Während der Browser offen war, sammelte die Prüfung außerdem: keine Content-Security-Policy, kein X-Content-Type-Options, keine Permissions-Policy, HSTS ohne includeSubDomains, SPF endend auf ~all und DMARC auf p=quarantine — dazu öffentliche DNS-Verifikations-Records, die den kompletten SaaS-Stack der Agentur enumerierten (zwei Google-Dienste, JetBrains, Miro und ein KI-Anbieter) für jeden, der nachsehen wollte.

TL;DR: The banner rendered, the consent platform was up to date, Google Consent Mode was active — and yet a fresh browser profile left the first page load with analytics, ads, Meta and LinkedIn cookies in the jar. Consent Mode signals; it does not block. The blocking was never configured, so the tags simply ran.

Befunde

SchwereBefundBeleg
HOCHTracking vor Einwilligung: Tag-Manager, Analytics, Ads, Meta-Pixel, LinkedIn Ads, eine Analytics-Suite und ein Video-Embed luden beim ersten AufbauNetzwerk-Capture mit frischem Profil
HOCHCookies ohne Einwilligung geschrieben: _ga, _ga_*, _gcl_au, _fbp, nmstat plus Video- und LinkedIn-CookiesCookie-Dump mit Flags
MITTELKein Secure-Flag auf irgendeinem First-Party-Cookie, inklusive der Anwendungs-SessionCookie-Flags
MITTELFehlende CSP, nosniff, Permissions-Policy, COOP/CORP; HSTS ohne includeSubDomains/preload; veraltetes X-XSS-ProtectionResponse-Header
MITTELSPF-Softfail, DMARC nur Quarantineöffentliches DNS
NIEDRIGrobots.txt, sitemap.xml, security.txt fehlenPfad-Tests
NIEDRIGSaaS-Stack über öffentliche Verifikations-TXT-Records enumerierbaröffentliches DNS
INFOConsent-Plattform vorhanden und rendert — Erzwingung nicht konfiguriertShadow-DOM-Inspektion

Der Angriffspfad

  1. Erst das Profil. Abgesehen von der Consent-Erzwingung liefern die öffentlichen DNS-Records dem Angreifer den Tool-Stack. Danach lautet die Frage nicht „wie komme ich rein", sondern „welcher dieser fünf Anbieter ist das schwächste Glied".
  2. Die Marke fälschen. Mit SPF auf Softfail und DMARC auf Quarantine überstehen gefälschte Rechnungs- oder Bewerbungsmails im Namen der Agentur die meisten Filter — und die Postfächer einer Agentur sind voll mit Kundendokumenten.
  3. Auf die Session warten. Das Session-Cookie reist ohne Secure. Eine einzige Klartext-Anfrage irgendwo auf dem Pfad — ein vertipptes http://, ein Captive Portal, ein altes Lesezeichen — genügt, um es abzugreifen.
  4. Den Browser vorbereiten. Keine CSP und kein nosniff ist für sich genommen kein Exploit; es ist das Fehlen des Sicherheitsnetzes, das aus einem injizierten String eine Ausführung macht.
  5. Dann leise das Tracking. Acht Dritt-Anbieter-Hosts erhalten Besucherkennungen — inklusive Bewerbern auf den Karriereseiten — vor der Einwilligung. Nach TTDSG § 25 und DSGVO Art. 6 ist das keine Formalie; es ist der Befund, mit dem eine Aufsichtsbehörde anfängt.

Reproduzieren — und den Fix beweisen

Befunde, die sich nicht reproduzieren lassen, sind Meinungen. Also wurde derselbe Stack als Lab-Spiegel nachgebaut: eine Mock-Anwendung hinter einem Reverse-Proxy, ein Consent-Gate mit Tag-Loader und ein serverseitiger Zähler, der festhält, welcher Tag in welchem Consent-Zustand gefeuert hat.

SzenarioGemessenes Ergebnis
Ungehärteter Build, keine Interaktion4 Tag-Feuerungen vor Einwilligung (Analytics, Ads, Meta, LinkedIn)
Gehärteter Build, keine Interaktion0 Feuerungen
Gehärteter Build, nach Opt-in0 vor Einwilligung / 4 nach Einwilligung
Session-CookieHttpOnly → HttpOnly; Secure; SameSite=Lax
Härtende Header0 → CSP + nosniff (+ Permissions-Policy, HSTS preload)

Das ist der Unterschied zwischen „wir empfehlen Blockieren" und „Blockieren erzeugt genau diesen Zustand, hier ist der Zähler".

So erkennen Sie es im eigenen Bestand

  • Frisch-Profil-Test bei jedem Release, idealerweise in der CI: Seite mit sauberem Profil laden und den Build fehlschlagen lassen, wenn vor der Einwilligung ein Dritt-Anbieter-Host kontaktiert wird.
  • Consent-Plattform: auf Dienste reporten, die konfiguriert sind, aber nie blockieren. Ein Dienst, der nur in der Beobachten-Spalte auftaucht, ist der Defekt.
  • Cookie-Audit: Secure auf allen First-Party-Cookies erzwingen und jedes Tracking-Cookie vor Opt-in als Release-Blocker behandeln.
  • Header-Basislinie: CSP, nosniff, Permissions-Policy, HSTS mit includeSubDomains — als Pipeline-Gate prüfen, nicht als PDF.
  • DNS-Review quartalsweise: SPF/DMARC-Posture und die wachsende Liste der Vendor-Verifikations-Records.

So beheben Sie es (in dieser Reihenfolge)

  1. P0 — Erzwingen statt beobachten. In der Consent-Plattform jeden nicht-essenziellen Dienst auf Blocking stellen und den Tag-Manager nur über den kontrollierten Modus laden. Mit frischem Profil verifizieren: null Dritt-Anbieter-Requests vor Opt-in.
  2. P0 — Datenschutzerklärung an die tatsächlichen Datenflüsse anpassen, inklusive Übermittlungsgrundlage für US-Dienste.
  3. P1 — Cookies. Secure auf allen First-Party- und Session-Cookies; SameSite prüfen.
  4. P1 — Header. CSP (Start report-only), nosniff, Permissions-Policy, COOP/CORP, HSTS auf includeSubDomains; preload.
  5. P1 — E-Mail. SPF auf -all, DMARC auf p=reject, sobald die Reports sauber bleiben.
  6. P2 — Hygiene. robots.txt, sitemap.xml, security.txt; ungenutzte Verifikations-Records entfernen; Video-Embeds auf youtube-nocookie oder Click-to-Load umstellen.

Once an attacker gains access, they can perform the following actions:

Track every visitor — including job applicants — across Google, Meta, LinkedIn and an analytics suite without consent: profiling plus GDPR fine risk
Forge mails in the agency name (SPF softfail, DMARC quarantine only) — invoice and application phishing against clients and HR
Harvest the session cookie off insecure channels (no Secure flag) and enter internal areas as an employee
Prepare clickjacking and content injection on forms and login — no CSP, no nosniff
Map the entire SaaS and tool stack from public verification records and plan targeted supply-chain attacks
Prepare SSL stripping across the brand family — HSTS without includeSubDomains or preload

Fazit

Eine Consent-Plattform ist kein Compliance-Schalter. Sie ist ein Loader — und ein Loader blockiert nur das, was man ihm sagt. Der Banner rendert weiterhin wunderschön, während jeder Tag, den man zu konfigurieren vergessen hat, daran vorbeifährt. Der einzige ehrliche Test ist ein frisches Profil ohne Interaktion, und der einzige ehrliche Fix ist einer, dessen Ergebnis man zählen kann.

Shady Nathan Tawfik

Gründer & Cyber IT Security Engineer in Bielefeld. Offensive Security, Audits und Fullstack-Entwicklung. Mehr auf

Nur zu Bildungszwecken. Alle reproduzierbaren Befehle zielen auf meine eigene Lab-Umgebung (localhost), nie auf ein laufendes System. © 2026