- Der uBlock-Origin-Commit schreibt den Ablauf für CNAME-Uncloaking in der Firefox-Netzwerkverarbeitung neu und sorgt dafür, dass per DNS-Abfrage ermittelte IPs in
details.ipübernommen werden - Der bisherige
cnames-Map-Cache entfällt und wird durch einen Ringpuffer mit 256 Einträgen auf Basis vondnsList,dnsDictunddnsWritePtrsowie einen TTL-Cache von60000msersetzt - Für DNS-Abfragen wird
browser.dns.resolve(hn, [ 'canonical_name' ])verwendet;canonicalNameundaddresses[0]aus dem Ergebnis dienen jeweils als CNAME und IP - Die CNAME-Ausnahmebehandlung für 1st-party, Ignore-Liste und Root-Dokument bleibt erhalten; Hostnamen in Form von IPv4-Adressen oder mit
[am Anfang werden von einer erneuten Abfrage ausgeschlossen - Die minimale Chromium-Version steigt auf
80.0, die minimale Opera-Version auf67.0, und der Standardwert der versteckten EinstellungcnameMaxTTLentfällt
Neustrukturierung des Firefox-DNS-Caches
- Der Code für CNAME-Uncloaking in
platform/firefox/vapi-background-ext.jswechselt von einer globalen Map-zentrierten Struktur zu einer DNS-Cache-Struktur innerhalb der Klasse - Statt des globalen Status
cnameUncloakEnabledund dercnames-Map wird der Cache nun über folgende Felder verwaltetdnsList: RingpufferdnsWritePtr: nächste SchreibpositiondnsMaxCount: maximal256dnsDict: Zuordnung von Hostname zu Ringpuffer-IndexdnsEntryTTL:60000ms
- Im Konstruktor werden
canUncloakCnamesundcnameUncloakEnabledmittrueinitialisiert
Ablauf der Anfrageverarbeitung
onBeforeSuspendableRequest(details)extrahiert den Hostnamen aus der Anfrage-URL und prüft zuerst den Cache mitdnsFromCache(hn)- Hat ein zwischengespeicherter DNS-Eintrag eine
ip, wird sie indetails.ipgesetzt - Wenn das Ergebnis des normalen Aufrufs
super.onBeforeSuspendableRequest(details)bereits mit Abbruch, Redirect oder Ähnlichem endet, wird dieses Ergebnis unverändert zurückgegeben - Ist der gecachte DNS-Eintrag kein
Promise, wird die Folgebehandlung mitonAfterDNSResolution(hn, details, dnsEntry)fortgesetzt - Wenn die Bedingungen für eine erneute DNS-Abfrage nicht erfüllt sind oder
details.proxyInfo?.proxyDNSgesetzt ist, erfolgt keine zusätzliche DNS-Verarbeitung
DNS-Abfrage und Speicherung
dnsShouldResolve(hn)schließt leere Hostnamen, Hostnamen mit[am Anfang und Hostnamen im Format einer IPv4-Adresse von DNS-Abfragen ausdnsResolve(hn, details)registriert den Hostnamen an der aktuellen Position im Ringpuffer und ruftdnsAPI.resolve(hn, [ 'canonical_name' ])auf- Bei erfolgreicher Auflösung wird
dnsToCache(hn, rec, details)ausgeführt, bei einem Fehlschlag bleibt mitdnsToCache(hn)ein leerer Eintrag im Cache zurück dnsToCachespeichert im neuen Cache-Eintraghnund den Ablaufzeitpunkt- Gibt
cnameFromRecordeinen Wert zurück, wird er indnsEntry.cnamegespeichert - Gibt
ipFromRecordeinen Wert zurück, wird er indnsEntry.ipgespeichert
- Gibt
dnsFromCachegibt einen Cache-Eintrag, der einPromiseist, unverändert zurück; abgelaufene Einträge werden ausdnsListunddnsDictentfernt
Bedingungen für die Übernahme von CNAME und IP
cnameFromRecord(hn, record, details)gibt keinen CNAME zurück, wennrecord.canonicalNamefehlt oder mit dem ursprünglichen Hostnamen identisch ist- Ist
cnameIgnore1stPartyaktiviert, werden Fälle ausgeschlossen, in denen CNAME und ursprünglicher Hostname zur gleichen Domain gehören - Ist
cnameIgnoreListgesetzt, werden CNAMEs ausgeschlossen, die nicht auf den entsprechenden regulären Ausdruck passen - Ist
cnameIgnoreRootDocumentaktiviert, wird ausgeschlossen, wenn der Anfrage-Hostname mit dem Hostnamen ausdetails.documentUrl || details.urlübereinstimmt ipFromRecord(record)gibt die erste Adresseaddresses[0]zurück, wennrecord.addressesein nicht leeres Array ist
URL-Umschreibung und nachgelagerte Filterung
onAfterDNSResolutionschreibt die URL mituncloakURLum, wenn der DNS-Eintrag einen CNAME enthält undcnameUncloakEnabledaktiviert ist- Beim Ändern der URL wird die bisherige URL in
details.aliasURLgespeichert und die neue URL indetails.urlübernommen - Wenn der DNS-Eintrag eine IP enthält und diese von
details.ipabweicht, wirddetails.ipaktualisiert - Nur wenn eine CNAME-Umschreibung oder eine Änderung der IP stattfindet, wird
onBeforeSuspendableRequest(details)der Basisklasse erneut aufgerufen uncloakURLsucht die Position des Hostnamens in der URL und ersetzt ihn durch den CNAME; abhängig voncnameReplayFullURLwird entweder die gesamte URL angehängt oder nur der Teil bis vor den Pfad beibehalten
Änderungen an Einstellungen und Manifest
- In
setOptionsentfällt die Verarbeitung voncnameMaxTTL - Bei Optionsänderungen wird statt eines Resets der bisherigen
cnames-Map der DNS-Cache mitdnsList.fill(null)unddnsDict.clear()geleert - Aus den Standardwerten der versteckten Einstellungen in
src/js/background.jswirdcnameMaxTTL: 120entfernt - In
platform/chromium/manifest.jsonwirdminimum_chrome_versionvon73.0auf80.0geändert - In
platform/opera/manifest.jsonwirdminimum_opera_versionvon60.0auf67.0geändert
1 Kommentare
Hacker-News-Kommentare
Der Titel scheint falsch zu sein. uBlock Origin unterstützt diese Funktion bereits seit mehreren Jahren, allerdings nur in Firefox
Das hier wirkt weniger wie eine komplett neue Funktion als eher wie ein Refactoring dieses Codes
Allerdings ist es nicht perfekt, weil man bei einer Domain mit mehreren IPs nicht wissen kann, welche IP der Browser auswählen wird
Wenn jemand einen genaueren und neutraleren Titel vorschlägt, kann man ihn wieder ändern. GitHub-Commits ohne zusätzlichen Kontext eignen sich allerdings meistens nicht besonders gut für einen HN-Thread
Ich bin selbst noch nicht direkt betroffen, überarbeite aber schon Erweiterungen erneut für Firefox, damit ich wechseln kann, falls Chrome uBO wirklich entfernt
In ein paar Releases wird es so weit sein, also sollte man sich vorbereiten
Im schlimmsten Fall ersetzt man
background.service_workerdurchbackground.scripts; wörtlich genommen muss man nur den Schlüsselnamen ändernuBlock Origin ist einer der Gründe, warum Firefox besser wird, und einer der wichtigsten Gründe, Firefox statt Chrome oder anderem zu verwenden
Es macht das Internet überhaupt erst wirklich benutzbar
Seit über zehn Jahren gab es auf einigen Sites Darstellungsprobleme, aber diese Sites hatten auch in Chrome Probleme
Persönlich halte ich Werbung für so etwas wie Krebs der modernen Gesellschaft. Weiße Lügen und andere Lügen, Manipulation, und dazu fließt dort enorm viel Geld hinein — dadurch wird sie für mich eher noch weniger respektabel
Brave ist ebenfalls ein qualitativ hochwertiges Projekt, das ich als Backup nutze, und gelegentlich mische ich auch Vivaldi dazu, wegen der geteilten Fenster und des deutlich besseren Tab-Managements
Bedeutet CNAME Cloaking, dass Werbeseiten zufällig erzeugte Subdomains verwenden, die auf Wildcard-Records zeigen?
Wenn man normalerweise contentsite.com besucht, wird die Werbung von adsite.com ausgeliefert. Eine Adblock-Regel blockiert einfach adsite.com, und die Werbung erscheint nicht
CNAME Cloaking bedeutet, dass die Hauptseite eine Subdomain wie adsite.contentsite.com auf adsite.com zeigen lässt. Dadurch steht der Adblocker vor der nahezu unmöglichen Aufgabe, Millionen von Subdomains zu blockieren, die wie Teil einer legitimen Site aussehen
Die eigentliche Site kann die Subdomains ständig ändern, und der Adblocker hat keine Möglichkeit zu wissen, welche Subdomains legitimer Inhalt und welche Werbung sind. Außerdem werden Inhalte von derselben Domain ausgeliefert, wodurch sich einige Cookie-Richtlinien umgehen lassen und Nutzer besser verfolgt werden können
Mit diesem Update lassen sich Regeln einrichten, die auf Basis der aufgelösten IP filtern
Das ist ein gutes Beispiel dafür, warum Manifest V3 schlecht ist. Per Definition kann es so etwas nicht, und laufzeitbasierte codegestützte Heuristiken sind ebenfalls nicht möglich
Es ist ein Wettrüsten mit Werbetreibenden, und Google verkauft die Waffen an beide Seiten. Den Nutzern wird man nicht das geben, was sie brauchen, um zu gewinnen
Natürlich hängt all das davon ab, ob der Browser-Anbieter — also Google — diese API überhaupt hinzufügen will. Wenn imperative Verarbeitung als „laufender Code“ möglich ist, kann Innovation im User-Space stattfinden, bevor Browser-Hersteller eingebaute Unterstützung liefern
Daher ist die Aussage falsch, dass eine bestimmte Funktion „per Definition“ unmöglich sei
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
CNAME-Cloaking: Nehmen wir zum Beispiel an, SaaS-Anbieter A möchte Unternehmen Q eine schicke Werbe-Tracking-Software bereitstellen.
Früher hätte A das Unternehmen Q wohl angewiesen, auf der Website von Q unter
https://q-company.examplezum Beispiel ein Skript von https://A-ads-tracking.example einzubinden.Dann würde in den von uBlock Origin verwendeten Blocklisten eine Regel wie „Blockiere Anfragen an die Domain A-ads-tracking.example“ auftauchen, und die Werbung würde blockiert.
Bei CNAME-Cloaking betreibt SaaS-Anbieter A den Werbe-Tracking-Dienst nicht unter der Domain A-ads-tracking.example, sondern zum Beispiel unter einer bestimmten IP-Adresse wie 29.1.2.3. Der entscheidende Punkt ist dann, dass SaaS A von Unternehmen Q verlangt, eine Subdomain von q-company.example anzulegen, deren CNAME-Record auf 23.1.2.3 zeigt. Man gibt ihr einen plausiblen Namen wie media.q-company.example.
Nachdem Unternehmen Q diesen CNAME eingerichtet und auf der Website ein Skript-Tag für
media.q-company.exampleeingefügt hat, kann SaaS A alle Nutzer dieser Website verfolgen. Durch diese Umgehungsebene entsteht praktisch ein endloses Katz-und-Maus-Spiel zwischen dem Eigentümer von Unternehmen Q und öffentlichen Blocklisten.Um dieses Problem zu vermeiden, muss Software, die Erweiterungen wie uBlock Origin ausführt, nicht nur die Zieldomain einer Browser-Anfrage sehen können, sondern auch die tatsächliche IP-Adresse dieser Domain. Dieser Commit scheint damit zusammenzuhängen, dieses Verhalten zu ermöglichen oder zumindest dafür zu sorgen, dass der Code dafür besser funktioniert.
Zum Beispiel könnte
media.q-company.exampleein CNAME sein, der aufq-company.ads-tracking.examplezeigt, undq-company.ads-tracking.examplehätte dann einen A-Record, der die IP liefert.Ich weiß nicht, ob der Browser diesen DNS-Zwischennamen an die Erweiterung weitergibt. Deshalb muss so etwas wie uBlock möglicherweise auf IP-Listen zurückgreifen, während DNS-basiertes Filtern wie pihole es einfach mit einer Regel für
ads-tracking.exampleblockieren kann.Wie auch immer: Es ist gut, sowohl browserbasierte als auch DNS-basierte Malware-Blocker zu verwenden.
Das ist langsam und fehleranfällig, aber wenn man sich daran gewöhnt hat, geht es leicht, und gegen solche Arten von Unsinn ist man völlig immun.
Wird Chrome uBO demnächst blockieren? Ich verfolge den neuesten Stand nicht ständig.
Soweit ich weiß, sind Third-Party-Cookies jetzt erlaubt, also ist es vielleicht doch möglich.
Sie entfernen die zentralen APIs, die uBO braucht, um zu erkennen, was nicht geladen werden sollte, und es dann am Laden zu hindern.
Google behauptet, das geschehe aus Gründen der „Performance“ oder „Sicherheit“. Natürlich ist die einzige „Performance“ oder „Sicherheit“, die dadurch tatsächlich nennenswert betroffen ist, die Fähigkeit, schädliche oder werbebezogene Downloads zu identifizieren, abzufangen und zu stoppen, bevor sie überhaupt beginnen.
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
Wenn man eine Chromium-Version verwendet, die nur Manifest V3 unterstützt, wird es ausgeblendet.
Haben einige DNS-Server nicht eine Funktion, bei der es so wirkt, als hätte der Server den CNAME selbst aufgelöst, sodass der Administrator einen Record einträgt, der auf einen anderen DNS-Namen verweist, der Client aber einfach nur einen A- oder AAAA-Record sieht?
uBO hatte diese Funktion schon ziemlich lange. Seit 1.34.0, und in den erweiterten Einstellungen schon seit 1.25.0.
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
Ich meine, ungefähr seit 2021.
Wie ist der uBO-Status bei Brave, Edge und Opera?
https://brave.com/blog/brave-shields-manifest-v3/
Es ist allerdings nicht unbedingt nötig. Brave hat einen ziemlich leistungsfähigen eingebauten Werbeblocker, und soweit ich zuletzt nachgesehen habe, war er in nativen Code kompiliert, dadurch performanter als uBO und unterstützte dieselben Werbelisten vollständig.