- Das MV3-Update von Chrome entfernt die Berechtigung
webRequestBlocking, um die Fähigkeiten bestehender Adblocker einzuschränken - Der Autor entdeckte 2023 einen Bug, mit dem sich auch in einer MV3-Umgebung
webRequestBlockingumgehen ließ - Der Bug entstand durch die lockere Struktur der JavaScript-Bindings und alten Code, der unverändert erhalten geblieben war
- Durch Manipulation der WebView-Instanz-ID ließ sich die Rechteprüfung umgehen, sodass die Blocking-Funktion auch unter MV3 nutzbar war
- Inzwischen wurde ein Patch eingespielt, daher funktioniert diese Umgehungsmethode nicht mehr
MV3 und die Veränderungen bei Adblockern
- Chrome schafft MV2-Erweiterungen schrittweise ab und stellt stattdessen auf MV3 um
- MV3 entfernt die Berechtigung
webRequestBlocking, sodass Adblocker Netzwerk-Anfragen nicht mehr per Skript dynamisch blockieren können - Statt dieser Berechtigung wurde die API
declarativeNetRequesthinzugefügt, sie bietet jedoch nicht dieselbe Flexibilität - Durch diese Änderung sinkt die Leistungsfähigkeit von Adblockern deutlich
Grenzen der JavaScript-Binding-Struktur
- Der Chrome-Kern ist zwar in C++ entwickelt, Erweiterungen laufen jedoch in JavaScript, und auch die Erweiterungs-APIs werden über JS-Bindings angesprochen
- Bis 2015–2016 wurden JS-Dateien (Erweiterungs-Binding-Module) in Seiten injiziert, um APIs zu initialisieren und zu prüfen
- Diese Methode war anfällig für das Überschreiben globaler JS-Funktionen und Prototypen, wodurch mehrere Universal-XSS-Bugs entstanden
- Danach verlagerte Google wichtige Bindings nach C++, einige JS-Binding-Dateien sind jedoch bis heute geblieben
- Noch immer verwenden bestimmte APIs wie
chrome.webRequestdiese JS-Binding-Struktur
Umgehung über Klassen für Web-Request-Events
-
In MV2 ließ sich das Blockieren von Web-Requests mit folgendem Code umsetzen
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
In MV3 ist die Option
blockingverboten, daher ist normales Blockieren nicht möglich -
Über den
.constructordeswebRequest-Events lässt sich jedoch ein beliebiges Event-Objekt erzeugen -
Intern verwaltet eine spezielle Wrapper-Klasse aus den JS-Bindings dieses Event-Objekt
-
Wird einer der Konstruktorparameter,
opt_webViewInstanceId, gesetzt, kann die nur für Plattform-Apps gedachte Freigabelogik umgangen und damit die Prüfung der Blocking-Berechtigung übersprungen werdenlet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Ursprünglich war dies nur für Plattform-Apps vorgesehen, durch die unzureichende Prüfung der WebView-ID konnte es jedoch von gewöhnlichen Erweiterungen missbraucht werden
Ergebnis und Sicherheitspatch
- Durch diese Schwachstelle war es tatsächlich möglich, auch in einer MV3-Umgebung einen vollwertigen Adblocker zu entwickeln
- Der Autor meldete den Bug 2023 an Google; in Chrome 118 wurde er durch eine korrekte Prüfung des Besitzes der WebView-Berechtigung gepatcht
- Es wurde keine Prämie ausgezahlt, was auf die strukturelle Eigenschaft zurückgeführt wird, dass nur eine Rechteumgehung ohne zusätzliche Datenoffenlegung möglich war
- Der Fall zeigt, dass einige Dutzend geänderte Codezeilen das Sicherheits-Update eines Großkonzerns wirkungslos machen können
Fazit und Verweis
- Der Bug ist inzwischen gepatcht und funktioniert nicht mehr
- Als ähnlich interessanter Fall einer Schwachstelle rund um Chrome-Erweiterungen existiert auch ein Beispiel, das tatsächlich eine CVE-Nummer und eine Belohnung von 10.000 US-Dollar erhielt (siehe separaten Blogbeitrag)
4 Kommentare
Wahrscheinlich haben die Adblock-Anbieter seit diesem Update sogar noch mehr Umsatz gemacht.
Standalone-Apps, die Werbung gleich auf Netzwerkebene blockieren, sind ohnehin nur kostenpflichtig nutzbar, daher dürften sie sich ziemlich gut verkauft haben.
Ein Schwachstelle zu posten, die nach ganzen zwei Jahren längst jede Bedeutung verloren hat, und dann extra noch zu erwähnen, dass man dafür nicht bezahlt wurde ... persönlich finde ich das nicht gerade cool.
Aber vermutlich muss man so etwas auch in einen Blog schreiben, um den eigenen Wert zu beweisen, oder?
Ehrlich gesagt würde ich diese Denkweise auch gern lernen und viel mehr Blogbeiträge schreiben.
Nehmt einfach Firefox. Er ist in den letzten 1–2 Jahren deutlich schneller geworden und inzwischen wirklich nicht schlecht.
Ich nutze Firefox seit Jahren als Hauptbrowser und vergleiche ihn gelegentlich mit Chrome; gerade in letzter Zeit habe ich das Gefühl, dass Firefox absolut alltagstauglich geworden ist.
Selbst Webseiten wie die koreanischer Banken, die Webstandards früher ignoriert haben, wurden zuletzt stark verbessert, sodass die meisten inzwischen auch in Firefox gut funktionieren.
Anpassungen sind mit Firefox außerdem viel einfacher.
Hacker-News-Kommentare
Obwohl ich Firefox gern einmal ausprobieren würde, sind gelegentliche Bugs beim Laden von Websites und vor allem die Tatsache, dass sich keine PWA (Progressive Web Apps) installieren lassen, die größten Hürden. Chrome und seine Derivate unterstützen das schon seit Langem, und ich verstehe nicht so recht, warum Firefox das noch immer nicht implementiert hat. Ich habe zwar eine Drittanbieter-Erweiterung gefunden (PWAs for Firefox), aber aus Datenschutzgründen zögere ich, sie zu verwenden
Selbst wenn es Wege gibt, Googles Verhalten zu umgehen, halte ich das nicht für den richtigen Weg. Wenn Menschen mit Googles Kurs nicht einverstanden sind, ist der einzige richtige Weg, Chrome und alle Chromium-basierten Browser aufzugeben. Es ist wichtig, Googles Monopol zu schwächen und ihm die Kontrolle über die künftige Richtung des Webs zu entziehen
Die echte Umgehung ist, Firefox zu benutzen. uBlock Origin funktioniert auf Firefox am besten
uBlock Origin works best on Firefox
Ich frage mich auch, ob Google wirklich belegen kann, dass MV3 tatsächlich sicherer ist als MV2. Es wirkt nicht so, als würde der Wechsel zu MV3 die Sicherheit grundsätzlich erhöhen
Zu dem Fall, dass jemand einen Umgehungsweg für Adblocker entdeckt und Google gemeldet hat, gab es die Reaktion: „Findet etwas heraus und petzt dann sofort bei Google, großartig“
Der OP hat bei Google ein „Issue“ gemeldet, das eigentlich überhaupt kein Problem war, und damit verhindert, dass Add-on-Entwickler die MV3-Beschränkungen umgehen können. Hoffentlich war es die 0 $ wert
Seit ich Brave nutze, vermisse ich Chrome überhaupt nicht mehr
Brave
Stop using Brave browser
Auf die Behauptung „Adblocker brauchen unbedingt
webRequestBlocking, und weil Google sein Geld mit Werbung verdient, wurde diese Funktion sehr absichtlich entfernt“ gibt es auch die Gegenmeinung: „Das stimmt nicht, jeder kann uBlock Origin Lite in Chrome und mit Manifest V3 verwenden, die Leistung ist gut und ich merke keinen Unterschied zum bisherigen uBlock Origin. Alles wird in C++ gefiltert und ist dadurch viel schneller. Natürlich gibt es eine Begrenzung bei der maximalen Zahl an Regeln, aber das ist derzeit völlig handhabbar“Außer auf dem Arbeitslaptop nutze ich Chrome gar nicht, und privat bleibe ich weiterhin bei Firefox. Trotzdem finde ich es schade, dass ich uBlock Origin, das mir bei beruflichem Surfen im Web (Recherche, Dokumente usw.) hilfreich war, dort nicht mehr nutzen kann
Wenn man einfach nur eine Umgehung will, muss man eben Firefox installieren