1 Punkte von GN⁺ 2024-10-08 | 1 Kommentare | Auf WhatsApp teilen
  • 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 von dnsList, dnsDict und dnsWritePtr sowie einen TTL-Cache von 60000ms ersetzt
  • Für DNS-Abfragen wird browser.dns.resolve(hn, [ 'canonical_name' ]) verwendet; canonicalName und addresses[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 auf 67.0, und der Standardwert der versteckten Einstellung cnameMaxTTL entfällt

Neustrukturierung des Firefox-DNS-Caches

  • Der Code für CNAME-Uncloaking in platform/firefox/vapi-background-ext.js wechselt von einer globalen Map-zentrierten Struktur zu einer DNS-Cache-Struktur innerhalb der Klasse
  • Statt des globalen Status cnameUncloakEnabled und der cnames-Map wird der Cache nun über folgende Felder verwaltet
    • dnsList: Ringpuffer
    • dnsWritePtr: nächste Schreibposition
    • dnsMaxCount: maximal 256
    • dnsDict: Zuordnung von Hostname zu Ringpuffer-Index
    • dnsEntryTTL: 60000ms
  • Im Konstruktor werden canUncloakCnames und cnameUncloakEnabled mit true initialisiert

Ablauf der Anfrageverarbeitung

  • onBeforeSuspendableRequest(details) extrahiert den Hostnamen aus der Anfrage-URL und prüft zuerst den Cache mit dnsFromCache(hn)
  • Hat ein zwischengespeicherter DNS-Eintrag eine ip, wird sie in details.ip gesetzt
  • 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 mit onAfterDNSResolution(hn, details, dnsEntry) fortgesetzt
  • Wenn die Bedingungen für eine erneute DNS-Abfrage nicht erfüllt sind oder details.proxyInfo?.proxyDNS gesetzt 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 aus
  • dnsResolve(hn, details) registriert den Hostnamen an der aktuellen Position im Ringpuffer und ruft dnsAPI.resolve(hn, [ 'canonical_name' ]) auf
  • Bei erfolgreicher Auflösung wird dnsToCache(hn, rec, details) ausgeführt, bei einem Fehlschlag bleibt mit dnsToCache(hn) ein leerer Eintrag im Cache zurück
  • dnsToCache speichert im neuen Cache-Eintrag hn und den Ablaufzeitpunkt
    • Gibt cnameFromRecord einen Wert zurück, wird er in dnsEntry.cname gespeichert
    • Gibt ipFromRecord einen Wert zurück, wird er in dnsEntry.ip gespeichert
  • dnsFromCache gibt einen Cache-Eintrag, der ein Promise ist, unverändert zurück; abgelaufene Einträge werden aus dnsList und dnsDict entfernt

Bedingungen für die Übernahme von CNAME und IP

  • cnameFromRecord(hn, record, details) gibt keinen CNAME zurück, wenn record.canonicalName fehlt oder mit dem ursprünglichen Hostnamen identisch ist
  • Ist cnameIgnore1stParty aktiviert, werden Fälle ausgeschlossen, in denen CNAME und ursprünglicher Hostname zur gleichen Domain gehören
  • Ist cnameIgnoreList gesetzt, werden CNAMEs ausgeschlossen, die nicht auf den entsprechenden regulären Ausdruck passen
  • Ist cnameIgnoreRootDocument aktiviert, wird ausgeschlossen, wenn der Anfrage-Hostname mit dem Hostnamen aus details.documentUrl || details.url übereinstimmt
  • ipFromRecord(record) gibt die erste Adresse addresses[0] zurück, wenn record.addresses ein nicht leeres Array ist

URL-Umschreibung und nachgelagerte Filterung

  • onAfterDNSResolution schreibt die URL mit uncloakURL um, wenn der DNS-Eintrag einen CNAME enthält und cnameUncloakEnabled aktiviert ist
  • Beim Ändern der URL wird die bisherige URL in details.aliasURL gespeichert und die neue URL in details.url übernommen
  • Wenn der DNS-Eintrag eine IP enthält und diese von details.ip abweicht, wird details.ip aktualisiert
  • Nur wenn eine CNAME-Umschreibung oder eine Änderung der IP stattfindet, wird onBeforeSuspendableRequest(details) der Basisklasse erneut aufgerufen
  • uncloakURL sucht die Position des Hostnamens in der URL und ersetzt ihn durch den CNAME; abhängig von cnameReplayFullURL wird entweder die gesamte URL angehängt oder nur der Teil bis vor den Pfad beibehalten

Änderungen an Einstellungen und Manifest

  • In setOptions entfällt die Verarbeitung von cnameMaxTTL
  • Bei Optionsänderungen wird statt eines Resets der bisherigen cnames-Map der DNS-Cache mit dnsList.fill(null) und dnsDict.clear() geleert
  • Aus den Standardwerten der versteckten Einstellungen in src/js/background.js wird cnameMaxTTL: 120 entfernt
  • In platform/chromium/manifest.json wird minimum_chrome_version von 73.0 auf 80.0 geändert
  • In platform/opera/manifest.json wird minimum_opera_version von 60.0 auf 67.0 geändert

1 Kommentare

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

    • Es wird jetzt unterstützt und wurde auch früher schon unterstützt :P
    • Es scheint mehr als nur ein einfaches Refactoring zu sein. Jetzt lässt sich offenbar IP-basiertes Blockieren in einem früheren Schritt durchführen, noch bevor die eigentliche Anfrage rausgeht
      Allerdings ist es nicht perfekt, weil man bei einer Domain mit mehreren IPs nicht wissen kann, welche IP der Browser auswählen wird
    • Ich habe den Titel wieder auf den Seitentitel zurückgesetzt. Der eingereichte Titel war „uBlock Origin supports filtering CNAME cloaking sites on Firefox now“
      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

    • Es ist keine Frage von „falls“, sondern von „wann“. Seit 2020 ist es bereits eine Frage des „wann“, und jetzt kommt es tatsächlich
      In ein paar Releases wird es so weit sein, also sollte man sich vorbereiten
    • Ich stelle meine Familie gerade auf Brave um. Sie merken kaum einen Unterschied, und ich bin zuversichtlicher, dass der Browser nutzerorientierte Inhaltsfilterung weiterhin unterstützen wird
    • In den Canary-Releases wurde es bereits entfernt
    • Ich verstehe nicht, was mit „Erweiterungen für Firefox neu schreiben“ gemeint ist. Firefox nutzt dieselbe API
      Im schlimmsten Fall ersetzt man background.service_worker durch background.scripts; wörtlich genommen muss man nur den Schlüsselnamen ändern
    • Für Leute wie mich, die sich nicht auskennen: Was ist uBO, und welche Auswirkungen hat das auf die meisten Erweiterungen?
  • uBlock 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

    • Ich bin vor ein paar Jahren auf diese Kombination umgestiegen und habe seitdem keinen einzigen Grund gesehen, sie wieder zu verlassen. Das gilt genauso für mein Android-Handy; es ist die einzige mobile Web-Erfahrung, die ich je wirklich brauchbar fand
      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
    • Das könnte sich ändern, weil Mozilla zu einer Werbefirma wird
    • Ich habe sowohl Brave als auch Firefox benutzt und ehrlich gesagt keinen großen Unterschied bemerkt. Trotzdem bevorzuge ich Firefox wegen seiner Philosophie und weil es von einer Non-Profit-Organisation stammt
      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?

    • Das ist ein Teil davon
      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
    • Genau. Werbe- und Analytics-Anbieter haben angefangen, diese Methode zu verwenden, um den Schutz vor Third-Party-Cookies zu umgehen
  • 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

    • Es gibt keinen Grund, warum die deklarative Manifest-V3-API so eine Funktion nicht bereitstellen könnte. Wenn ich den Commit korrekt gelesen habe, könnte es sogar besser funktionieren, indem es stärker in den Anfragefluss integriert wird und auf Basis der tatsächlich verwendeten IP blockiert, bevor überhaupt etwas an den echten Server gesendet wird
      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
    • Technisch gesehen ist Manifest V3 selbst von den APIs getrennt, die der Browser Erweiterungen bereitstellt. In Firefox wird Manifest V3 zusammen mit blockierenden Web-Requests [1] unterstützt; das ist die Filter-API von vor „Manifest V3“
      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...
    • Man muss Chrome nur aufgeben und Firefox akzeptieren
  • 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.example zum 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.example eingefü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.

    • Genau genommen ist es etwas anders. Wie der Name sagt, wird ein CNAME verwendet, also ein Record, der auf einen anderen Record zeigt, nicht ein A-Record, der auf eine IP verweist.
      Zum Beispiel könnte media.q-company.example ein CNAME sein, der auf q-company.ads-tracking.example zeigt, und q-company.ads-tracking.example hä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.example blockieren kann.
      Wie auch immer: Es ist gut, sowohl browserbasierte als auch DNS-basierte Malware-Blocker zu verwenden.
    • Deshalb ist es sinnvoll, im erweiterten Modus von uBlock das gesamte JavaScript zu blockieren und dann nach und nach die sichtbaren Skripte auf die Allowlist zu setzen, bis die Website korrekt funktioniert.
      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 blockieren nicht uBO selbst, sondern führen die neue Plugin-API Manifest V3 ein und entfernen dabei Browser-Funktionen, die uBO zum Funktionieren brauchte.
      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.
    • Den Browser nicht zu aktualisieren, ist ebenfalls riskant. Es ist viel besser, zu Firefox zu wechseln, dort weiter Updates zu bekommen und uBO vollständig unterstützt zu haben.
    • Sie schaffen es über einen langen Zeitraum langsam und schrittweise ab, um einen plötzlichen Ausbruch schlechter Publicity wegen Browser-Monopolen zu vermeiden. Aber dieser Zeitplan hat bereits im Juni begonnen.
      https://developer.chrome.com/docs/extensions/develop/migrate...
      https://www.bleepingcomputer.com/news/google/google-chrome-w...
    • Derzeit ist uBlock Origin im Chrome Web Store für Chromium-Browser, die Manifest V2 unterstützen, noch vorhanden.
      Wenn man eine Chromium-Version verwendet, die nur Manifest V3 unterstützt, wird es ausgeblendet.
    • Ehrlich gesagt hängt es wahrscheinlich stark davon ab, ob die USA weiterhin eine Regierung behalten, die bereit ist, gegen offen monopolistische Unternehmen gerichtlich vorzugehen.
  • 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?

    • Ich glaube, du meinst einen ALIAS-Record.
  • 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?

    • Für die beiden genannten Monopol-Browser interessiere ich mich nicht, aber Brave will Manifest V2 so lange wie möglich teilweise unterstützen und die uBO-Kompatibilität aufrechterhalten.
      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.