User Tools

Site Tools


programming:filter_lists

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
programming:filter_lists [2026/08/29 13:23] – Re-sync the rule-count snapshot to the committed 13:20Z run (EasyList 54,748) and timestamp the table, so every figure on the page traces to a committed evidence file. Authored by Claude karel.kubicek.claudeprogramming:filter_lists [2026/08/29 13:38] (current) – Precision fix from the re-review, in the opposite direction to the last one: a list name is not its use. /disconnect/i had no word boundary and matched 'ECU disconnection'; hpHosts was counted as an ad/tracking list in two papers using it as a malware bla karel.kubicek.claude
Line 1: Line 1:
 ====== Filter Lists ====== ====== Filter Lists ======
  
-An **Adblock-syntax filter list** — EasyList, EasyPrivacy, Disconnect, and a few hundred smaller ones — is the closest thing web measurement has to a shared instrument. It is free, comparable across papers, and reviewable rule by rule, which is why **198 papers in this corpus(("This corpus" is a structured extraction over 5,859 full-text papers from seven venues — CCS, IMC, NDSS, PETS, USENIX Security, TheWebConf and IEEE S&P — 2010–2026, with 2025 and 2026 provisional venue-years. Every count on this page names its own population; see [[literature:corpus]] and [[#Use in Publications]].)) used or produced one**, and why a large share of what the field knows about advertising and tracking on the web rests on one.+An **Adblock-syntax filter list** — EasyList, EasyPrivacy, Disconnect, and a few hundred smaller ones — is the closest thing web measurement has to a shared instrument. It is free, comparable across papers, and reviewable rule by rule, which is why **194 papers in this corpus(("This corpus" is a structured extraction over 5,859 full-text papers from seven venues — CCS, IMC, NDSS, PETS, USENIX Security, TheWebConf and IEEE S&P — 2010–2026, with 2025 and 2026 provisional venue-years. Every count on this page names its own population; see [[literature:corpus]] and [[#Use in Publications]].)) used or produced one**, and why a large share of what the field knows about advertising and tracking on the web rests on one.
  
 It is also a moving, crowd-maintained, anglophone artefact with a known and large error rate in both directions, and the field uses it simultaneously as the **instrument** that produces a measurement and as the **ground truth** that the measurement is scored against. That circularity is this page's subject. It is also a moving, crowd-maintained, anglophone artefact with a known and large error rate in both directions, and the field uses it simultaneously as the **instrument** that produces a measurement and as the **ground truth** that the measurement is scored against. That circularity is this page's subject.
Line 8: Line 8:
  
 <WRAP important> <WRAP important>
-**The one thing to take away.** In this corpus the filter list is both the instrument and the definition, and almost nobody separates the two. Of the **167 papers** that used a list as part of a classification step, **119 (71.3%) report no validation of the list's labels at all** — every validation value they carry is ''not-applicable'' or ''none-reported''. The list //is// the label. Calzavara et al. {[calzavara2026_syntactic]} put a number on what that costs: comparing syntactic list matching against dynamic taint tracking request by request over the same crawl, they estimate **16%–19% of the list's own matches are false positives**, rising to **27%–30%** among requests only the list flagged, and find **7,021 requests (≈17% of their 40,605)** that only taint tracking saw. Treat a filter-list hit as a noisy label with error bars in the high teens. **Say so in your paper.**+**The one thing to take away.** In this corpus the filter list is both the instrument and the definition, and almost nobody separates the two. Of the **163 papers** that used a list as part of a classification step, **117 (71.8%) report no validation of the list's labels at all** — every validation value they carry is ''not-applicable'' or ''none-reported''. The list //is// the label. Calzavara et al. {[calzavara2026_syntactic]} put a number on what that costs: comparing syntactic list matching against dynamic taint tracking request by request over the same crawl, they estimate **16%–19% of the list's own matches are false positives**, rising to **27%–30%** among requests only the list flagged, and find **7,021 requests (≈17% of their 40,605)** that only taint tracking saw. Treat a filter-list hit as a noisy label with error bars in the high teens. **Say so in your paper.**
 </WRAP> </WRAP>
  
Line 67: Line 67:
 ===== Which Lists Exist ===== ===== Which Lists Exist =====
  
-**If you want the short answer: load EasyList and EasyPrivacy, add the regional lists your population needs, and add AdGuard's CNAME list if — and only if — your crawl recorded DNS resolution.** That is what the field does: 56.6% of the list-using papers below name EasyList and 35.9% name EasyPrivacy. Everything else in this table is a reference for when that default is wrong for your question — a domain-level comparison point, a cookie-notice ruleset, an entity map, or a list that is dead and should not appear in a 2026 paper.+**If you want the short answer: load EasyList and EasyPrivacy, add the regional lists your population needs, and add AdGuard's CNAME list if — and only if — your crawl recorded DNS resolution.** That is what the field does: 57.7% of the list-using papers below name EasyList and 36.6% name EasyPrivacy. Everything else in this table is a reference for when that default is wrong for your question — a domain-level comparison point, a cookie-notice ruleset, an entity map, or a list that is dead and should not appear in a 2026 paper.
  
 ==== Who maintains this, and what that implies ==== ==== Who maintains this, and what that implies ====
Line 93: Line 93:
 | [[https://justdomains.github.io/blocklists/|justdomains]] | Not a list: a domain-only re-encoding of EasyList, EasyPrivacy, AdGuard DNS and others | **Active as a conversion layer** (HTTP 200). Cite the upstream list, not this. Three papers in this corpus label cookies with it | | [[https://justdomains.github.io/blocklists/|justdomains]] | Not a list: a domain-only re-encoding of EasyList, EasyPrivacy, AdGuard DNS and others | **Active as a conversion layer** (HTTP 200). Cite the upstream list, not this. Three papers in this corpus label cookies with it |
 | **EasyList Cookie List** | CSS selectors for cookie notices. Lives in the main easylist repo under ''easylist_cookie/'' | **Active** (''Last modified: 2026-08-29 12:50 UTC''). **No ''Version:'' field**, only ''Last modified:'' — so record the date and the hash | | **EasyList Cookie List** | CSS selectors for cookie notices. Lives in the main easylist repo under ''easylist_cookie/'' | **Active** (''Last modified: 2026-08-29 12:50 UTC''). **No ''Version:'' field**, only ''Last modified:'' — so record the date and the hash |
-| **hpHosts / Malwarebytes ATS** | Historic hosts-file ad/tracking list | **Dead.** ''hosts-file.net'' still has a DNS record but HTTPS to it timed out on 2026-08-29; Malwarebytes stopped updating around 2020. It appears in older papers. **27 papers in this corpus used a hosts-file list of some kind**, but that family also contains live ones (Pi-hole, NoTrack), so the 27 is not 27 papers using a dead list — read the hosts-file row in //Which lists// below |+| **hpHosts / Malwarebytes ATS** | Historic hosts-file ad/tracking list | **Dead.** ''hosts-file.net'' still has a DNS record but HTTPS to it timed out on 2026-08-29; Malwarebytes stopped updating around 2020. It appears in older papers. **24 papers in this corpus used a hosts-file list of some kind**, but that family also contains live ones (Pi-hole, NoTrack), so the 27 is not 27 papers using a dead list — read the hosts-file row in //Which lists// below |
 | DNS-blocking lists generally | Domain-level, no path granularity | See [[Design:Website Classification|Website classification]], and the smart-TV row in [[#Coverage Holes, Measured]] | | DNS-blocking lists generally | Domain-level, no path granularity | See [[Design:Website Classification|Website classification]], and the smart-TV row in [[#Coverage Holes, Measured]] |
  
Line 121: Line 121:
  
 <WRAP important> <WRAP important>
-**Of the 178 papers in this corpus that name a filter list as a tool they used, 53 (29.8%) attach any version or date, and only 4 (2.2%) give something that identifies the actual rules** — a list ''Version:'' string or a commit hash. The rest is "EasyList", or a bare year. Some of the 53 do better than that — ''EasyList :: 2024-08-17'' and ''EasyList :: 2021-07-05'' come close to identifying a daily build — but a date is not the ''Version:'' the list itself publishes. Given that the list publishes its own commit and changes several times an hour, this is the single largest reproducibility gap in this literature.+**Of the 177 papers in this corpus that name a filter list as a tool they used, 53 (29.9%) attach any version or date, and only 4 (2.3%) give something that identifies the actual rules** — a list ''Version:'' string or a commit hash. The rest is "EasyList", or a bare year. Some of the 53 do better than that — ''EasyList :: 2024-08-17'' and ''EasyList :: 2021-07-05'' come close to identifying a daily build — but a date is not the ''Version:'' the list itself publishes. Given that the list publishes its own commit and changes several times an hour, this is the single largest reproducibility gap in this literature.
 </WRAP> </WRAP>
  
Line 358: Line 358:
 </WRAP> </WRAP>
  
-The practice is not confined to request classifiers. **96 papers in this corpus name a filter list as the ''groundTruthSource'' for a classification step, across twelve different kinds of object** — requests, domains, cookies, scripts, IP addresses, website categories, privacy policies, consent notices, network traffic, even email messages. The list has become the field's general-purpose definition of "advertising or tracking", far outside what it was written to describe.+The practice is not confined to request classifiers. **92 papers in this corpus name a filter list as the ''groundTruthSource'' for a classification step, across eleven different kinds of object** — requests, domains, scripts, cookies, website categories, fingerprinting scripts, privacy policies, consent notices, network traffic, even email messages. The list has become the field's general-purpose definition of "advertising or tracking", far outside what it was written to describe.
  
 The clearest recent examples, each verified against the paper's own text: The clearest recent examples, each verified against the paper's own text:
  
-  * **CookieGraph** {[shaoor2023cookiegraph]}, CCS 2023 labels a **cookie** by the provenance of the script that set it: "if a script that sets a cookie is not marked by any of the filter lists, we label these cookies as Non-ATS. Conservatively, if any one of the filter lists marks the cookie's setter as ATS, we label the cookie as Unknown".. It then adds **Cookiepedia** as a second, independent label source, and treats its self-declared purposes conservatively. That combination — filter-list provenance plus a CMP-maintained label database — is the strongest published approach to cookie labelling, and a real improvement on scoring the list against itself. It is one paper, and it rests on Cookiepedia, which nobody in this corpus has audited.+  * **CookieGraph** {[shaoor2023cookiegraph]}, CCS 2023 labels a **cookie** by the provenance of the script that set it: "if a script that sets a cookie is not marked by any of the filter lists, we label these cookies as Non-ATS. Conservatively, if any one of the filter lists marks the cookie's setter as ATS, we label the cookie as Unknown". It then adds **Cookiepedia** as a second, independent label source, and treats its self-declared purposes conservatively. That combination — filter-list provenance plus a CMP-maintained label database — is the strongest published approach to cookie labelling, and a real improvement on scoring the list against itself. It is one paper, and it rests on Cookiepedia, which nobody in this corpus has audited.
   * **NoT.js** {[amjad2024_notjs]}, CCS 2024 labels a **JavaScript function** by whether the network requests it participates in match EasyList/EasyPrivacy, calling the result "a conservative ground truth" in which mixed-behaviour functions (3.9% of it) are labelled non-tracking.   * **NoT.js** {[amjad2024_notjs]}, CCS 2024 labels a **JavaScript function** by whether the network requests it participates in match EasyList/EasyPrivacy, calling the result "a conservative ground truth" in which mixed-behaviour functions (3.9% of it) are labelled non-tracking.
   * **SugarCoat** {[smith2021_sugarcoat]}, CCS 2021 takes both the tracking labels //and// the breakage signal from list artefacts — rules and exception rules.   * **SugarCoat** {[smith2021_sugarcoat]}, CCS 2021 takes both the tracking labels //and// the breakage signal from list artefacts — rules and exception rules.
   * **Read Between the Lines** {[ghasemisharif2023_bytecode]}, CCS 2023 classifies tracking JavaScript from bytecode, with EasyList, EasyPrivacy and Fanboy's Enhanced Tracking as the labels.   * **Read Between the Lines** {[ghasemisharif2023_bytecode]}, CCS 2023 classifies tracking JavaScript from bytecode, with EasyList, EasyPrivacy and Fanboy's Enhanced Tracking as the labels.
  
-The learned-classifier roster whose stated ground truth is a filter list runs to **sixteen papers**, and **fourteen of them are a who's-who of the reference baselines**: AdGraph, WebGraph, WTAGRAPH, Khaleesi, AdFlush, Duumviri, Beyond the Request, CookieGraph, NoT.js, Net-track, PURL, NoMoAds, the Ad Wars, and Tramèr et al.'s attack on perceptual ad blocking. (The other two are a 2015 website-category classifier and a 2018 host-population classifier whose labels mix hpHosts with PhishTank — in the count because hpHosts is an ad/tracking list, but not tracker detectors.) The roster is printed in full, with each paper's own ground-truth string, on the [[provenance:programming:filter_lists|provenance page]].+The learned-classifier roster whose stated ground truth is a filter list runs to **fifteen papers**, and **fourteen of them are a who's-who of the reference baselines**: AdGraph, WebGraph, WTAGRAPH, Khaleesi, AdFlush, Duumviri, Beyond the Request, CookieGraph, NoT.js, Net-track, PURL, NoMoAds, the Ad Wars, and Tramèr et al.'s attack on perceptual ad blocking. (The fifteenth is a 2015 website-category classifier.) The roster is printed in full, with each paper's own ground-truth string, on the [[provenance:programming:filter_lists|provenance page]].
  
 ==== What to do instead, and what it costs ==== ==== What to do instead, and what it costs ====
Line 373: Line 373:
 Nobody has escaped the list entirely, but four routes exist, in rising order of effort: Nobody has escaped the list entirely, but four routes exist, in rising order of effort:
  
-  - **Hand-label a sample and report precision against the list.** A few hundred requests is an afternoon. **34 of the 167 list-using classification papers (20.4%) did this**, and 119 (71.3%) report no validation at all; it is the single cheapest improvement available and reviewers notice its absence.+  - **Hand-label a sample and report precision against the list.** A few hundred requests is an afternoon. **34 of the 163 list-using classification papers (20.9%) did this**, and 117 (71.8%) report no validation at all; it is the single cheapest improvement available and reviewers notice its absence.
   - **Add an independent label source.** Cookiepedia for cookies {[shaoor2023cookiegraph]}, a CMP declaration, an entity map. Disagreements between two imperfect sources are informative in a way agreement with one is not.   - **Add an independent label source.** Cookiepedia for cookies {[shaoor2023cookiegraph]}, a CMP declaration, an entity map. Disagreements between two imperfect sources are informative in a way agreement with one is not.
   - **Use a behavioural or differential detector as the reference**, not as the thing being scored: invisible pixels {[fouad2020_missed]}, breakage-differential testing {[shuang2025_duumviri]}, dynamic taint tracking {[calzavara2026_syntactic]}. Each has been done roughly once.   - **Use a behavioural or differential detector as the reference**, not as the thing being scored: invisible pixels {[fouad2020_missed]}, breakage-differential testing {[shuang2025_duumviri]}, dynamic taint tracking {[calzavara2026_syntactic]}. Each has been done roughly once.
Line 388: Line 388:
 ^ Signal ^ Papers ^ ^ Signal ^ Papers ^
 | corpus | 5,859 | | corpus | 5,859 |
-| **used or produced a filter list — the population** | **198** (3.4% of the corpus) | +| **used or produced a filter list — the population** | **194** (3.3% of the corpus) | 
-| … named it in ''tools[]''178 +| … named it in ''tools[]''177 
-| … named it in a ''classification[]'' step | 167 +| … named it in a ''classification[]'' step | 163 
-| … both | 147 |+| … both | 146 |
 | … only in ''tools[]'' — an instrument, never a labelling step | 31 | | … only in ''tools[]'' — an instrument, never a labelling step | 31 |
-| named a list but only //mentioned// or //compared against// it — excluded | 18 |+| named a list but only //mentioned// or //compared against// it — excluded | 19 | 
 +| named a list but used it for something **off-topic** — malware, phishing or piracy labelling — excluded on the evidence quote, not the name | 7 tuples across 5 papers |
  
-**"Mentioned" is not "used".** The 18 excluded papers are 8.4% of what a raw name search would score as adoption, and the //compared// ones are the dangerous rows: a paper that beats EasyList did not adopt it.+**"Mentioned" is not "used", and the name is not the use.** The 19 //mentioned//-only papers are 8.9% of what a raw name search would score as adoption, and the //compared// ones are the dangerous rows: a paper that beats EasyList did not adopt it. A further **five papers name a real list and use it for something else** — hpHosts as a malware blacklist alongside DNS-BH and Google Safe Browsing, NextDNS's piracy list to find torrent sites — and are excluded on the evidence quote rather than the name. All seven tuples are printed on the [[provenance:programming:filter_lists|provenance page]].
  
 ==== Which lists ==== ==== Which lists ====
  
-Of the **198** papers that used or produced a filter list. A paper naming several is counted under each, so shares do not sum to 100%. Names are free text and were folded into families; //spellings// is how many distinct strings the corpus uses, and //unfolded// is what the single most common exact string alone would have found.+Of the **194** papers that used or produced a filter list. A paper naming several is counted under each, so shares do not sum to 100%. Names are free text and were folded into families; //spellings// is how many distinct strings the corpus uses, and //unfolded// is what the single most common exact string alone would have found.
  
-^ List family ^ Papers ^ Share of 198 ^ Spellings ^ Unfolded ^ +^ List family ^ Papers ^ Share of 194 ^ Spellings ^ Unfolded ^ 
-| EasyList | 112 | 56.6% | 28 | 92 | +| EasyList | 112 | 57.7% | 28 | 92 | 
-| EasyPrivacy | 71 | 35.9% | 22 | 58 | +| EasyPrivacy | 71 | 36.6% | 22 | 58 | 
-| Disconnect | 48 | 24.2% | 23 | 26 | +| Disconnect | 48 | 24.7% | 23 | 26 | 
-| Ghostery / WhoTracks.me | 34 | 17.2% | 9 | 20 | +| Ghostery / WhoTracks.me | 34 | 17.5% | 9 | 20 | 
-| hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …) | 27 13.6% | 33 | 3 +| Adblock Plus (the lists shipped with it) | 26 | 13.4% | 8 | 20 | 
-| Adblock Plus (the lists shipped with it) | 26 | 13.1% | 8 | 20 +| hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …) | 24 12.4% | 32 | 3 | 
-| uBlock Origin lists | 17 | 8.6% | 11 | 13 | +| uBlock Origin lists | 17 | 8.8% | 11 | 13 | 
-| DuckDuckGo Tracker Radar | 15 | 7.6% | 9 | 8 | +| DuckDuckGo Tracker Radar | 15 | 7.7% | 9 | 8 | 
-| **unnamed or merely counted** ("nine crowd-sourced filter lists") | 10 5.1% | 10 | 1 | +| **unnamed or merely counted** ("nine crowd-sourced filter lists") | 4.6% | | 1 | 
-| AdGuard | 8 | 4.0% | 13 | 4 | +| AdGuard | 8 | 4.1% | 13 | 4 | 
-| EasyList annoyance / anti-adblock variants | 7 | 3.5% | 8 | 2 |+| EasyList annoyance / anti-adblock variants | 7 | 3.6% | 8 | 2 |
 | anti-adblock scripts and services | 3 | 1.5% | 4 | 1 | | anti-adblock scripts and services | 3 | 1.5% | 4 | 1 |
 | cryptomining lists (NoCoin, CoinBlockerLists, MinerBlock) | 3 | 1.5% | 4 | 3 | | cryptomining lists (NoCoin, CoinBlockerLists, MinerBlock) | 3 | 1.5% | 4 | 3 |
 | Acceptable Ads exception list | 1 | 0.5% | 1 | 1 | | Acceptable Ads exception list | 1 | 0.5% | 1 | 1 |
  
-**Folding is not cosmetic.** Counting exact strings would find 92 EasyList papers instead of 112 (−17.9%), 26 Disconnect papers instead of 48 (**−45.8%**, because Disconnect appears as //Disconnect list//, //Disconnect.me//, //Disconnect blacklist//, //Disconnect Entity List// and twenty more), and 3 hosts-file papers instead of 27. Any adoption table built on exact strings is wrong by tens of percent.+**Folding is not cosmetic.** Counting exact strings would find 92 EasyList papers instead of 112 (−17.9%), 26 Disconnect papers instead of 48 (**−45.8%**, because Disconnect appears as //Disconnect list//, //Disconnect.me//, //Disconnect blacklist//, //Disconnect Entity List// and twenty more), and 3 hosts-file papers instead of 24. Any adoption table built on exact strings is wrong by tens of percent.
  
 ==== What the list is used to label ==== ==== What the list is used to label ====
  
-Of the **167** papers with at least one list-backed classification step. This is the finding that motivated this page: **the filter list is not a request classifier, it is the field's general-purpose "is this advertising or tracking" oracle**, and it is applied to objects it was never written to describe.+Of the **163** papers with at least one list-backed classification step. This is the finding that motivated this page: **the filter list is not a request classifier, it is the field's general-purpose "is this advertising or tracking" oracle**, and it is applied to objects it was never written to describe.
  
-^ ''classification.target'' ^ Papers ^ Share of 167 +^ ''classification.target'' ^ Papers ^ Share of 163 
-| ''web-request'' | 101 | 60.5% | +| ''web-request'' | 101 | 62.0% | 
-| ''domain''53 | 31.7% | +| ''domain''51 | 31.3% | 
-| ''cookie'' | 8 | 4.8% | +| ''cookie'' | 8 | 4.9% | 
-| ''website-category''4.2% | +| ''website-category''3.1% | 
-| ''javascript'' | 5 | 3.0% |+| ''javascript'' | 5 | 3.1% |
 | ''other'' | 3 | 1.8% | | ''other'' | 3 | 1.8% |
 | ''fingerprinting-script'' | 3 | 1.8% | | ''fingerprinting-script'' | 3 | 1.8% |
Line 437: Line 438:
 Grouped by what that does to the instrument: Grouped by what that does to the instrument:
  
-^ Granularity ^ Papers ^ Share of 167 +^ Granularity ^ Papers ^ Share of 163 
-| **The list's own unit** — a URL pattern evaluated with request context | 101 | 60.5% | +| **The list's own unit** — a URL pattern evaluated with request context | 101 | 62.0% | 
-| **Coarser than the list** — a hostname or eTLD+1, so path, resource-type and ''$third-party'' options are discarded | 53 | 31.7% | +| **Coarser than the list** — a hostname or eTLD+1, so path, resource-type and ''$third-party'' options are discarded | 51 | 31.3% | 
-| **Objects a filter list was not written to label** — the list supplies provenance, not a rule match | 30 18.0% |+| **Objects a filter list was not written to label** — the list supplies provenance, not a rule match | 28 17.2% |
  
-**These are not a partition and the shares exceed 100%**: 17 of the 167 papers apply a list at more than one granularity — typically requests //and// domains in the same study.+**These are not a partition and the shares exceed 100%**: 17 of the 163 papers apply a list at more than one granularity — typically requests //and// domains in the same study.
  
-**Nearly a third of these 167 papers throw away the list's granularity before using it.** That is often deliberate and sometimes unavoidable — a DNS blocklist or a passive traffic capture gives you nothing finer than a hostname — but it changes what the label means, and it is rarely stated. The per-paper roster behind every non-request row is on the [[provenance:programming:filter_lists|provenance page]] so you can check the claim.+**Nearly a third of these 163 papers throw away the list's granularity before using it.** That is often deliberate and sometimes unavoidable — a DNS blocklist or a passive traffic capture gives you nothing finer than a hostname — but it changes what the label means, and it is rarely stated. The per-paper roster behind every non-request row is on the [[provenance:programming:filter_lists|provenance page]] so you can check the claim.
  
 ==== Ground truth ==== ==== Ground truth ====
  
 ^ Question ^ Papers ^ ^ Question ^ Papers ^
-| papers whose ''classification.groundTruthSource'' names a filter list (whole corpus) | 96 +| papers whose ''classification.groundTruthSource'' names a filter list (whole corpus) | 92 
-| … of the 198 list-using papers | 88 (44.4%) | +| … of the 194 list-using papers | 86 (44.3%) | 
-| distinct kinds of object those tuples label | 12 |+| distinct kinds of object those tuples label | 11 |
 | … of which the list is named **generically** ("eight crowdsourced filter lists") rather than by name | 13 | | … of which the list is named **generically** ("eight crowdsourced filter lists") rather than by name | 13 |
-| papers with a **learned** classifier (''supervised-ml'', ''unsupervised-ml'', ''llm'') whose stated ground truth is a filter list | 16 +| papers with a **learned** classifier (''supervised-ml'', ''unsupervised-ml'', ''llm'') whose stated ground truth is a filter list | 15 
-| … as a share of the 62 list-using papers that ran any learned classifier | 15 (24.2%)((The 16 and the 15 differ by one paper, which uses a filter list as ground truth but is not itself in the 198-paper list-using population — it names no list as a tool or classification resource, only as its label source.)) |+| … as a share of the 60 list-using papers that ran any learned classifier | 15 (25.0%) |
  
-Validation of the list-backed classification steps, over the **167** papers. Sentinels are printed as themselves and never counted as an answer:+Validation of the list-backed classification steps, over the **163** papers. Sentinels are printed as themselves and never counted as an answer:
  
-^ ''classification.validation'' ^ Papers ^ Share of 167 +^ ''classification.validation'' ^ Papers ^ Share of 163 
-| ''not-applicable'' //(sentinel)//69 | 41.3% | +| ''not-applicable'' //(sentinel)//68 | 41.7% | 
-| ''none-reported'' //(sentinel)//61 | 36.5% | +| ''none-reported'' //(sentinel)//60 | 36.8% | 
-| manual validation | 34 | 20.4% | +| manual validation | 34 | 20.9% | 
-| comparison to another method | 14 8.4% |+| comparison to another method | 12 7.4% |
  
-**The rows overlap** — 11 papers carry both a sentinel and a real value, so the two sentinel rows must not be added. The paper-level figure is: **119 of 167 (71.3%) report nothing but sentinels**, and 48 (28.7%) report at least one real validation.+**The rows overlap** — 11 papers carry both a sentinel and a real value, so the two sentinel rows must not be added. The paper-level figure is: **117 of 163 (71.8%) report nothing but sentinels**, and 46 (28.2%) report at least one real validation.
  
 The ''not-applicable'' row is mostly papers that applied a list as-is and reasonably consider the list itself the definition. That is exactly the assumption Calzavara et al. measured at 16%–19% false positives — on one crawl, with one independent detector, so treat it as the best available estimate rather than a constant. The ''not-applicable'' row is mostly papers that applied a list as-is and reasonably consider the list itself the definition. That is exactly the assumption Calzavara et al. measured at 16%–19% false positives — on one crawl, with one independent detector, so treat it as the best available estimate rather than a constant.
Line 471: Line 472:
  
 ^ Question ^ Papers ^ Share ^ ^ Question ^ Papers ^ Share ^
-| named a filter list in ''tools[]''178 | — | +| named a filter list in ''tools[]''177 | — | 
-| attached **any** version or date | 53 | 29.8% | +| attached **any** version or date | 53 | 29.9% | 
-| attached something that identifies **the rules** — a list ''Version:'' or a commit | 4 | **2.2%** | +| attached something that identifies **the rules** — a list ''Version:'' or a commit | 4 | **2.3%** | 
-| silent | 125 | 70.2% |+| silent | 124 | 70.1% |
  
-Read the 29.8% as an order of magnitude in both directions: the extraction fills the version field when the paper puts a version next to the name, so a paper that dates its lists in a crawl paragraph may not be credited — and several of the 53 give an //extension// version (''Ghostery 5.4.1'', ''Adblock Plus 3.7'') rather than a list version, which does not identify the rules at all. The **2.2%** is the figure that matters and it is not an artefact: a list ''Version:'' string is unmistakable, and only four papers have one.+Read the 29.9% as an order of magnitude in both directions: the extraction fills the version field when the paper puts a version next to the name, so a paper that dates its lists in a crawl paragraph may not be credited — and several of the 53 give an //extension// version (''Ghostery 5.4.1'', ''Adblock Plus 3.7'') rather than a list version, which does not identify the rules at all. The **2.3%** is the figure that matters and it is not an artefact: a list ''Version:'' string is unmistakable, and only four papers have one.
  
 ==== Where and when ==== ==== Where and when ====
Line 482: Line 483:
 ^ Venue ^ Corpus papers ^ Population ^ Share of venue ^ ^ Venue ^ Corpus papers ^ Population ^ Share of venue ^
 | PETS | 510 | 55 | 10.8% | | PETS | 510 | 55 | 10.8% |
-| IMC | 638 | 36 | 5.6% | +| IMC | 638 | 35 | 5.5% | 
-| TheWebConf | 843 | 31 | 3.7% |+| TheWebConf | 843 | 30 | 3.6% |
 | IEEE S&P | 767 | 19 | 2.5% | | IEEE S&P | 767 | 19 | 2.5% |
 | CCS | 990 | 23 | 2.3% | | CCS | 990 | 23 | 2.3% |
-| USENIX Security | 1,410 | 24 | 1.7% |+| USENIX Security | 1,410 | 22 | 1.6% |
 | NDSS | 701 | 10 | 1.4% | | NDSS | 701 | 10 | 1.4% |
  
 ^ Period ^ Corpus papers ^ Population ^ Per 1,000 ^ ^ Period ^ Corpus papers ^ Population ^ Per 1,000 ^
 | 2010–2013 | 511 | 6 | 11.7 | | 2010–2013 | 511 | 6 | 11.7 |
-| 2014–2017 | 769 | 25 32.+| 2014–2017 | 769 | 24 31.
-| 2018–2021 | 1,439 | 58 40.+| 2018–2021 | 1,439 | 57 39.
-| 2022–2024 | 1,955 | 70 | 35.+| 2022–2024 | 1,955 | 69 | 35.
-| 2025–2026 //(provisional)// | 1,185 | 39 | 32.|+| 2025–2026 //(provisional)// | 1,185 | 38 | 32.|
  
 **Filter-list use peaked in 2018–2021 and has been flat since, at roughly 3–4% of these seven venues.** Nothing in the corpus supports "the field has moved on from filter lists": machine learning was added alongside, not instead. Among the population, papers carrying **any** LLM-based classification step appear only in 2024 (2), 2025 (4) and 2026 (1) — real, new, and far too thin to call current practice on the strength of the corpus's most provisional years. **Filter-list use peaked in 2018–2021 and has been flat since, at roughly 3–4% of these seven venues.** Nothing in the corpus supports "the field has moved on from filter lists": machine learning was added alongside, not instead. Among the population, papers carrying **any** LLM-based classification step appear only in 2024 (2), 2025 (4) and 2026 (1) — real, new, and far too thin to call current practice on the strength of the corpus's most provisional years.
Line 504: Line 505:
   * **A paper counts once**, never once per tuple, and shares do not sum to 100% because the fields are multi-valued.   * **A paper counts once**, never once per tuple, and shares do not sum to 100% because the fields are multi-valued.
   * **Sentinels are counted as what they are.** ''not-applicable'' and ''none-reported'' are never folded into a stated value; where they are the largest rows, that is the finding.   * **Sentinels are counted as what they are.** ''not-applicable'' and ''none-reported'' are never folded into a stated value; where they are the largest rows, that is the finding.
 +  * **A list's name is not its use.** For the ambiguous families — hosts-file lists and unnamed aggregations — the tuple's own taxonomy and verbatim evidence quote decide whether it was an advertising/tracking list or a security blacklist. Seven tuples across five papers were excluded on that test and are printed in full on the provenance page.
   * **Free-text names were folded, and the residue is printed** rather than dropped: 34 distinct strings matched the candidate regex but no family, and almost all are generic off-topic phrases (''12 IP reputation blacklists'', ''combined public blacklists''). Off-topic blocklist families were excluded by name and counted: malware/phishing 10 papers, spam 8, IP reputation 7, content-category 6, censorship 3, certificate revocation 2.   * **Free-text names were folded, and the residue is printed** rather than dropped: 34 distinct strings matched the candidate regex but no family, and almost all are generic off-topic phrases (''12 IP reputation blacklists'', ''combined public blacklists''). Off-topic blocklist families were excluded by name and counted: malware/phishing 10 papers, spam 8, IP reputation 7, content-category 6, censorship 3, certificate revocation 2.
   * **Free-text fields are ~20% stable run-to-run.** List names are given as folded families and rankings; the enum fields (''classification.target'', ''classification.validation'') are considerably more stable and are given as percentages.   * **Free-text fields are ~20% stable run-to-run.** List names are given as folded families and rankings; the enum fields (''classification.target'', ''classification.validation'') are considerably more stable and are given as percentages.
   * **Venue coverage.** Seven venues only. EuroS&P, ACSAC, RAID, AsiaCCS, WPES, CHI and SOUPS are absent, and several works this page relies on were published outside them — Snyder et al. at SIGMETRICS in particular. Any count here is a lower bound.   * **Venue coverage.** Seven venues only. EuroS&P, ACSAC, RAID, AsiaCCS, WPES, CHI and SOUPS are absent, and several works this page relies on were published outside them — Snyder et al. at SIGMETRICS in particular. Any count here is a lower bound.
-  * **Overlap with [[Privacy:Requests]].** That page computes a partly overlapping population (its "S1" signal) and reports 197 papers where this page reports 198, with per-list counts differing by one or two. The two scripts define membership slightly differently — this page counts a list named anywhere in ''tools[]'' or ''classification[]'', that page additionally intersects with its request-classification task fold. Neither is wrong; the difference is a live example of why a population definition belongs in the provenance, not in a sentence.+  * **Overlap with [[Privacy:Requests]].** That page computes a partly overlapping population (its "S1" signal) and reports **197** papers where this page reports **194**. The folds are sharedso the difference is the membership rule: that page intersects with its own request-classification task fold, and this page additionally excludes a paper whose list name is right but whose //use// is a malware or piracy blacklist. Neither is wrong; the difference is a live example of why a population definition belongs in the provenance rather than in a sentence, and it is set out there in full.
  
 ===== What to Report ===== ===== What to Report =====
Line 525: Line 527:
   * **The 16%–19% false-positive estimate is one study.** {[calzavara2026_syntactic]} used one taint-tracking browser on 7,614 sites. A very large amount of this page leans on it. It should be replicated with a different independent detector before it becomes folklore.   * **The 16%–19% false-positive estimate is one study.** {[calzavara2026_syntactic]} used one taint-tracking browser on 7,614 sites. A very large amount of this page leans on it. It should be replicated with a different independent detector before it becomes folklore.
   * **Regional lists have two papers in seven venues across seventeen years.** {[sjosten2020_filter]} and {[bottger2025_regional]}. Nobody has measured how much a per-country tracking comparison changes when the matching regional list is loaded — which means a large body of comparative geographic tracking work rests on an instrument of unmeasured, varying sensitivity.   * **Regional lists have two papers in seven venues across seventeen years.** {[sjosten2020_filter]} and {[bottger2025_regional]}. Nobody has measured how much a per-country tracking comparison changes when the matching regional list is loaded — which means a large body of comparative geographic tracking work rests on an instrument of unmeasured, varying sensitivity.
-  * **No learned tracker detector in this corpus escapes the list.** Of the 16 papers whose stated ground truth is a filter list, every one that is a tracker detector — AdGraph, WebGraph, WTAGRAPH, Khaleesi, AdFlush, Duumviri, CookieGraph, NoT.js, Net-track, Beyond the Request — takes its labels from one. **This is a statement about the 16, not about all learned classifiers in the corpus**: 47 of the 62 list-using papers that ran a learned classifier state some other ground truth, and nobody has audited what those 47 are classifying or how. The two nearest misses to an independent label source — differential breakage testing {[shuang2025_duumviri]} and taint tracking {[calzavara2026_syntactic]} — have each been done once.+  * **No learned tracker detector in this corpus escapes the list.** Of the 15 papers whose stated ground truth is a filter list, every one that is a tracker detector — AdGraph, WebGraph, WTAGRAPH, Khaleesi, AdFlush, Duumviri, CookieGraph, NoT.js, Net-track, Beyond the Request — takes its labels from one. **This is a statement about the 15, not about all learned classifiers in the corpus**: 45 of the 60 list-using papers that ran a learned classifier state some other ground truth, and nobody has audited what those 45 are classifying or how. The two nearest misses to an independent label source — differential breakage testing {[shuang2025_duumviri]} and taint tracking {[calzavara2026_syntactic]} — have each been done once.
   * **Python still has no maintained filter-list engine.** Someone should revive ''python-adblock'' against ''adblock'' 0.13.x, or the field should state loudly that Python pipelines must shell out.   * **Python still has no maintained filter-list engine.** Someone should revive ''python-adblock'' against ''adblock'' 0.13.x, or the field should state loudly that Python pipelines must shell out.
   * **Nobody has published which rules the shipped MV3 blockers drop** to fit the 30,000-rule static cap, or what that omits from a measurement made with one.   * **Nobody has published which rules the shipped MV3 blockers drop** to fit the 30,000-rule static cap, or what that omits from a measurement made with one.
programming/filter_lists.txt · Last modified: by karel.kubicek.claude

Except where otherwise noted, content on this wiki is licensed under the following license: CC BY-NC-SA 4.0
CC BY-NC-SA 4.0 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki