- Le commit d’uBlock Origin réécrit le flux de désoccultation CNAME dans le traitement réseau de Firefox, et fait en sorte que l’IP obtenue par résolution DNS soit reflétée dans
details.ip - L’ancien cache
cnamessous forme de Map disparaît, remplacé par un tampon circulaire de 256 entrées fondé surdnsList,dnsDictetdnsWritePtr, avec un cache à TTL de60000ms - La résolution DNS utilise
browser.dns.resolve(hn, [ 'canonical_name' ]), et exploite respectivementcanonicalNameetaddresses[0]du résultat comme CNAME et IP - Le traitement des exceptions CNAME conserve les conditions 1st-party, ignore list et root document, et exclut des nouvelles résolutions les adresses IPv4 ou les noms d’hôte commençant par
[ - La version minimale de Chromium passe à
80.0, celle d’Opera à67.0, et la valeur par défaut du réglage cachécnameMaxTTLest supprimée
Réécriture de la structure du cache DNS Firefox
- Le code lié à la désoccultation CNAME dans
platform/firefox/vapi-background-ext.jspasse d’une structure globale centrée sur une Map à une structure de cache DNS interne à la classe - À la place de l’ancien état global
cnameUncloakEnabledet de la Mapcnames, le cache est géré par les champs suivantsdnsList: tampon circulairednsWritePtr: prochaine position d’écriturednsMaxCount: maximum256dnsDict: mappage des noms d’hôte vers les index du tampon circulairednsEntryTTL:60000ms
- Dans le constructeur,
canUncloakCnamesetcnameUncloakEnabledsont initialisés àtrue
Flux de traitement des requêtes
onBeforeSuspendableRequest(details)extrait le nom d’hôte depuis l’URL de la requête, puis vérifie d’abord le cache avecdnsFromCache(hn)- Si l’entrée DNS mise en cache contient une
ip, elle est définie dansdetails.ip - Si le résultat de l’appel de base à
super.onBeforeSuspendableRequest(details)se termine par une annulation, une redirection ou autre, ce résultat est renvoyé tel quel - Si l’entrée DNS mise en cache n’est pas une
Promise, le traitement se poursuit aveconAfterDNSResolution(hn, details, dnsEntry) - Si les conditions de nouvelle résolution DNS ne sont pas remplies, ou si
details.proxyInfo?.proxyDNSest présent, aucun traitement DNS supplémentaire n’est effectué
Résolution DNS et mode de stockage
dnsShouldResolve(hn)exclut de la résolution DNS les noms d’hôte vides, ceux qui commencent par[et les formes correspondant à une adresse IPv4dnsResolve(hn, details)enregistre le nom d’hôte à la position courante du tampon circulaire et appellednsAPI.resolve(hn, [ 'canonical_name' ])- En cas de réussite de la résolution,
dnsToCache(hn, rec, details)est exécuté ; en cas d’échec,dnsToCache(hn)laisse une entrée vide dans le cache dnsToCachestocke dans la nouvelle entrée de cachehnet l’heure d’expiration- si
cnameFromRecordrenvoie une valeur, elle est stockée dansdnsEntry.cname - si
ipFromRecordrenvoie une valeur, elle est stockée dansdnsEntry.ip
- si
dnsFromCacherenvoie telle quelle l’entrée de cache si c’est unePromise, et supprime les entrées expirées dednsListetdnsDict
Conditions de prise en compte du CNAME et de l’IP
cnameFromRecord(hn, record, details)ne renvoie pas de CNAME sirecord.canonicalNameest absent ou identique au nom d’hôte d’origine- Si
cnameIgnore1stPartyest activé, les cas où le CNAME et le domaine du nom d’hôte d’origine sont identiques sont exclus - Si
cnameIgnoreListest présent, les CNAME qui ne correspondent pas à cette expression régulière sont exclus - Si
cnameIgnoreRootDocumentest activé, l’entrée est exclue lorsque le nom d’hôte de la requête est identique à celui dedetails.documentUrl || details.url ipFromRecord(record)renvoie la première adresse,addresses[0], lorsquerecord.addressesest un tableau non vide
Réécriture d’URL et filtrage ultérieur
onAfterDNSResolutionréécrit l’URL avecuncloakURLsi l’entrée DNS contient un CNAME et quecnameUncloakEnabledest activé- Lors du changement d’URL, l’URL existante est stockée dans
details.aliasURL, et la nouvelle URL est reflétée dansdetails.url - Si l’entrée DNS contient une IP différente de
details.ipactuel,details.ipest mis à jour - La méthode
onBeforeSuspendableRequest(details)de la classe de base n’est rappelée que si une réécriture CNAME ou une modification d’IP a eu lieu uncloakURLtrouve la position du nom d’hôte dans l’URL et la remplace par le CNAME ; selon la valeur decnameReplayFullURL, elle rattache l’URL complète ou ne conserve que le début jusqu’avant le chemin
Changements de configuration et de manifest
- Le traitement de
cnameMaxTTLest supprimé desetOptions - Lors d’un changement d’option, au lieu d’initialiser l’ancienne Map
cnames, le cache DNS est vidé avecdnsList.fill(null)etdnsDict.clear() cnameMaxTTL: 120est supprimé des valeurs par défaut des réglages cachés danssrc/js/background.js- Dans
platform/chromium/manifest.json,minimum_chrome_versionpasse de73.0à80.0 - Dans
platform/opera/manifest.json,minimum_opera_versionpasse de60.0à67.0
1 commentaires
Avis sur Hacker News
Le titre me semble incorrect. uBlock Origin prend déjà en charge cette fonctionnalité depuis plusieurs années, mais seulement sous Firefox
Il s’agit plutôt d’un refactoring de ce code que d’une fonctionnalité entièrement nouvelle
Cela dit, ce n’est pas parfait, car lorsqu’un domaine a plusieurs IP, on ne peut pas savoir quelle IP le navigateur choisira
Si quelqu’un propose un titre plus exact et neutre, on pourra le changer à nouveau. Cela dit, les commits GitHub sans contexte supplémentaire ne font généralement pas de très bons fils HN
Je n’ai pas encore été directement touché, mais si Chrome finit vraiment par tuer uBO, je retouche déjà mes extensions pour Firefox afin de pouvoir migrer
Ça débarquera dans quelques versions, donc il faut se préparer
Au pire, il faut remplacer
background.service_workerparbackground.scripts, littéralement juste changer le nom d’une cléuBlock Origin est l’un des éléments qui rendent Firefox bien meilleur, et l’une des grandes raisons d’utiliser Firefox plutôt que Chrome et consorts
Il rend Internet réellement navigable
En plus de dix ans, j’ai eu quelques problèmes d’affichage sur certains sites, mais ces sites avaient aussi des problèmes sous Chrome
À titre personnel, je considère la publicité comme un cancer de la société moderne. Elle mêle petits mensonges, mensonges tout court et manipulation, et le fait que des sommes énormes y circulent ne la rend pas plus respectable, au contraire
Brave est aussi un projet de qualité, je l’utilise en solution de secours, et parfois je mélange avec Vivaldi pour le fractionnement de fenêtres et une gestion des onglets bien meilleure
Le CNAME cloaking, est-ce que cela désigne le fait que les sites publicitaires utilisent des sous-domaines générés aléatoirement pointant vers des enregistrements wildcard ?
En général, quand on visite contentsite.com, les publicités sont servies depuis adsite.com. Les règles de blocage de pub bloquent adsite.com, et les pubs n’apparaissent pas
Le CNAME cloaking consiste pour le site principal à faire pointer un sous-domaine comme adsite.contentsite.com vers adsite.com. Le bloqueur de pubs se retrouve alors face à une tâche presque impossible : bloquer des millions de sous-domaines qui semblent appartenir à un site légitime
Le site légitime peut continuer à changer de sous-domaines, et le bloqueur de pubs n’a aucun moyen de savoir lesquels correspondent à du contenu normal et lesquels correspondent à de la publicité. En plus, comme le contenu est servi depuis le même domaine, cela permet aussi de contourner certaines politiques de cookies pour mieux suivre les utilisateurs
Cette mise à jour permet de définir des règles de filtrage basées sur l’IP résolue
C’est un bon exemple de pourquoi Manifest V3 est mauvais. Par définition, il ne peut pas faire ce genre de choses, et les heuristiques basées sur du code au moment de l’exécution sont impossibles
C’est une course aux armements avec les annonceurs, et Google vend des armes aux deux camps. Il ne donnera pas aux utilisateurs ce dont ils ont besoin pour gagner
Bien sûr, tout cela dépend de la volonté du fournisseur du navigateur, c’est-à-dire Google, d’ajouter cette API. Pouvoir faire du traitement impératif avec du « code à l’exécution » permet d’innover côté utilisateur avant que les éditeurs de navigateurs n’intègrent un support natif
Dire qu’une fonctionnalité donnée est impossible « par définition » est donc faux
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
Cloaking CNAME : par exemple, supposons que le fournisseur SaaS A veuille proposer à l’entreprise Q un super logiciel de suivi publicitaire.
Avec l’ancienne méthode, A aurait demandé d’insérer sur le site de l’entreprise Q, situé à
https://q-company.example, un script provenant par exemple de https://A-ads-tracking.exampleLes listes de blocage utilisées par uBlock Origin auraient alors une règle du type « bloquer les requêtes vers le domaine A-ads-tracking.example », et la publicité serait bloquée.
Le cloaking CNAME consiste pour le fournisseur SaaS A à héberger le service de suivi publicitaire non pas sur le domaine A-ads-tracking.example, mais par exemple à une adresse IP précise comme 29.1.2.3. Et le point important, c’est que le SaaS A demande à l’entreprise Q de créer un sous-domaine de q-company.example et de faire en sorte que son enregistrement CNAME pointe vers 23.1.2.3. On lui donne un nom crédible, comme media.q-company.example.
Une fois que l’entreprise Q a configuré ce CNAME et ajouté une balise de script
media.q-company.exampleà son site, le SaaS A peut suivre tous les utilisateurs de ce site. À cause de cette couche de contournement, cela crée de fait un jeu du chat et de la souris sans fin entre le propriétaire de l’entreprise Q et les listes de blocage publiques.Pour éviter ce problème, le logiciel qui exécute une extension comme uBlock Origin doit pouvoir voir non seulement le domaine cible des requêtes du navigateur, mais aussi l’adresse IP réelle de ce domaine. Ce commit semble lié au fait de rendre ce comportement possible, ou au moins de faire mieux fonctionner le code correspondant.
Par exemple,
media.q-company.examplepeut être un CNAME pointant versq-company.ads-tracking.example, lequel possède ensuite un enregistrement A qui fournit l’IP.Je ne sais pas si le navigateur fournit aux extensions les noms DNS intermédiaires. Donc quelque chose comme uBlock peut devoir s’appuyer sur des listes d’IP, mais un filtrage DNS comme pihole peut simplement bloquer avec une règle sur
ads-tracking.example.Quoi qu’il en soit, il vaut mieux utiliser à la fois un bloqueur de nuisances côté navigateur et côté DNS.
C’est lent et propice aux erreurs, mais une fois qu’on a pris l’habitude, ça devient plus simple, et on est totalement immunisé contre ce genre de magouilles.
Chrome va-t-il bloquer uBO ? Je ne suis pas toujours l’actualité la plus récente.
Je croyais que les cookies tiers étaient désormais autorisés, donc c’est peut-être possible.
Il retire les API essentielles dont uBO a besoin pour identifier ce qui ne doit pas être chargé, puis empêcher son chargement.
Google affirme que c’est pour des raisons de « performances » ou de « sécurité ». Bien sûr, les seules « performances » ou la seule « sécurité » réellement touchées sont la capacité à identifier, intercepter et interrompre les téléchargements nuisibles ou liés à la publicité avant qu’ils ne commencent.
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
Si vous utilisez une version de Chromium qui ne prend en charge que Manifest V3, il est masqué.
Certains serveurs DNS n’ont-ils pas une fonctionnalité qui se comporte comme un CNAME résolu par le serveur ? Le genre où l’administrateur met un enregistrement pointant vers un autre nom DNS, mais où le client ne voit que l’enregistrement A ou AAAA.
uBO dispose de cette fonctionnalité depuis un bon moment. C’était depuis la version 1.34.0, et depuis la 1.25.0 dans les paramètres avancés.
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
De mémoire, ça remonte à peu près à 2021.
Quel est l’état de uBO sur Brave, Edge et Opera ?
https://brave.com/blog/brave-shields-manifest-v3/
Cela dit, ce n’est pas vraiment indispensable. Brave intègre son propre bloqueur de publicités, assez puissant ; la dernière fois que j’ai vérifié, il était compilé en code natif, plus performant que uBO, et prenait aussi entièrement en charge les mêmes listes publicitaires.