Reklam doğrulaması bozuk. 2023 yılında yapılan bir sektör denetimi, büyük borsalar üzerinden sunulan programatik reklam gösterimlerinin yüzde 60-80'inin, doğrulama botlarına gerçek kullanıcılardan farklı yaratıcılar gösterdiğini ortaya koydu. Bu bir gizleme (cloaking) yöntemidir ve bugüne kadar okuduğunuz her marka güvenliği raporunu geçersiz kılar. Çözüm, doğrulama tarayıcısını bir saldırgan gibi ele almayı gerektirir: onu bir HTTP proxy üzerinden yönlendirin, parmak izini değiştirin ve işlenmiş içeriği bilinen güvenli bir temel çizgiyle karşılaştırın.
Gizleme Hedeflerini Nasıl Seçer
Gizleme üç sinyale dayanır: User-Agent, X-Forwarded-For (veya doğrudan IP) ve Referer. Kötü niyetli bir reklam sunucusu gelen isteği inceler ve ziyaretçinin bir doğrulama botu mu yoksa insan mı olduğuna karar verir. Moat, Integral Ad Science veya DoubleVerify gibi botlar tahmin edilebilir başlıklar gönderir. Sunucu daha sonra bota temiz, marka güvenli bir yaratıcı, diğer herkese ise kötü niyetli veya uygunsuz bir yaratıcı sunar. Bu tutarsızlık, doğrulayıcının panosunda görünmez.
Gerçek dünya örnekleri arasında yalnızca belirli coğrafyalardaki mobil kullanıcılara sunulan yetişkin içeriği, siyasi propaganda veya kötü amaçlı yazılım yönlendirmeleri yer alır. Saldırgan, User-Agent alanını "Mozilla/5.0 (Linux; Android …)" için ve X-Forwarded-For alanını bilinen bir doğrulama satıcısına ait IP aralığı için kontrol eder. IP eşleşirse reklam güvenlidir. Eşleşmezse kullanıcı yükü alır.
Farklılıkları Tespit Etmek için MITM Proxy Kullanma
En güvenilir tespit yöntemi, kendi doğrulama tarayıcınızı şeffaf bir HTTP proxy — mitmproxy veya Burp Suite — üzerinden çalıştırmak ve yanıtı proxy olmadan gönderilen bir kontrol isteğiyle karşılaştırmaktır. Proxy, ham yanıt gövdesini yakalamanıza ve başlıkları gerçek zamanlı olarak değiştirmenize olanak tanır. Aynı isteği farklı bir User-Agent veya X-Forwarded-For ile tekrarlayabilir ve reklam sunucusunun yaratıcıyı değiştirip değiştirmediğini görebilirsiniz.
İşte aynı URL'ye farklı kullanıcı aracılarıyla yapılan iki istek arasındaki farklılıkları günlüğe kaydeden minimal bir mitmproxy betiği:
# 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
Bunu mitmproxy -s check_cloak.py --listen-port 8080 ile çalıştırın, ardından tarayıcınızı veya curl aracınızı proxy'ye yönlendirin. Yanıt gövdelerini karşılaştırın — HTML, resimler veya JavaScript farklıysa, gizlenmiş bir yaratıcıyla karşı karşıyasınız demektir.
Proxy Döndürme ile Coğrafi Hedefli Tarama
Gizleme genellikle ek bir ayırt edici olarak GeoIP kullanır. Bir reklam, Amerika Birleşik Devletleri'nden gelen isteklere temiz bir yaratıcı sunarken, Güneydoğu Asya veya Doğu Avrupa'daki kullanıcılara kötü niyetli bir yaratıcıya geçiş yapabilir. Bunu yakalamak için aynı reklam URL'sini birden fazla coğrafi uç noktadan taramanız gerekir. Bir konut proxy havuzu (örneğin BrightData, Oxylabs) veya bir SOCKS5 proxy zinciri, aynı anda X-Forwarded-For ve TCP kaynak IP'sini ayarlamanıza olanak tanır.
Hedef bölgedeki bir mobil kullanıcıyı simüle etmek için curl aracını bir proxy ve özel başlıklarla kullanın:
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
İki dosyayı karşılaştırın. <script> etiketlerinde veya resim src özniteliklerindeki herhangi bir fark, coğrafyaya göre gizleme olduğunu gösterir.
Mobil ve Masaüstü Reklam Farklılıkları
Gizleme genellikle mobil trafiği hedef alır çünkü mobil kullanıcıların ağ isteklerini inceleme olasılığı daha düşüktür. Yalnızca masaüstü tarayıcıları taklit eden doğrulama tarayıcıları bunu tamamen kaçırır. Her iki User-Agent dizesiyle de istek göndermeli ve yanıtları karşılaştırmalısınız. Yaygın bir desen: masaüstü yanıtı standart bir 300x250 banner'ı içerirken, mobil yanıt bir kimlik avı sayfasına yönlendiren tam ekran bir ara reklam yükler.
JSON yanıtlarını karşılaştırmak için diff veya jq gibi bir araç kullanın. HTML için belirli öğeleri çıkarmak amacıyla htmlq veya pup kullanın. Anahtar nokta, karşılaştırmayı kullanıcı aracıları, IP coğrafyaları ve yönlendirenlerden oluşan bir matris üzerinde otomatikleştirmektir. Oluşturduğum bir üretim sistemi, reklam birimi başına 16 paralel istek çalıştırıyor ve %5 bayt boyutu eşiğinin ötesindeki herhangi bir varyasyonu işaretliyor.
Ödünleşimler ve Sınırlamalar
Bu yaklaşım mükemmel değildir. Reklam sunucuları proxy IP aralıklarını tespit edebilir ve bilinen proxy çıkışlarına temiz yaratıcılar sunabilir — tıpkı doğrulama botlarını tespit ettikleri gibi. Konut proxylerini döndürmek yardımcı olur ancak gecikme ve maliyet ekler. Ayrıca, bazı gizleme yöntemleri zamana dayalıdır: kötü niyetli yaratıcı yalnızca bir gecikmeden sonra veya basit bir curl isteğinin tetikleyemeyeceği bir JavaScript olayından sonra ortaya çıkar. Bu durumlarda proxy'nin arkasında başsız bir tarayıcıya (Puppeteer, Playwright) ihtiyacınız olur, bu da karmaşıklığı ve parmak izi tespit edilebilirliğini artırır.
Yine de temel ilke geçerlidir: farklı istemci parmak izleri arasında tam olarak aynı yanıtı yeniden üretemiyorsanız, reklam güvenilir değildir. HTTP proxyleri, bu parmak izlerini programlı olarak oluşturma kontrolünü size verir. Basit bir mitmproxy betiği ve bir avuç proxy uç noktasıyla başlayın. Bu tek başına, düşük çabayla yapılan gizleme kampanyalarının çoğunu yakalayacaktır — ve birkaç satır Python'dan başka bir maliyeti yoktur.