maintenir son DNS menteur avec Adblock

Filtrer les web-espions (google analytics, xiti …) n’est qu’un début. Le nombre de fichiers javascript, css et images en tout genre destinés à vous profiler est non négligeable, mais le pire est en fait le nombre de publicités pourrissant votre expérience utilisateur. Comment peut-on intégrer dans bind9, les filtres adblock que l’on a construit minutieusement ?

Les régies de publicité ne sont pas honnêtes, elles proposent de la pornographie (bon ça c’est pas grave), des jeux en ligne (ça ne touche que les cons qui croient gagner face à un logiciel), des faux antivirus (là c’est moins drôle) voire des mouchards (là je ne ris plus du tout).
Filtrer les pubs est parfois considéré comme une attitude hostile vis à vis de l’éditeur du contenu que vous vous apprêtez à consommer. Vous refusez la contrepartie d’un service gratuit, vous êtes fourbes, vous mériteriez d’aller casser des cailloux à Cayenne et qu’on fasse un lolcat avec votre chien.

Plan du site

Dans cette page nous allons capitaliser sur le travail bienveillant des furieux de chez yoyo.org, utiliserons les excellentes listes de fanboy et de liam une liste adblock polonaise et nous finirons par intégrer la liste adblock de notre profil firefox.
Les trois source seront formatées en un fichier de configuration pour notre DNS menteur.

Chez yoyo.org

Chez yoyo ils sont très geek. Il est possible de télécharger une liste toute prête des données qui nous intéresse. Ce qui nous importe le plus, c’est le formulaire de la section adservers. Nous allons choisir le format de sortie “AdBlock” pour le champ “list ad server hostnames:”.
Nous invoquerons cette liste par l’URL suivante http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock pour ne plus avoir à faire du clic-clic lors des mises à jour.

L’objectif est d’obtenir des hosts de cette liste, ce qui se fait très simplement par :

curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\\.[a-z0-9]*' | sort -u

Ce qui donne :

a.collective-media.net
a.consumer.net
(...)
kliks.nl
klipads.dvlabs.com
(...)
zintext.com
zmedia.com

Le site pgl.yoyo.org est très riche, la section adservers est une mine d’information pour le filtrage responsable en environnement réseau très hétérogènes.

Liste adblock polonaise

Commençons par une digression sur la Creative Commons : c’est un concept de licence que je n’apprécie pas. La notion de paternité pour un fichier de configuration me sidère.
Les excellentes listes adblock de Fanboy et Liam sont en CC NC BY SA, leur réutilisation est incompatible avec la licence initiale (WTFPL) compatible avec la licence utilisée par Geekfault pour les articles. Bref, nous allons nous orienter vers une liste plus amicale.

Ce qui nous emmène à l’utilisation de la liste du site AdblockList.org (en polonais).
Voici les 4 structures possibles :

(...)

http://*.statcounter.com/*

(...)

http://partner.ceneo.pl/pp/*

(...)
|http://mklik.gazeta.pl/*
(...)
||nuggad.net/*
(...)

La différence entre webespion.com, |webespion.com et ||webespion.com est documenté dans la section filters de AdblockPlus.
Ce qui nous conduit a l’expression régulière suivante :
'^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$'
Utilisable par exemple comme ceci :
$ curl -s http://adblocklist.org/adblock-pxf-polish.txt | egrep '^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$'

http://r.reklama.biz/*

http://*stats.wordpress.com/*

|http://mklik.gazeta.pl/*

http://rek.www.wp.pl/*

http://kropka.onet.pl/*

http://csr.onet.pl/*

||nuggad.net/*
(...)

Avec perl nous allons, en une seule ligne (merci madx), regrouper le egrep ET nettoyer la sortie

$ curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^\\|{0,2}(http://)?\\*?.?([^/#]*)/; && print $2."\\n";'
r.reklama.biz
stats.wordpress.com
mklik.gazeta.pl
rek.www.wp.pl
kropka.onet.pl
csr.onet.pl
nuggad.net
(...)

La liste adblock de notre profil Firefox

Maintenant que nous savons sélectionner depuis une liste adblock, les filtres intégrables à bind9 et que nous savons nettoyer nous pouvons parcourir la liste adblock dans nos profils firefox :
$ (for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^|{0,2}(http://)?*?.?([^/#]*)/; && print $2." <-- ".$_."n";' < $i;done;) | sort -u | less
Ce qui donne chez moi :

(...)
5killspyware.eu <-- ||5killspyware.eu/
5l2o8.com <-- ||5l2o8.com/
5mariasara.cn <-- ||5mariasara.cn/
5may2009.com <-- ||5may2009.com/
5removespyware.com <-- ||5removespyware.com/
5rublei.com <-- ||5rublei.com/
5w90.co.cc <-- ||5w90.co.cc/
5we5.com <-- ||5we5.com/
5yttrre.cn <-- ||5yttrre.cn/
6-tube-world.com <-- ||6-tube-world.com/
60sys60.cn <-- ||60sys60.cn/

On peut donc parcourir la liste temporaire et regarder si il n'y a pas trop de faux positifs. A plusieurs milliers de lignes (21282 très précisément sur mes profils firefox) il ne faut pas hésiter à faire un lecture étalée dans le temps.
Normalement il n'y aura pas trop de surprises, nous obtenons une liste de hosts correctes comme ceci :

(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^|{0,2}(http://)?*?.?([^/#]*)/; && print $2."n";' < $i;done;) | sort -u

Création du fichier blackhole.conf

Pour rappel, notre structure de blackhole.conf est:
zone "HOTE_A_FILTRER" { type master; notify no; file "null.zone.file"; };
Nous savons que la commande pour extraire HOTE_A_FILTRER avec :

  • la liste de chez yoyo :

curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\\.[a-z0-9]*'

  • la liste adblock polonaise :

curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^\\|{0,2}(http://)?\\*?.?([^/#]*)/; && print $2."\\n";'

  • notre liste adblock maison :

(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^\\|{0,2}(http://)?\\*?.?([^/#]*)/; && print $2."\\n";' < $i;done;)

Nous pouvons donc écrire notre générateur de blackhole.conf en une seule ligne (bash) :
(for i in `((curl -s 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblock' | egrep '^[a-z0-9]*\\.[a-z0-9]*');(curl -s http://adblocklist.org/adblock-pxf-polish.txt | perl -ne 'm;^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^\\|{0,2}(http://)?\\*?.?([^/#]*)/; && print $2."\\n";');(for i in ~/.mozilla/firefox/*/adblockplus/patterns*; do perl -ne 'm;^\\|{0,2}(http://)?[^/.]+.[^/#]+/[^/$a-z0-9]*$; && m;^\\|{0,2}(http://)?\\*?.?([^/#]*)/; && print $2."\\n";' < $i;done;) ) | sort -u `; do echo "zone "$i" { type master; notify no; file \\"null.zone.file\\"; };";done;)> blackhole.conf

Conclusion

Nous voila donc avec un blackhole.conf prêt a être injecté dans notre bind9 local comme expliqué dans l'article de base du dns menteur.

J'attire votre attention sur le fait que cette liste brute a de grandes chances de ne pas être tout à fait conforme à votre utilisation du web. Sur plus de 22000 entrées (ce qui est mon cas), il y a de grandes chances d'avoir des doublons genre xyz.webespion.org et webespion.org par exemple.
Le principal risque des listes adblock est le faux-positif, ce risque est transmis intégralement. Je vous invite à manier tout ceci avec prudence.

Si vous avez aimé ce post...

  1. DNS menteur, une autre méthode anti-curieux
  2. La nouvelle mode Geek : avoir son domaine .42
  3. Mise en place d’un système de backup avec Rsnapshot

Vus : 812
Publié par Geekfault : 45