1 points par GN⁺ 2024-10-08 | 1 commentaires | Partager sur WhatsApp
  • 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 cnames sous forme de Map disparaît, remplacé par un tampon circulaire de 256 entrées fondé sur dnsList, dnsDict et dnsWritePtr, avec un cache à TTL de 60000ms
  • La résolution DNS utilise browser.dns.resolve(hn, [ 'canonical_name' ]), et exploite respectivement canonicalName et addresses[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é cnameMaxTTL est supprimée

Réécriture de la structure du cache DNS Firefox

  • Le code lié à la désoccultation CNAME dans platform/firefox/vapi-background-ext.js passe d’une structure globale centrée sur une Map à une structure de cache DNS interne à la classe
  • À la place de l’ancien état global cnameUncloakEnabled et de la Map cnames, le cache est géré par les champs suivants
    • dnsList : tampon circulaire
    • dnsWritePtr : prochaine position d’écriture
    • dnsMaxCount : maximum 256
    • dnsDict : mappage des noms d’hôte vers les index du tampon circulaire
    • dnsEntryTTL : 60000ms
  • Dans le constructeur, canUncloakCnames et cnameUncloakEnabled sont 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 avec dnsFromCache(hn)
  • Si l’entrée DNS mise en cache contient une ip, elle est définie dans details.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 avec onAfterDNSResolution(hn, details, dnsEntry)
  • Si les conditions de nouvelle résolution DNS ne sont pas remplies, ou si details.proxyInfo?.proxyDNS est 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 IPv4
  • dnsResolve(hn, details) enregistre le nom d’hôte à la position courante du tampon circulaire et appelle dnsAPI.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
  • dnsToCache stocke dans la nouvelle entrée de cache hn et l’heure d’expiration
    • si cnameFromRecord renvoie une valeur, elle est stockée dans dnsEntry.cname
    • si ipFromRecord renvoie une valeur, elle est stockée dans dnsEntry.ip
  • dnsFromCache renvoie telle quelle l’entrée de cache si c’est une Promise, et supprime les entrées expirées de dnsList et dnsDict

Conditions de prise en compte du CNAME et de l’IP

  • cnameFromRecord(hn, record, details) ne renvoie pas de CNAME si record.canonicalName est absent ou identique au nom d’hôte d’origine
  • Si cnameIgnore1stParty est activé, les cas où le CNAME et le domaine du nom d’hôte d’origine sont identiques sont exclus
  • Si cnameIgnoreList est présent, les CNAME qui ne correspondent pas à cette expression régulière sont exclus
  • Si cnameIgnoreRootDocument est activé, l’entrée est exclue lorsque le nom d’hôte de la requête est identique à celui de details.documentUrl || details.url
  • ipFromRecord(record) renvoie la première adresse, addresses[0], lorsque record.addresses est un tableau non vide

Réécriture d’URL et filtrage ultérieur

  • onAfterDNSResolution réécrit l’URL avec uncloakURL si l’entrée DNS contient un CNAME et que cnameUncloakEnabled est activé
  • Lors du changement d’URL, l’URL existante est stockée dans details.aliasURL, et la nouvelle URL est reflétée dans details.url
  • Si l’entrée DNS contient une IP différente de details.ip actuel, details.ip est 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
  • uncloakURL trouve la position du nom d’hôte dans l’URL et la remplace par le CNAME ; selon la valeur de cnameReplayFullURL, 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 cnameMaxTTL est supprimé de setOptions
  • Lors d’un changement d’option, au lieu d’initialiser l’ancienne Map cnames, le cache DNS est vidé avec dnsList.fill(null) et dnsDict.clear()
  • cnameMaxTTL: 120 est supprimé des valeurs par défaut des réglages cachés dans src/js/background.js
  • Dans platform/chromium/manifest.json, minimum_chrome_version passe de 73.0 à 80.0
  • Dans platform/opera/manifest.json, minimum_opera_version passe de 60.0 à 67.0

1 commentaires

 
GN⁺ 2024-10-08
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

    • C’est encore pris en charge aujourd’hui, et ça l’était déjà avant :P
    • Ça ressemble à plus qu’un simple refactoring. Il semble désormais possible de faire le blocage basé sur l’IP plus tôt, avant que la requête réelle ne parte
      Cela dit, ce n’est pas parfait, car lorsqu’un domaine a plusieurs IP, on ne peut pas savoir quelle IP le navigateur choisira
    • J’ai rétabli le titre de la page. Le titre soumis était « uBlock Origin supports filtering CNAME cloaking sites on Firefox now »
      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

    • Ce n’est pas une question de « si », mais de « quand ». Depuis 2020, c’est déjà une question de « quand », et ça arrive réellement
      Ça débarquera dans quelques versions, donc il faut se préparer
    • Je fais passer ma famille sur Brave. Ils remarquent à peine la différence, et j’ai davantage confiance dans le fait que le navigateur continuera à prendre en charge le filtrage de contenu centré sur l’utilisateur
    • C’est déjà supprimé dans les versions Canary
    • Je ne comprends pas ce que signifie « réécrire les extensions pour Firefox ». Firefox utilise les mêmes API
      Au pire, il faut remplacer background.service_worker par background.scripts, littéralement juste changer le nom d’une clé
    • Pour ceux qui ne savent pas bien, c’est quoi uBO, et quel impact cela a-t-il sur la plupart des extensions ?
  • 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

    • Je suis passé à cette combinaison il y a quelques années et je n’ai jamais vu de raison de repartir. Même chose sur téléphone Android : c’est la seule expérience web mobile utilisable que j’aie vue
      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
    • Cela pourrait changer, car Mozilla est en train de devenir une entreprise publicitaire
    • J’ai utilisé à la fois Brave et Firefox et, honnêtement, je n’ai pas senti de grande différence. Je préfère tout de même Firefox pour sa philosophie et parce qu’il vient d’une organisation à but non lucratif
      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 ?

    • C’est une partie du problème
      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
    • Exact. Les fournisseurs de publicité et d’analytics ont commencé à utiliser cette méthode pour contourner les protections contre les cookies tiers
  • 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

    • Il n’y a aucune raison pour que l’API déclarative de Manifest V3 ne puisse pas fournir cette fonctionnalité. Si j’ai bien lu le commit, elle pourrait même mieux fonctionner en s’intégrant davantage au flux de requêtes avant d’envoyer quoi que ce soit au serveur réel, afin de bloquer selon l’adresse IP qui sera effectivement utilisée
      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
    • Techniquement, Manifest V3 lui-même est distinct des API que le navigateur expose aux extensions. Dans Firefox, Manifest V3 est pris en charge avec les requêtes web bloquantes[1], qui sont l’API de filtrage antérieure à « Manifest V3 »
      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...
    • Il suffit d’abandonner Chrome et d’adopter Firefox
  • 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.example
    Les 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.

    • En réalité, ce n’est pas tout à fait ça. Comme son nom l’indique, on utilise bien un CNAME : un enregistrement qui pointe vers un autre enregistrement, et non un enregistrement A qui pointe vers une IP.
      Par exemple, media.q-company.example peut être un CNAME pointant vers q-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 pour ça qu’en mode avancé de uBlock, il est judicieux de bloquer tout le JavaScript, puis d’ajouter progressivement à la liste d’autorisation les scripts visibles jusqu’à ce que le site fonctionne correctement.
      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 ne bloque pas uBO en tant que tel : avec la nouvelle API de plugins, Manifest V3, il supprime les fonctionnalités du navigateur qui permettaient à uBO de fonctionner.
      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.
    • Ne pas mettre à jour son navigateur est aussi risqué. Il vaut bien mieux passer à Firefox, recevoir les mises à jour et bénéficier d’une prise en charge complète de uBO.
    • Ils procèdent à une suppression progressive, lentement et sur une longue période, pour éviter qu’une mauvaise opinion publique sur le monopole des navigateurs n’explose d’un seul coup. Mais ce calendrier a déjà commencé en juin.
      https://developer.chrome.com/docs/extensions/develop/migrate...
      https://www.bleepingcomputer.com/news/google/google-chrome-w...
    • Pour l’instant, uBlock Origin est encore disponible sur le Chrome Web Store pour les navigateurs Chromium qui prennent en charge Manifest V2.
      Si vous utilisez une version de Chromium qui ne prend en charge que Manifest V3, il est masqué.
    • Franchement, cela dépend probablement beaucoup du fait que les États-Unis continuent ou non à conserver une administration décidée à traîner en justice les entreprises en situation de monopole manifeste.
  • 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.

    • Tu parles sans doute des enregistrements ALIAS.
  • 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 ?

    • Les deux navigateurs propriétaires mentionnés ne m’intéressent pas, mais Brave prévoit de prendre partiellement en charge Manifest V2 aussi longtemps que possible et de maintenir la compatibilité avec uBO.
      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.