Adblock Filter List Fingerprinting
This proof-of-concept demonstrates that users of adblockers with country-specific filter lists (e.g., EasyList Germany, Liste FR) can be partially de-anonymized even when using a VPN. By probing blocked domains unique to each country's filter list, we can identify which lists are active — revealing the user's likely country or language.
216.73.216.129 — this is what your IP says. The detection below checks what your adblocker says.
Each card represents a country-specific adblock filter list. We probe 30 domains per list that are blocked exclusively by that country's list.
Each country-specific filter list blocks ad-serving domains unique to that region.
For example, EasyList Germany blocks adnx.de, adition.de,
and hundreds of other German ad networks that are not in the base EasyList.
We extracted and cross-referenced all domain rules against the base EasyList (54,000+ domains)
to find domains blocked only by the country list.
We attempt to load a tiny resource (favicon) from 30 country-specific domains. When an adblocker blocks the request, the error fires almost instantly (< 30ms) because the request is intercepted before reaching the network. A normal network failure (DNS timeout, connection refused) takes much longer (> 100ms). This timing difference reveals which domains are being blocked.
If 20+ out of 30 probed domains are blocked instantly, we conclude that the country's filter list is active. The combination of detected lists creates a unique fingerprint that can reveal the user's location or language, even through a VPN or proxy.
performance.now() high-resolution timing.Enable a country-specific filter list in your adblocker, then re-run the detection to see it get identified. Here's how to toggle lists in common setups.
brave://settings/shields/filters in your address barhttp://pi.hole/adminpihole -g to update gravity, then re-run detectionNote: DNS-level blocking may not trigger the same timing signature as browser-based adblockers. Results may differ.