La vérification des publicités est défaillante. Un audit sectoriel de 2023 a révélé que 60 à 80 % des impressions publicitaires programmatiques diffusées via les principales plateformes d'échange présentent des créations différentes aux bots de vérification qu'aux utilisateurs réels. C'est ce qu'on appelle le cloaking — et cela remet en cause tous les rapports de sécurité de marque que vous avez jamais lus. La solution consiste à traiter le robot de vérification comme un attaquant : le faire passer par un proxy HTTP, faire varier son empreinte numérique, et comparer le contenu rendu à une référence connue comme sûre.
Comment le cloaking sélectionne ses cibles
Le cloaking repose sur trois signaux : User-Agent, X-Forwarded-For (ou l'IP directe), et Referer. Un serveur publicitaire malveillant inspecte la requête entrante et décide si le visiteur est un bot de vérification ou un humain. Les bots — comme ceux de Moat, Integral Ad Science ou DoubleVerify — envoient des en-têtes prévisibles. Le serveur sert alors une création propre et sûre pour la marque au bot, et une création malveillante ou inappropriée à tous les autres. L'écart est invisible dans le tableau de bord du vérificateur.
Les exemples concrets incluent du contenu pour adultes, de la propagande politique ou des redirections vers des malwares, servis uniquement aux utilisateurs mobiles dans des zones géographiques spécifiques. L'attaquant vérifie User-Agent pour « Mozilla/5.0 (Linux; Android …) » et X-Forwarded-For pour une plage IP appartenant à un fournisseur de vérification connu. Si l'IP correspond, la publicité est sûre. Sinon, l'utilisateur reçoit la charge utile.
Utiliser un proxy MITM pour détecter les écarts
La méthode de détection la plus fiable consiste à exécuter votre propre robot de vérification via un proxy HTTP transparent — mitmproxy ou Burp Suite — et à comparer la réponse avec une requête de contrôle envoyée sans le proxy. Le proxy vous permet de capturer le corps brut de la réponse et de modifier les en-têtes en temps réel. Vous pouvez rejouer la même requête avec un User-Agent ou X-Forwarded-For différent et voir si le serveur publicitaire change la création.
Voici un script mitmproxy minimal qui enregistre les écarts entre deux requêtes vers la même URL avec des user‑agents différents :
# 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
Exécutez-le avec mitmproxy -s check_cloak.py --listen-port 8080, puis pointez votre navigateur ou curl vers le proxy. Comparez les corps de réponse — si le HTML, les images ou le JavaScript diffèrent, vous avez une création cloaking.
Exploration géo‑ciblée avec rotation de proxy
Le cloaking utilise souvent GeoIP comme discriminant supplémentaire. Une publicité peut servir une création propre aux requêtes provenant des États‑Unis, mais basculer vers une création malveillante pour les utilisateurs d'Asie du Sud‑Est ou d'Europe de l'Est. Pour détecter cela, vous devez explorer la même URL publicitaire depuis plusieurs points géographiques. Un pool de proxies résidentiels (par ex. BrightData, Oxylabs) ou une chaîne de proxies SOCKS5 vous permet de définir simultanément X-Forwarded-For et l'IP source TCP.
Utilisez curl avec un proxy et des en‑têtes personnalisés pour simuler un utilisateur mobile dans une région cible :
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
Comparez les deux fichiers. Toute différence dans les balises <script> ou les attributs src des images indique un cloaking géographique.
Différences de créations entre mobile et desktop
Le cloaking cible souvent le trafic mobile car les utilisateurs mobiles sont moins enclins à inspecter les requêtes réseau. Les robots de vérification qui n'imitent que les navigateurs desktop passent complètement à côté. Vous devez envoyer des requêtes avec les deux chaînes User-Agent et comparer les réponses. Un schéma courant : la réponse desktop contient une bannière 300x250 standard, tandis que la réponse mobile charge un interstitiel plein écran qui redirige vers une page de phishing.
Utilisez un outil comme diff ou jq pour comparer les réponses JSON. Pour le HTML, utilisez htmlq ou pup pour extraire des éléments spécifiques. La clé est d'automatiser la comparaison sur une matrice de user‑agents, de géolocalisations IP et de référents. Un système de production que j'ai construit lance 16 requêtes parallèles par unité publicitaire et signale toute variation au‑delà d'un seuil de 5 % de la taille en octets.
Compromis et limites
Cette approche n'est pas parfaite. Les serveurs publicitaires peuvent détecter les plages IP de proxy et servir des créations propres aux sorties de proxy connues — de la même manière qu'ils détectent les bots de vérification. La rotation de proxies résidentiels aide mais ajoute de la latence et du coût. De plus, certains cloaking sont basés sur le temps : la création malveillante n'apparaît qu'après un délai ou après un événement JavaScript qu'une simple requête curl ne peut pas déclencher. Dans ces cas, vous avez besoin d'un navigateur sans tête (Puppeteer, Playwright) derrière le proxy, ce qui augmente la complexité et la traçabilité.
Pourtant, le principe de base reste valable : si vous ne pouvez pas reproduire exactement la même réponse sur un ensemble diversifié d'empreintes client, la publicité n'est pas fiable. Les proxies HTTP vous donnent le contrôle nécessaire pour construire ces empreintes par programmation. Commencez par un simple script mitmproxy et quelques points de terminaison proxy. Cela suffira à détecter la majorité des campagnes de cloaking peu sophistiquées — et cela ne coûte rien d'autre que quelques lignes de Python.