Ad Tech

Verifikasi Iklan: Mendeteksi Kreatif yang Terselubung dengan Proxy HTTP

4 min read Published Updated 832 words

Verifikasi iklan rusak. Audit industri tahun 2023 menemukan bahwa 60-80 persen tayangan iklan programatik yang disajikan melalui bursa utama menampilkan kreatif yang berbeda kepada bot verifikasi dibandingkan kepada pengguna nyata. Ini adalah cloaking — dan itu merusak setiap laporan keamanan merek yang pernah Anda baca. Perbaikannya memerlukan perlakuan terhadap crawler verifikasi seperti penyerang: arahkan melalui proxy HTTP, variasikan sidik jarinya, dan bandingkan konten yang dirender terhadap baseline yang diketahui aman.

Bagaimana Cloaking Memilih Targetnya

Cloaking bergantung pada tiga sinyal: User-Agent, X-Forwarded-For (atau IP langsung), dan Referer. Server iklan berbahaya memeriksa permintaan yang masuk dan memutuskan apakah pengunjung adalah bot verifikasi atau manusia. Bot — seperti dari Moat, Integral Ad Science, atau DoubleVerify — mengirim header yang dapat diprediksi. Server kemudian menyajikan kreatif yang bersih dan aman untuk merek kepada bot, dan kreatif berbahaya atau tidak pantas kepada yang lainnya. Perbedaan tersebut tidak terlihat di dasbor verifikator.

Contoh di dunia nyata termasuk konten dewasa, propaganda politik, atau pengalihan malware yang hanya disajikan kepada pengguna seluler di wilayah geografis tertentu. Penyerang memeriksa User-Agent untuk “Mozilla/5.0 (Linux; Android …)” dan X-Forwarded-For untuk rentang IP yang dimiliki oleh vendor verifikasi yang dikenal. Jika IP cocok, iklan aman. Jika tidak, pengguna mendapatkan muatan berbahaya.

Menggunakan Proxy MITM untuk Mendeteksi Perbedaan

Metode deteksi yang paling andal adalah menjalankan crawler verifikasi Anda sendiri melalui proxy HTTP transparan — mitmproxy atau Burp Suite — dan membandingkan respons terhadap permintaan kontrol yang dikirim tanpa proxy. Proxy memungkinkan Anda menangkap isi respons mentah dan memodifikasi header secara real-time. Anda dapat memutar ulang permintaan yang sama dengan User-Agent atau X-Forwarded-For yang berbeda dan melihat apakah server iklan mengubah kreatif.

Berikut adalah skrip mitmproxy minimal yang mencatat perbedaan antara dua permintaan ke URL yang sama dengan user agent berbeda:

# 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

Jalankan dengan mitmproxy -s check_cloak.py --listen-port 8080, lalu arahkan browser atau curl Anda ke proxy. Bandingkan isi respons — jika HTML, gambar, atau JavaScript berbeda, Anda memiliki kreatif yang di-cloaking.

Perayapan yang Ditargetkan Secara Geografis dengan Rotasi Proxy

Cloaking sering menggunakan GeoIP sebagai pembeda tambahan. Sebuah iklan mungkin menyajikan kreatif bersih untuk permintaan yang berasal dari Amerika Serikat tetapi beralih ke kreatif berbahaya untuk pengguna di Asia Tenggara atau Eropa Timur. Untuk menangkap ini, Anda harus merayapi URL iklan yang sama dari beberapa titik akhir geografis. Kumpulan proxy residensial (misalnya, BrightData, Oxylabs) atau rantai proxy SOCKS5 memungkinkan Anda mengatur X-Forwarded-For dan sumber IP TCP secara bersamaan.

Gunakan curl dengan proxy dan header kustom untuk mensimulasikan pengguna seluler di wilayah target:

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

Bandingkan dua file tersebut. Perbedaan apa pun pada tag <script> atau atribut gambar src menunjukkan cloaking berdasarkan geografi.

Perbedaan Kreatif Seluler vs. Desktop

Cloaking sering menargetkan lalu lintas seluler karena pengguna seluler cenderung tidak memeriksa permintaan jaringan. Crawler verifikasi yang hanya meniru browser desktop melewatkan ini sepenuhnya. Anda harus mengirim permintaan dengan kedua string User-Agent dan membandingkan responsnya. Pola umum: respons desktop berisi spanduk 300x250 standar, sedangkan respons seluler memuat interstisial layar penuh yang mengarahkan ke halaman phishing.

Gunakan alat seperti diff atau jq untuk membandingkan respons JSON. Untuk HTML, gunakan htmlq atau pup untuk mengekstrak elemen tertentu. Kuncinya adalah mengotomatiskan perbandingan di seluruh matriks user agent, geo IP, dan referrer. Salah satu sistem produksi yang saya bangun menjalankan 16 permintaan paralel per unit iklan dan menandai variasi apa pun yang melebihi ambang batas ukuran byte 5%.

Trade-off dan Keterbatasan

Pendekatan ini tidak sempurna. Server iklan dapat mendeteksi rentang IP proxy dan menyajikan kreatif bersih ke pintu keluar proxy yang dikenal — dengan cara yang sama mereka mendeteksi bot verifikasi. Memutar proxy residensial membantu tetapi menambah latensi dan biaya. Selain itu, beberapa cloaking bersifat berbasis waktu: kreatif berbahaya hanya muncul setelah penundaan atau setelah peristiwa JavaScript yang tidak dapat dipicu oleh permintaan curl sederhana. Dalam kasus tersebut, Anda memerlukan browser tanpa kepala (Puppeteer, Playwright) di belakang proxy, yang meningkatkan kompleksitas dan kemampuan untuk di-fingerprint.

Namun prinsip intinya tetap berlaku: jika Anda tidak dapat mereproduksi respons yang persis sama di berbagai set sidik jari klien, iklan tersebut tidak dapat dipercaya. Proxy HTTP memberi Anda kendali untuk membangun sidik jari tersebut secara terprogram. Mulailah dengan skrip mitmproxy sederhana dan beberapa titik akhir proxy. Itu saja sudah cukup untuk menangkap sebagian besar kampanye cloaking dengan usaha rendah — dan tidak memerlukan biaya selain beberapa baris Python.