Comment Bromure bloque les publicités avant même que la page ne les voie
La plupart des bloqueurs de publicités sont des extensions de navigateur, et la plupart des extensions de navigateur s'exécutent dans le même processus que la page dont elles cherchent à vous protéger. Bromure procède autrement. Voici comment, et pourquoi cela compte.
Un bloqueur de publicités qui vit à l'intérieur du navigateur tente d'arbitrer un combat depuis l'intérieur du ring. Bromure déplace l'arbitre vers le réseau lui-même, là où aucune page ne peut l'atteindre, aucun script ne peut le toucher, et aucune bannière « anti-bloqueur » ne peut lui tenir tête.
Le blocage des publicités est la fonctionnalité de navigateur la plus populaire qui ne soit pas livrée avec le navigateur. Des centaines de millions de personnes installent une extension tierce dès le premier jour parce que le web moderne est véritablement inutilisable sans. Cela, en soi, est déjà un signal que quelque chose cloche dans la conception. Mais la manière dont fonctionne presque chaque bloqueur de publicités mérite qu'on s'y attarde, car l'architecture se révèle déterminante — à la fois pour l'efficacité réelle du blocage, et pour ce qui se passe quand la page tente activement de le contrer.
Ce billet retrace le fonctionnement habituel d'un bloqueur de publicités, pourquoi cette forme a de véritables limites, et comment Bromure adopte une approche différente qui emprunte son idée centrale à un outil dont vous avez peut-être entendu parler, installé sur un Raspberry Pi dans la cave de quelqu'un.
Les publicités ne sont pas qu'agaçantes. Elles sont un problème de chargement, de vie privée, et un vecteur d'attaque.
Il est facile d'oublier, après quelques années de blocage des publicités, à quoi ressemble réellement le web brut. Un article d'actualité populaire, chargé sans aucun filtrage, va typiquement récupérer des ressources depuis 30 à 80 domaines tiers. La plupart sont des outils d'analyse, des pixels de traçage et des points de terminaison d'enchères en temps réel. Ils alourdissent la page, ajoutent de la latence, déposent des cookies pour le compte d'entreprises dont vous n'avez jamais entendu parler, et — comme expliqué dans le billet sur les rançongiciels publié plus tôt ce mois-ci — ils sont l'un des vecteurs discrets de diffusion des maliciels, parce que les régies publicitaires se font occasionnellement berner et servent des créations malveillantes sur des sites légitimes.
Bloquer ces requêtes n'est donc pas une question cosmétique. C'est un gain de performance, un gain de vie privée, et — parce que les régies publicitaires sont un canal régulier de distribution de maliciels — un véritable gain de sécurité. La seule question est comment les bloquer.
Comment une extension de navigateur typique bloque les publicités.
Presque tous les bloqueurs de publicités grand public, y compris les plus
populaires que vous avez probablement installés, sont des extensions de
navigateur. Ce qui signifie qu'architecturalement, ils vivent à l'intérieur
du navigateur — ils exécutent du JavaScript dans le processus du
navigateur, enregistrent des rappels auprès des API réseau du navigateur
(webRequest, declarativeNetRequest), et inspectent chaque requête que
le navigateur s'apprête à faire.
Cette forme fonctionne — c'est, après tout, ce sur quoi la plupart des gens s'appuient chaque jour — mais elle comporte de véritables limites structurelles :
La page peut s'en rendre compte
Puisque l'extension vit dans le même processus que la page, le JavaScript de la page peut la sonder : « ma requête est-elle vraiment partie ? cette variable est-elle bien définie ? » Des sites entiers (et la plupart des grands titres de presse payants) détectent les requêtes manquantes et refusent de se charger sans elles, exigeant que l'utilisateur « désactive son bloqueur de publicités ».
La page est dans la même zone de confiance
L'extension et la page hostile qu'elle cherche à filtrer partagent un processus de navigateur, un moteur de rendu, parfois un jeu de permissions. Une faille de navigateur suffisamment grave exploitée dans la page désactive l'extension avec le reste. Les extensions sont du code ; elles sont aussi une surface d'attaque.
La requête est déjà née
Au moment où l'extension voit une requête, le navigateur a déjà décidé de la faire, a analysé l'URL et (selon l'API) effectué la résolution DNS. Bloquer à ce stade relève du filtrage, pas de la prévention.
L'API de filtrage s'affaiblit sans cesse
La refonte Manifest v3 de Chrome a contraint ce que peuvent faire les
extensions de filtrage, principalement en plafonnant le nombre de
règles et en remplaçant le webRequest dynamique par
declarativeNetRequest. L'architecture de l'API d'extension est
définie par l'éditeur du navigateur, pas par vous.
Comment Bromure s'y prend : le mur n'est pas l'extension.
Le bloqueur de publicités de Bromure n'est pas une extension. Le navigateur lui-même ne contient absolument aucun code de blocage des publicités. À la place, c'est la pile réseau de la VM Linux jetable dans laquelle s'exécute le navigateur qui fait office de bloqueur de publicités — et du point de vue du navigateur, les domaines publicitaires ne résolvent tout simplement pas.
Mécaniquement, deux petits logiciels sans histoire font le travail :
Un proxy HTTP local (Squid)
Chaque requête sortante du navigateur est acheminée de façon
transparente via un proxy Squid qui tourne sur localhost:3128 à
l'intérieur de la VM. Squid, c'est la tuyauterie : il ne décide
pas de ce qui est une publicité, il se contente de faire la
résolution DNS et le relais pour le navigateur.
Un résolveur DNS local (dnsmasq)
Squid est configuré pour résoudre chaque domaine via une instance
locale de dnsmasq sur 127.0.0.1. La configuration de dnsmasq inclut
une liste de blocage d'environ 100 000 domaines — régies
publicitaires, traqueurs, outils d'analyse, hôtes connus pour être
malveillants. Tout ce qui figure sur la liste est résolu vers
0.0.0.0, qui ne mène nulle part.
Le résultat est un réseau qui, du point de vue du navigateur, a la forme
d'internet à ceci près que les domaines publicitaires et de traçage n'ont
aucun enregistrement DNS. Le navigateur demande doubleclick.net, reçoit
« aucune route », et passe à autre chose. Aucune connexion n'est
ouverte. Aucune poignée de main TLS n'est tentée. Aucun cookie ne part
nulle part, parce qu'il n'y a pas de nulle part où l'envoyer.
La même idée qui tourne dans les caves depuis des années.
Si vous avez déjà configuré pi-hole, le petit sinkhole DNS que beaucoup de gens font tourner sur un Raspberry Pi pour filtrer les publicités sur tout leur réseau domestique, l'architecture de Bromure vous semblera profondément familière. La liste de blocage sous-jacente est le fichier hosts unifié de Steven Black, le même que celui qu'utilisent ces installations domestiques depuis des années. Le mouvement conceptuel est identique : ne pas essayer de retirer les publicités de la page, mais simplement refuser d'indiquer au navigateur comment trouver le serveur de la publicité en premier lieu.
La différence importante tient à l'endroit où vit le sinkhole DNS. Un sinkhole à l'échelle du foyer protège chaque appareil du réseau domestique ; un sinkhole Bromure protège exactement un profil de navigateur. Activez-le pour le profil que vous utilisez pour lire les actualités ; laissez-le désactivé pour le profil où votre banque préfère que vous ne passiez pas par un intergiciel inhabituel.
Ce que cela vous apporte concrètement.
Les gains concrets s'accumulent :
Ne peut pas être désactivé par une page compromise
La liste de blocage n'est pas du code chargé par le navigateur ; c'est le réseau du navigateur. Une faille du moteur de rendu, un script hostile, une bibliothèque tierce qui déraille — aucun d'eux ne peut atteindre la configuration de dnsmasq, parce qu'aucun d'eux ne peut sortir du processus du navigateur pour atteindre la pile réseau de la VM.
Les pages ne peuvent pas la contourner du regard
Le JavaScript de la page peut examiner les propriétés de
navigator tant qu'il veut ; il ne peut pas voir la
configuration DNS du réseau sur lequel il se trouve, parce que ce
n'est pas une chose que JavaScript est autorisé à connaître. Pour
la page, une publicité bloquée ressemble exactement à un domaine
publicitaire tombé en panne pendant une minute.
Aucune surface d'attaque liée à l'extension
Les extensions de blocage des publicités ont, à plus d'une occasion, été compromises — par le magasin d'extensions, par un rachat, ou par une mise à jour malveillante. Il n'y a pas d'extension de ce genre à compromettre dans Bromure, parce qu'il n'y a pas d'extension du tout.
Par profil, activable comme n'importe quelle autre option
Le blocage des publicités est un paramètre par profil (« Bloquer les publicités » dans Confidentialité & sécurité), désactivé par défaut, activé dans les profils que vous choisissez. Votre profil bancaire reste non filtré ; votre profil de lecture quotidienne est propre.
Les limites honnêtes.
Rien dans ce domaine n'est gratuit. Voici quelques choses que l'approche au niveau réseau ne fait délibérément pas, et que vous devez savoir d'avance :
Pas de filtrage cosmétique
Une extension classique peut masquer la case vide à l'emplacement où se trouvait une bannière. Bromure ne réécrit pas la page, donc si l'éditeur a réservé un bloc 728×90, le bloc reste là, vide. C'est un petit désagrément cosmétique sur une poignée de sites, et la contrepartie, c'est qu'il n'y a rien dans la page qu'un script puisse remarquer.
Les publicités en première partie survivent
Si un site sert ses propres publicités depuis son propre domaine (comme le font désormais certaines grandes plateformes technologiques), un blocage au niveau du domaine ne peut pas distinguer « article » de « publicité » — toutes deux vivent sous le même nom d'hôte. C'est une véritable faille ; la réponse, là où cela compte, consiste à ajouter une couche de script de contenu par-dessus, un chantier sur lequel nous nous penchons.
Les murs anti-bloqueur détectent toujours l'absence
Certains sites n'ont pas besoin de trouver le bloqueur de publicités. Ils vérifient simplement si un script précis s'est chargé, et refusent d'afficher l'article si ce n'est pas le cas. Pour ces sites, tout bloqueur — extension ou réseau — sera repéré. C'est un débat de politique éditoriale avec l'éditeur, pas un débat technique avec le bloqueur.
La liste de blocage est livrée avec Bromure
Le fichier gravity.list est intégré au moment de la construction
de l'image et se met à jour quand vous mettez Bromure à jour. Il
ne va pas chercher les règles les plus récentes toutes les heures
comme peut le faire un sinkhole domestique dédié et toujours
allumé. Pour une liste fondée sur des noms d'hôte, cela convient
généralement — les domaines publicitaires ne changent pas aussi
vite que, disons, les domaines de maliciels — mais mieux vaut le
savoir.
La forme de la chose.
Le point plus large n'est pas que le bloqueur de publicités de Bromure serait magiquement meilleur qu'uBlock Origin pour faire correspondre des règles. Le moteur de règles d'uBlock est, de fait, plus sophistiqué. Le point concerne l'endroit où a lieu le blocage. Une extension est un arbitre poli qui demande au navigateur de bien vouloir ne pas charger cette chose. Bromure, c'est la route qu'aurait empruntée la requête, discrètement fermée à l'entrée de l'autoroute, avant même que le conducteur ne soit monté dans la voiture.
Le blocage des publicités dans une VM scellée n'est pas une nouvelle fonctionnalité de Bromure ; c'est une conséquence de l'architecture présente depuis le premier jour. La couche réseau de chaque profil est son propre petit monde. Ce monde peut contenir WARP. Il peut contenir un VPN payant. Il peut contenir un transport Tor. Et il peut contenir, gratuitement, le même sinkhole DNS qui filtre discrètement les publicités dans les caves depuis des années — installé, configuré, et limité précisément à la session de navigateur que vous voulez.
Si vous voulez la version longue, la liste de blocage est un fichier texte brut livré à l'intérieur de l'image de la VM — vous pouvez l'inspecter directement à la prochaine version et lire chacun des cent mille domaines qui cesseront discrètement d'exister pour votre navigateur. Si vous voulez juste la version courte, ouvrez Confidentialité & sécurité sur n'importe quel profil Bromure et activez « Bloquer les publicités ». La route est déjà fermée. Il ne vous reste plus qu'à conduire.