- La mise à jour MV3 de Chrome supprime l’autorisation
webRequestBlockingafin de réduire les capacités des bloqueurs de publicité existants - L’auteur a découvert en 2023 un bug permettant de contourner
webRequestBlockingmême dans l’environnement MV3 - Ce bug provenait de la structure fragile des bindings JavaScript et de la présence de vieux morceaux de code conservés tels quels
- En manipulant l’ID d’instance WebView, il était possible de contourner la vérification des autorisations et d’utiliser les fonctions de blocage même dans l’environnement MV3
- Un correctif a désormais été appliqué, et cette méthode de contournement ne fonctionne plus
MV3 et l’évolution des bloqueurs de publicité
- Chrome supprime progressivement les extensions MV2 et poursuit la transition vers MV3
- MV3 retire l’autorisation
webRequestBlocking, empêchant ainsi les bloqueurs de publicité de bloquer dynamiquement les requêtes réseau par script - À la place de cette autorisation, l’API
declarativeNetRequesta été ajoutée, mais elle n’offre pas le même niveau de flexibilité - Ce changement a entraîné une forte baisse des performances des bloqueurs de publicité
Les limites de l’architecture des bindings JavaScript
- Le cœur de Chrome est développé en C++, mais les extensions fonctionnent en JavaScript, et les API d’extension sont également accessibles via des bindings JS
- Jusqu’en 2015–2016, Chrome injectait des fichiers JS (modules de binding d’extension) dans les pages afin d’initialiser et de valider les API
- Cette méthode était vulnérable à l’override des fonctions globales JS et des prototypes, ce qui a provoqué plusieurs bugs Universal XSS
- Google a ensuite migré les principaux bindings vers le C++, mais certains fichiers de bindings JS subsistent encore
- Encore aujourd’hui, certaines API comme
chrome.webRequestreposent sur cette architecture de bindings JS
Contournement via la classe d’événements de requête web
-
En MV2, le blocage des requêtes web pouvait être implémenté avec le code suivant
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
En MV3, l’option
blockingest interdite, ce qui rend le blocage normal impossible -
Cependant, il est possible de créer un objet d’événement arbitraire via le
.constructorde l’événementwebRequest -
En interne, une classe wrapper spéciale des bindings JS gère cet objet d’événement
-
En renseignant
opt_webViewInstanceId, l’un des paramètres du constructeur, il était possible de contourner la logique d’autorisation réservée aux applications de plateforme et d’échapper au contrôle du droit de blocagelet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Le mécanisme était à l’origine conçu pour être utilisé uniquement par les applications de plateforme, mais la validation insuffisante de l’ID WebView permettait son exploitation par des extensions ordinaires
Résultats et correctif de sécurité
- Cette vulnérabilité rendait concrètement possible le développement d’un bloqueur de publicité complet même dans l’environnement MV3
- L’auteur a signalé ce bug à Google en 2023, et il a été corrigé dans Chrome 118 par une vérification correcte de la possession des autorisations WebView
- Aucune prime n’a été versée, en raison de la nature structurelle du problème, qui permettait uniquement un contournement d’autorisation sans exposition supplémentaire de données
- Ce cas montre que quelques dizaines de lignes de code modifiées peuvent neutraliser une mise à jour de sécurité d’un géant technologique
Conclusion et références
- Le bug a désormais été corrigé et ne fonctionne plus
- Parmi d’autres cas intéressants de vulnérabilités liées aux extensions Chrome, il existe aussi un problème ayant réellement reçu un numéro CVE et une récompense de 10�00 $ (voir un autre billet de blog)
4 commentaires
Je pense qu’après cette mise à jour, les éditeurs d’adblock ont sans doute encore augmenté leurs revenus.
Les applications autonomes qui bloquent carrément au niveau du réseau n’étant utilisables qu’en version payante, elles ont probablement dû se vendre plutôt bien.
Publier une faille devenue totalement dénuée d’intérêt après deux ans, tout en prenant soin de préciser qu’elle n’a pas été payée… personnellement, je ne trouve pas ça très classe.
Mais bon, il faut sans doute aussi écrire ce genre de choses sur son blog pour prouver sa valeur, non ?
Honnêtement, j’aimerais moi aussi apprendre cet état d’esprit et écrire beaucoup plus d’articles sur mon blog.
Utilisez simplement Firefox. Il est devenu bien plus rapide ces 1 à 2 dernières années, donc ce n’est pas un mauvais choix.
J’utilise principalement Firefox depuis des années et je le compare de temps en temps à Chrome ; surtout récemment, j’ai l’impression que Firefox est devenu tout à fait utilisable au quotidien.
Même les sites web qui ignoraient les standards du Web, comme ceux des banques coréennes, ont été beaucoup corrigés récemment, donc la plupart fonctionnent désormais bien aussi avec Firefox.
Et la personnalisation est bien plus facile avec Firefox.
Avis Hacker News
Même si j’aimerais essayer Firefox, les bugs occasionnels de chargement de certains sites, ainsi que l’impossibilité d’installer des PWA (Progressive Web Apps), restent les principaux freins. Chrome et les navigateurs qui en dérivent prennent cette fonctionnalité en charge depuis longtemps, et je ne comprends pas vraiment pourquoi Firefox ne l’a toujours pas implémentée. J’ai bien trouvé une extension tierce (PWAs for Firefox), mais j’hésite à l’utiliser pour des raisons de confidentialité
Même s’il existe un moyen de contourner le comportement de Google, je ne pense pas que ce soit la bonne direction. Si les gens ne sont pas d’accord avec ce que fait Google, la seule bonne réponse est d’abandonner Chrome ainsi que tous les navigateurs basés sur Chromium. Il est important d’affaiblir le monopole de Google et de lui retirer son emprise sur l’orientation future du web
Le vrai contournement, c’est d’utiliser Firefox. uBlock Origin fonctionne le mieux sur Firefox
uBlock Origin works best on Firefox
Je doute aussi que MV3 soit réellement plus sûr que MV2 selon Google. Passer à MV3 ne semble pas renforcer fondamentalement la sécurité
À propos du cas où quelqu’un a trouvé une méthode pour contourner les adblockers et l’a signalée à Google, certains ont réagi par un « il l’a trouvée puis est allé immédiatement la dénoncer à Google, génial »
L’OP a signalé à Google un « problème » qui n’en était pas un, empêchant ainsi les développeurs d’extensions de contourner les limitations de MV3. Espérons que cela valait bien 0 $
Depuis que j’ai commencé à utiliser Brave, Chrome ne me manque plus du tout
Brave
Stop using Brave browser
À l’affirmation selon laquelle « un adblocker a absolument besoin de webRequestBlocking, et comme Google gagne de l’argent avec la pub, le retrait de cette fonction est clairement intentionnel », certains répondent que « ce n’est pas vrai, n’importe qui peut utiliser uBlock Origin Lite sur Chrome et manifest v3, les performances sont bonnes et je ne vois pas de différence avec uBlock Origin classique. Tout est filtré en C++, donc c’est bien plus rapide. Il y a bien une limite sur le nombre maximal de règles, mais pour l’instant cela reste tout à fait gérable »
En dehors de mon ordinateur portable professionnel, je n’ai aucune raison d’utiliser Chrome et je continue à utiliser Firefox au quotidien. Cela dit, c’est dommage de ne plus pouvoir utiliser uBlock Origin dans le cadre du travail de navigation web (recherche, documentation, etc.), car cela m’aidait beaucoup
Si on veut simplement un contournement, il suffit d’installer Firefox