Ad Tech

Верификация рекламы: обнаружение скрытых креативов с помощью HTTP-прокси

4 min read Published Updated 832 words

Верификация рекламы сломана. Аудит индустрии за 2023 год показал, что 60–80% программных показов рекламы, проходящих через крупные биржи, показывают проверочным ботам другие креативы, чем реальным пользователям. Это клоакинг — и он подрывает каждый отчёт о безопасности бренда, который вы когда-либо читали. Решение требует относиться к проверочному краулеру как к атакующему: направлять его через HTTP-прокси, варьировать его отпечаток и сравнивать отображаемый контент с эталонным, заведомо безопасным.

Как клоакинг выбирает цели

Клоакинг опирается на три сигнала: User-Agent, X-Forwarded-For (или прямой IP) и Referer. Вредоносный рекламный сервер анализирует входящий запрос и решает, является ли посетитель проверочным ботом или человеком. Боты — например, от Moat, Integral Ad Science или DoubleVerify — отправляют предсказуемые заголовки. Сервер отдаёт боту чистый, безопасный для бренда креатив, а всем остальным — вредоносный или неуместный. Расхождение невидимо для панели управления верификатора.

Реальные примеры включают контент для взрослых, политическую пропаганду или перенаправления на вредоносное ПО, которые показываются только мобильным пользователям в определённых географических регионах. Атакующий проверяет User-Agent на наличие «Mozilla/5.0 (Linux; Android …)» и X-Forwarded-For на диапазон IP, принадлежащий известному поставщику верификации. Если IP совпадает — реклама безопасна. Если нет — пользователь получает нагрузку.

Использование MITM-прокси для обнаружения расхождений

Самый надёжный метод обнаружения — запустить собственный проверочный краулер через прозрачный HTTP-прокси — mitmproxy или Burp Suite — и сравнить ответ с контрольным запросом, отправленным без прокси. Прокси позволяет захватить необработанное тело ответа и изменять заголовки в реальном времени. Вы можете воспроизвести тот же запрос с другим User-Agent или X-Forwarded-For и увидеть, меняет ли рекламный сервер креатив.

Вот минимальный скрипт на mitmproxy, который записывает расхождения между двумя запросами к одному URL с разными user-agent:

# 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

Запустите его с mitmproxy -s check_cloak.py --listen-port 8080, затем направьте браузер или curl на прокси. Сравните тела ответов — если HTML, изображения или JavaScript различаются, перед вами клоакированный креатив.

Гео-таргетированный краулинг с ротацией прокси

Клоакинг часто использует GeoIP как дополнительный дискриминатор. Реклама может показывать чистый креатив запросам из США, но переключаться на вредоносный для пользователей из Юго-Восточной Азии или Восточной Европы. Чтобы это выявить, необходимо обходить один и тот же рекламный URL с нескольких географических конечных точек. Пул резидентных прокси (например, BrightData, Oxylabs) или цепочка SOCKS5-прокси позволяют одновременно задать X-Forwarded-For и исходный TCP-IP.

Используйте curl с прокси и пользовательскими заголовками для имитации мобильного пользователя в целевом регионе:

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

Сравните два файла. Любое различие в тегах <script> или атрибутах изображений src указывает на клоакинг по географическому признаку.

Различия креативов для мобильных и десктопных устройств

Клоакинг часто нацелен на мобильный трафик, поскольку мобильные пользователи реже проверяют сетевые запросы. Проверочные краулеры, которые имитируют только десктопные браузеры, полностью это упускают. Необходимо отправлять запросы с обеими строками User-Agent и сравнивать ответы. Типичный сценарий: десктопный ответ содержит стандартный баннер 300x250, а мобильный — полноэкранное межстраничное объявление, которое перенаправляет на фишинговую страницу.

Используйте инструмент вроде diff или jq для сравнения JSON-ответов. Для HTML применяйте htmlq или pup для извлечения конкретных элементов. Ключевой момент — автоматизировать сравнение по матрице user-agent, гео-IP и рефереров. В одной из производственных систем, которые я создавал, на каждую рекламную единицу выполняется 16 параллельных запросов, и любое отклонение за пределы 5-процентного порога размера в байтах помечается.

Компромиссы и ограничения

Этот подход не идеален. Рекламные серверы могут обнаруживать диапазоны IP прокси и показывать чистые креативы известным выходам прокси — точно так же, как они обнаруживают проверочных ботов. Ротация резидентных прокси помогает, но увеличивает задержку и стоимость. Кроме того, часть клоакинга основана на времени: вредоносный креатив появляется только после задержки или после JavaScript-события, которое не может инициировать простой запрос curl. В таких случаях требуется headless-браузер (Puppeteer, Playwright) за прокси, что увеличивает сложность и отпечатываемость.

Тем не менее основной принцип остаётся в силе: если вы не можете воспроизвести одинаковый ответ для разнообразного набора клиентских отпечатков, реклама не заслуживает доверия. HTTP-прокси дают вам контроль для программного построения таких отпечатков. Начните с простого скрипта на mitmproxy и нескольких прокси-конечных точек. Уже это позволит выявить большинство низкоуровневых кампаний клоакинга — и это не стоит ничего, кроме нескольких строк Python.