Die Anzeigenverifikation ist kaputt. Ein Branchenaudit aus dem Jahr 2023 ergab, dass 60–80 % der programmatischen Anzeigenimpressionen, die über große Ad-Exchanges ausgeliefert werden, gegenüber Verifikations-Bots andere Creatives zeigen als gegenüber echten Nutzern. Das ist Cloaking – und es untergräbt jeden Brand-Safety-Bericht, den Sie je gelesen haben. Die Lösung besteht darin, den Verifikations-Crawler wie einen Angreifer zu behandeln: Leiten Sie ihn durch einen HTTP-Proxy, variieren Sie seinen Fingerabdruck und vergleichen Sie den gerenderten Inhalt mit einer bekannten, sicheren Baseline.
Wie Cloaking seine Ziele auswählt
Cloaking stützt sich auf drei Signale: User-Agent, X-Forwarded-For (oder direkte IP) und Referer. Ein bösartiger Ad-Server untersucht die eingehende Anfrage und entscheidet, ob der Besucher ein Verifikations-Bot oder ein Mensch ist. Bots – wie die von Moat, Integral Ad Science oder DoubleVerify – senden vorhersagbare Header. Der Server liefert dann ein sauberes, markensicheres Creative an den Bot und ein bösartiges oder unangemessenes Creative an alle anderen. Die Diskrepanz bleibt für das Dashboard des Verifikationsdienstes unsichtbar.
Zu den realen Beispielen gehören Inhalte für Erwachsene, politische Propaganda oder Malware-Weiterleitungen, die nur mobilen Nutzern in bestimmten Regionen ausgeliefert werden. Der Angreifer prüft User-Agent auf „Mozilla/5.0 (Linux; Android …)“ und X-Forwarded-For auf einen IP-Bereich, der zu einem bekannten Verifikationsanbieter gehört. Stimmt die IP überein, ist die Anzeige sicher. Wenn nicht, erhält der Nutzer die Schadsoftware.
Einsatz eines MITM-Proxys zur Erkennung von Abweichungen
Die zuverlässigste Erkennungsmethode besteht darin, einen eigenen Verifikations-Crawler durch einen transparenten HTTP-Proxy – mitmproxy oder Burp Suite – laufen zu lassen und die Antwort mit einer Kontrollanfrage ohne Proxy zu vergleichen. Der Proxy ermöglicht es Ihnen, den rohen Antworttext zu erfassen und Header in Echtzeit zu modifizieren. Sie können dieselbe Anfrage mit einem anderen User-Agent oder X-Forwarded-For wiederholen und sehen, ob der Ad-Server das Creative ändert.
Hier ist ein minimales mitmproxy-Skript, das Abweichungen zwischen zwei Anfragen an dieselbe URL mit verschiedenen User-Agents protokolliert:
# save as check_cloak.py
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
if "adserver.example.com" in flow.request.pretty_host:
ua = flow.request.headers.get("User-Agent", "")
if "Android" in ua:
flow.request.headers["X-Forwarded-For"] = "1.2.3.4" # bot IP
else:
flow.request.headers["X-Forwarded-For"] = "5.6.7.8" # user IP
Führen Sie es mit mitmproxy -s check_cloak.py --listen-port 8080 aus und richten Sie dann Ihren Browser oder curl auf den Proxy. Vergleichen Sie die Antworttexte – unterscheiden sich HTML, Bilder oder JavaScript, haben Sie ein gecloaktes Creative gefunden.
Geozielgerichtetes Crawlen mit Proxy-Rotation
Cloaking nutzt häufig GeoIP als zusätzliches Unterscheidungsmerkmal. Eine Anzeige kann ein sauberes Creative für Anfragen aus den USA ausliefern, aber für Nutzer in Südostasien oder Osteuropa auf ein bösartiges umschalten. Um dies zu erkennen, müssen Sie dieselbe Anzeigen-URL von mehreren geografischen Endpunkten aus crawlen. Ein Pool von Residential-Proxies (z. B. BrightData, Oxylabs) oder eine SOCKS5-Proxy-Kette ermöglicht es Ihnen, X-Forwarded-For und die TCP-Quell-IP gleichzeitig zu setzen.
Verwenden Sie curl mit einem Proxy und benutzerdefinierten Headern, um einen mobilen Nutzer in einer Zielregion zu simulieren:
curl -x socks5://user:pass@proxy-us-east:1080 \
-H "User-Agent: Mozilla/5.0 (Linux; Android 13; Pixel 7)" \
-H "X-Forwarded-For: 203.0.113.50" \
-H "Referer: https://example.com/article" \
-o response_us.html \
https://adserver.example.com/ad
curl -x socks5://user:pass@proxy-vietnam:1080 \
-H "User-Agent: Mozilla/5.0 (Linux; Android 13; Pixel 7)" \
-H "X-Forwarded-For: 42.112.0.1" \
-H "Referer: https://example.com/article" \
-o response_vn.html \
https://adserver.example.com/ad
Vergleichen Sie die beiden Dateien. Jeder Unterschied in den <script>-Tags oder den src-Attributen der Bilder deutet auf geografisches Cloaking hin.
Unterschiede zwischen mobilen und Desktop-Creatives
Cloaking zielt oft auf mobilen Traffic ab, weil mobile Nutzer seltener Netzwerkanfragen überprüfen. Verifikations-Crawler, die nur Desktop-Browser nachahmen, übersehen dies völlig. Sie müssen Anfragen mit beiden User-Agent-Strings senden und die Antworten vergleichen. Ein häufiges Muster: Die Desktop-Antwort enthält ein Standard-300x250-Banner, während die mobile Antwort ein Fullscreen-Interstitial lädt, das auf eine Phishing-Seite weiterleitet.
Verwenden Sie ein Tool wie diff oder jq, um JSON-Antworten zu vergleichen. Für HTML nutzen Sie htmlq oder pup, um bestimmte Elemente zu extrahieren. Der Schlüssel liegt darin, den Vergleich über eine Matrix von User-Agents, IP-Geos und Referrern zu automatisieren. Ein von mir entwickeltes Produktionssystem führt 16 parallele Anfragen pro Anzeigeneinheit durch und markiert jede Abweichung, die eine Byte-Größenschwelle von 5 % überschreitet.
Abwägungen und Einschränkungen
Dieser Ansatz ist nicht perfekt. Ad-Server können Proxy-IP-Bereiche erkennen und saubere Creatives an bekannte Proxy-Ausgänge ausliefern – genauso wie sie Verifikations-Bots erkennen. Die Rotation von Residential-Proxies hilft, erhöht aber Latenz und Kosten. Zudem ist manches Cloaking zeitbasiert: Das bösartige Creative erscheint erst nach einer Verzögerung oder nach einem JavaScript-Ereignis, das eine einfache curl-Anfrage nicht auslösen kann. In solchen Fällen benötigen Sie einen Headless-Browser (Puppeteer, Playwright) hinter dem Proxy, was die Komplexität und die Erkennbarkeit des Fingerabdrucks erhöht.
Dennoch gilt das Kernprinzip: Wenn Sie nicht dieselbe Antwort über eine vielfältige Menge von Client-Fingerabdrücken reproduzieren können, ist die Anzeige nicht vertrauenswürdig. HTTP-Proxys geben Ihnen die Kontrolle, diese Fingerabdrücke programmatisch zu erstellen. Beginnen Sie mit einem einfachen mitmproxy-Skript und ein paar Proxy-Endpunkten. Das allein wird die Mehrheit der einfachen Cloaking-Kampagnen aufdecken – und es kostet nichts außer ein paar Zeilen Python.