Ad Tech

Xác minh Quảng cáo: Phát hiện Creative Ẩn giấu với Proxy HTTP

4 min read Published Updated 832 words

Xác minh quảng cáo đã bị phá vỡ. Một cuộc kiểm toán ngành năm 2023 cho thấy 60-80% số lần hiển thị quảng cáo theo chương trình được phân phối qua các sàn giao dịch lớn hiển thị các creative khác nhau cho bot xác minh so với người dùng thực. Đây là cloaking — và nó phá hoại mọi báo cáo an toàn thương hiệu mà bạn từng đọc. Giải pháp yêu cầu coi crawler xác minh như một kẻ tấn công: định tuyến nó qua một proxy HTTP, thay đổi dấu vân tay của nó, và so sánh nội dung đã render với một baseline an toàn đã biết.

Cách Cloaking Chọn Mục Tiêu

Cloaking dựa vào ba tín hiệu: User-Agent, X-Forwarded-For (hoặc IP trực tiếp), và Referer. Một máy chủ quảng cáo độc hại kiểm tra yêu cầu đến và quyết định xem khách truy cập là bot xác minh hay con người. Bot — như của Moat, Integral Ad Science, hoặc DoubleVerify — gửi các header có thể dự đoán trước. Máy chủ sau đó phục vụ một creative sạch, an toàn thương hiệu cho bot và một creative độc hại hoặc không phù hợp cho tất cả những người khác. Sự khác biệt này vô hình với bảng điều khiển của bên xác minh.

Các ví dụ thực tế bao gồm nội dung người lớn, tuyên truyền chính trị, hoặc chuyển hướng phần mềm độc hại chỉ được phục vụ cho người dùng di động ở các khu vực địa lý cụ thể. Kẻ tấn công kiểm tra User-Agent cho “Mozilla/5.0 (Linux; Android …)” và X-Forwarded-For cho một dải IP thuộc về một nhà cung cấp xác minh đã biết. Nếu IP khớp, quảng cáo an toàn. Nếu không, người dùng nhận được payload.

Sử Dụng MITM Proxy để Phát Hiện Sự Khác Biệt

Phương pháp phát hiện đáng tin cậy nhất là chạy crawler xác minh của riêng bạn thông qua một proxy HTTP trong suốt — mitmproxy hoặc Burp Suite — và so sánh phản hồi với một yêu cầu kiểm soát được gửi mà không có proxy. Proxy cho phép bạn chụp nội dung phản hồi thô và sửa đổi header theo thời gian thực. Bạn có thể phát lại cùng một yêu cầu với một User-Agent hoặc X-Forwarded-For khác và xem liệu máy chủ quảng cáo có thay đổi creative hay không.

Đây là một script mitmproxy tối thiểu ghi lại sự khác biệt giữa hai yêu cầu đến cùng một URL với các user agent khác nhau:

# 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

Chạy nó với mitmproxy -s check_cloak.py --listen-port 8080, sau đó trỏ trình duyệt hoặc curl của bạn vào proxy. So sánh các nội dung phản hồi — nếu HTML, hình ảnh hoặc JavaScript khác nhau, bạn đã có một creative bị cloaking.

Crawling Theo Vị Trí Địa Lý với Proxy Rotation

Cloaking thường sử dụng GeoIP như một yếu tố phân biệt bổ sung. Một quảng cáo có thể phục vụ creative sạch cho các yêu cầu đến từ Hoa Kỳ nhưng chuyển sang creative độc hại cho người dùng ở Đông Nam Á hoặc Đông Âu. Để phát hiện điều này, bạn phải crawl cùng một URL quảng cáo từ nhiều điểm cuối địa lý. Một nhóm proxy dân cư (ví dụ: BrightData, Oxylabs) hoặc một chuỗi proxy SOCKS5 cho phép bạn đặt X-Forwarded-For và địa chỉ IP nguồn TCP đồng thời.

Sử dụng curl với proxy và header tùy chỉnh để mô phỏng người dùng di động trong một khu vực mục tiêu:

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

So sánh hai tệp. Bất kỳ sự khác biệt nào trong các thẻ <script> hoặc thuộc tính src của hình ảnh đều cho thấy cloaking theo địa lý.

Sự Khác Biệt Creative Giữa Di Động và Máy Tính

Cloaking thường nhắm vào lưu lượng di động vì người dùng di động ít có khả năng kiểm tra các yêu cầu mạng. Các crawler xác minh chỉ bắt chước trình duyệt máy tính sẽ bỏ lỡ hoàn toàn điều này. Bạn phải gửi yêu cầu với cả hai chuỗi User-Agent và so sánh các phản hồi. Một mẫu phổ biến: phản hồi máy tính chứa một banner 300x250 tiêu chuẩn, trong khi phản hồi di động tải một interstitial toàn màn hình chuyển hướng đến một trang lừa đảo.

Sử dụng một công cụ như diff hoặc jq để so sánh các phản hồi JSON. Đối với HTML, sử dụng htmlq hoặc pup để trích xuất các phần tử cụ thể. Điều quan trọng là tự động hóa việc so sánh trên một ma trận các user agent, IP địa lý và referrer. Một hệ thống sản xuất tôi đã xây dựng chạy 16 yêu cầu song song cho mỗi đơn vị quảng cáo và gắn cờ bất kỳ biến thể nào vượt quá ngưỡng 5% kích thước byte.

Đánh Đổi và Hạn Chế

Cách tiếp cận này không hoàn hảo. Máy chủ quảng cáo có thể phát hiện các dải IP proxy và phục vụ creative sạch cho các đầu ra proxy đã biết — giống như cách chúng phát hiện bot xác minh. Xoay vòng proxy dân cư giúp ích nhưng làm tăng độ trễ và chi phí. Ngoài ra, một số cloaking dựa trên thời gian: creative độc hại chỉ xuất hiện sau một độ trễ hoặc sau một sự kiện JavaScript mà một yêu cầu curl đơn giản không thể kích hoạt. Trong những trường hợp đó, bạn cần một trình duyệt không đầu (Puppeteer, Playwright) đằng sau proxy, điều này làm tăng độ phức tạp và khả năng bị nhận dạng.

Tuy nhiên, nguyên tắc cốt lõi vẫn đúng: nếu bạn không thể tái tạo chính xác cùng một phản hồi trên một tập hợp đa dạng các dấu vân tay máy khách, thì quảng cáo đó không đáng tin cậy. HTTP proxy cung cấp cho bạn khả năng kiểm soát để xây dựng các dấu vân tay đó một cách lập trình. Bắt đầu với một script mitmproxy đơn giản và một vài điểm cuối proxy. Chỉ riêng điều đó sẽ phát hiện phần lớn các chiến dịch cloaking ít nỗ lực — và nó không tốn kém gì ngoài vài dòng Python.