La verificación de anuncios está rota. Una auditoría de la industria de 2023 encontró que entre el 60 y el 80 por ciento de las impresiones de anuncios programáticos servidas a través de los principales exchanges muestran creatividades diferentes a los bots de verificación que a los usuarios reales. Esto es cloaking — y socava todos los informes de seguridad de marca que hayas leído. La solución requiere tratar al rastreador de verificación como un atacante: enrutarlo a través de un proxy HTTP, variar su huella digital y comparar el contenido renderizado con una línea base conocida como segura.
Cómo el Cloaking Selecciona sus Objetivos
El cloaking se basa en tres señales: User-Agent, X-Forwarded-For (o IP directa) y Referer. Un servidor de anuncios malicioso inspecciona la solicitud entrante y decide si el visitante es un bot de verificación o un humano. Los bots — como los de Moat, Integral Ad Science o DoubleVerify — envían encabezados predecibles. El servidor entonces sirve una creatividad limpia y segura para la marca al bot, y una creatividad maliciosa o inapropiada a todos los demás. La discrepancia es invisible para el panel del verificador.
Ejemplos del mundo real incluyen contenido para adultos, propaganda política o redireccionamientos a malware servidos solo a usuarios móviles en geografías específicas. El atacante verifica User-Agent en busca de “Mozilla/5.0 (Linux; Android …)” y X-Forwarded-For en busca de un rango de IP que pertenezca a un proveedor de verificación conocido. Si la IP coincide, el anuncio es seguro. Si no, el usuario recibe la carga útil.
Uso de un Proxy MITM para Detectar Discrepancias
El método de detección más confiable es ejecutar tu propio rastreador de verificación a través de un proxy HTTP transparente — mitmproxy o Burp Suite — y comparar la respuesta con una solicitud de control enviada sin el proxy. El proxy te permite capturar el cuerpo de la respuesta sin procesar y modificar los encabezados en tiempo real. Puedes reproducir la misma solicitud con un User-Agent o X-Forwarded-For diferente y ver si el servidor de anuncios cambia la creatividad.
Aquí hay un script mínimo en mitmproxy que registra las discrepancias entre dos solicitudes a la misma URL con diferentes agentes de usuario:
# 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
Ejecútalo con mitmproxy -s check_cloak.py --listen-port 8080, luego apunta tu navegador o curl al proxy. Compara los cuerpos de las respuestas — si el HTML, las imágenes o el JavaScript difieren, tienes una creatividad con cloaking.
Rastreo Geodirigido con Rotación de Proxies
El cloaking a menudo utiliza GeoIP como un discriminador adicional. Un anuncio puede servir una creatividad limpia a solicitudes originadas en Estados Unidos, pero cambiar a una maliciosa para usuarios en el Sudeste Asiático o Europa del Este. Para detectar esto, debes rastrear la misma URL de anuncio desde múltiples puntos finales geográficos. Un grupo de proxies residenciales (por ejemplo, BrightData, Oxylabs) o una cadena de proxies SOCKS5 te permite establecer el X-Forwarded-For y la IP de origen TCP simultáneamente.
Usa curl con un proxy y encabezados personalizados para simular un usuario móvil en una región objetivo:
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
Haz diff de los dos archivos. Cualquier diferencia en las etiquetas <script> o en los atributos src de las imágenes indica cloaking por geografía.
Diferencias de Creatividad entre Móvil y Escritorio
El cloaking a menudo apunta al tráfico móvil porque los usuarios móviles tienen menos probabilidades de inspeccionar las solicitudes de red. Los rastreadores de verificación que solo imitan navegadores de escritorio pasan por alto esto por completo. Debes enviar solicitudes con ambas cadenas User-Agent y comparar las respuestas. Un patrón común: la respuesta de escritorio contiene un banner 300x250 estándar, mientras que la respuesta móvil carga un intersticial de pantalla completa que redirige a una página de phishing.
Usa una herramienta como diff o jq para comparar respuestas JSON. Para HTML, usa htmlq o pup para extraer elementos específicos. La clave es automatizar la comparación a través de una matriz de agentes de usuario, geolocalizaciones IP y referentes. Un sistema de producción que construí ejecuta 16 solicitudes paralelas por unidad de anuncio y marca cualquier variación más allá de un umbral del 5% en el tamaño de bytes.
Compensaciones y Limitaciones
Este enfoque no es perfecto. Los servidores de anuncios pueden detectar rangos de IP de proxy y servir creatividades limpias a las salidas de proxy conocidas — de la misma manera que detectan bots de verificación. Rotar proxies residenciales ayuda, pero añade latencia y costo. Además, algo de cloaking se basa en el tiempo: la creatividad maliciosa solo aparece después de un retraso o después de un evento de JavaScript que una simple solicitud curl no puede activar. En esos casos necesitas un navegador sin cabeza (Puppeteer, Playwright) detrás del proxy, lo que aumenta la complejidad y la capacidad de ser identificado por huella digital.
Sin embargo, el principio central se mantiene: si no puedes reproducir exactamente la misma respuesta a través de un conjunto diverso de huellas digitales de cliente, el anuncio no es confiable. Los proxies HTTP te dan el control para construir esas huellas digitales de forma programática. Comienza con un script simple en mitmproxy y un puñado de puntos finales de proxy. Eso solo detectará la mayoría de las campañas de cloaking de bajo esfuerzo — y no cuesta nada más que unas pocas líneas de Python.