11/05/2010

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.

  1. Grumph
    | #1

    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[…]

    Adblock -> ouvrir la liste des éléments filtrables

    => http://www.google-analytics.com/ga.js ||google-analytics.com^

    Mais sinon, merci pour l’article, il est très intéressant :)

  2. Adrien
    | #2

    Cool, comme ça on enlève aux développeurs de logiciels libres leur seuls moyens
    – de voir si leur travail est utile à beaucoup de monde (les stats, ça sert a ça. Sérieux qu’est ce que ça peut vous foutre qu’on sache que vous avez telle résolution d’écran et tel navigateur ? Ah oui c’est vrai Google et Xiti enregistrent tout pour vous surveiller, ils n’ont que ça à faire)
    – de payer l’hébergement avec la pub. Si tout le monde installe adblock, la plupart des projets libres vont mourir. Et non, les dons ne sont pas suffisants en général.

  3. | #3

    Merci pour les info.:)

  4. | #4

    Très bon article mais comme Adrien je suis contre Adblocks et autre trucs pour supprimer les publicités…

  5. ckg
    | #5

    @Grumph
    Je n’ai pas adblock sur ma TV :)

    @Adrien
    Tes propos me font penser à la guerre débile entre Adblockplus et NoScript.

    @Adrien & @M@DM@X
    Dans les listes adblock on trouve plusieurs familles, parmi lesquelles les pubs, les stats et les malwares.
    Ce qui est possible avec adblock l’est également avec un DNS menteur : accepter les pubs et les stats mais pas les malwares genre ht’tp://a’nti’vir’us-r’emo’te.c’om/ ! Chacun place ses curseurs de tolérance là où il veut.

    @littlebear & @M@DM@X & @Grumph
    😉

  6. | #6

    Hi,

    I’m afraid my French is almost nonexistent, but, it looks like you’re trying to use my list here in some different format. I’m quite happy to add new formats – so if you’d like to get in touch with an example of how you’re using the list, I might be able to save you a whole bunch of trouble. :) Feel free to email me – pgl@yoyo.org.

    cheers,

    – Peter / pgl

  7. ckg
    | #7

    Hi Peter

    Thank you for the comment ;), but an extra output format is not needed, because your adblock is perfect(ly grepable).

    As you may notice, the structure of blackhole.conf is, in fact, the structure you use for bind8. I really love your geeky stuff !

    I hope I will soon email you some geeky stuff in return. 😉

  8. | #8

    @Adrien
    @M@DM@X
    C’est à l’utilisateur de
    – soit utiliser des listes non agressives et qui ne bloquent que les pubs trop envahissantes
    – soit avoir le réflexe de, quand il arrive sur un site qui lui plait, le whitelister

    De plus, les pubs ne sont pas toujours le meilleur moyen de faire vivre un site, et encore moins un projet qui ne se base pas directement sur la fréquentation de sa page web. (pour un blog c’est facile, mais combien de fois allez-vous récupérer votre kernel linux sur kernel.org ?)

    « Et non, les dons ne sont pas suffisants en général. »
    http://www.wolfire.com/humble
    *siflotte*
    Disons que si ce que tu fais est utile à quelqu’un, les dons seront toujours plus ou moins là, et si t’es utile à beaucoup de monde/d’entreprises et que tu gères bien l’affaire, les dons, c’est peut-être bien l’avenir de beaucoup de buisness models 😉

  9. | #9

    Bon, ca necessite quand meme deux/trois modifications…

    (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”;’ blackhole.conf

    Cette commande finale donnera un gros FAIL ! au rechargement de bind, car les double-quote ne sont pas échapés, donc remplacer { type master; notify no; file “null.zone.file”; };”;done;) par { type master; notify no; file \”null.zone.file\”; };”;done;)

    Aussi, la partie perl pour la zone polonaise déconne sec.

    Et au passage, la liste de yoyo.org compte proxad.net et ses variantes dans leur liste… pas cool pour le tas de mirroir ftp qui y traine :).

  10. ckg
    | #10

    @Khemael
    Bien vu lulu :)

    J’avais pris soin de recopier les lignes tapées dans mon terminal (sh) il semble que j’ai perdu une partie en manipulant WordPress. Au final, tout est fonctionnel avec bash, plus besoins de modifications.

    Il est normale de trouver des faux positifs sur la masse de hosts proposés, à la décharge de yoyo.org, proxad.net à une belle tête de site à filtrer. Surtout quand on sait comment Xavier NIEL à débuter dans le business.

    En tout cas merci pour tes interventions très constructives sur ce site et sur #troll !

  11. Olivier
    | #11

    @Adrien : pour moi, le problème c’est pas que google ou autre connaisse ma résolution, mon problème c’est que tout ces javascript inutile (pour l’utilisation du site visiter) fait tout ramer (connexion, PC,…)

  12. | #12

    J’utilise le plugin firefox ghostery : http://www.ghostery.com/
    exhaustif et souvent mis à jours.

  13. yann
    | #13

    A titre perso, dans le domaine protection individuelle j’aime bien rester simple:
    http://winhelp2002.mvps.org/hosts.htm

    On renvoie les IP des pubeux et autres parasites vers l’IP localhost au niveau du fichier hosts.

    Attention toutefois à ajouter ceci à la suite du contenu d’origine sur une machine linux… et a commenter la définition du localhost du fichier de mvps.

    En particulier pour les ubuntistes: Le sudo marchera plus (il utilise le fichiers hosts pour connaitre le nom de la machine) et comme le compte root n’est pas actif par défaut, il faudra redémarrer d’un live-cd et monter le HDD à partir de la session live pour éditer le fichier hosts et s’en sortir.

    Ca doit au final donner qqchose comme ça, pour le host “MaTotoMachine”:

    ~$ more /etc/hosts
    # === CONTENU HOSTS ORIGINE ===>
    127.0.0.1 localhost
    127.0.1.1 MaTotoMachine

    # The following lines are desirable for IPv6 capable hosts
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts

    # <=== /HOSTS ORIGINE ===

    # This MVPS HOSTS file is a free download from: #
    # http://winhelp2002.mvps.org/hosts.htm #
    # #
    # Notes: The Operating System does not read the "#" symbol #
    # You can create your own notes, after the # symbol #
    # This *must* be the first line: 127.0.0.1 localhost #
    # #
    # *********************************************************#
    # —————– Updated: June-15-2011 —————–#
    # *********************************************************#
    # #
    # Entries with comments are all searchable via Google. #
    # #
    # Disclaimer: this file is free to use for personal use #
    # only. Furthermore it is NOT permitted to copy any of the #
    # contents or host on any other site without permission or #
    # meeting the full criteria of the below license terms. #
    # #
    # This work is licensed under the Creative Commons #
    # Attribution-NonCommercial-ShareAlike License. #
    # http://creativecommons.org/licenses/by-nc-sa/3.0/ #

    #127.0.0.1 localhost <=== COMMENTER ===

    #::1 localhost #[IPv6]

    # [Start of entries generated by WinHelp2002]
    #
    # [Misc A – Z]
    127.0.0.1 fr.a2dfp.net
    127.0.0.1 m.fr.a2dfp.net
    127.0.0.1 ad.a8.net
    127.0.0.1 asy.a8ww.net

  1. | #1