- Bei Little Snitch 6.1 konnte die DNS-Verschlüsselung in bestimmten Situationen fehlschlagen; inzwischen wurde das Problem nicht als allgemeines macOS-Problem, sondern auf diese Version eingegrenzt und in 6.1.1 behoben
- Für korrektes Verhalten müssen DNS-Anfragen von macOS an den DNS-Proxy von Little Snitch weitergeleitet werden, der dann die verschlüsselte Abfrage ausführt
- Während der Untersuchung wurde beobachtet, dass einige Anfragen über Low-Level-Legacy-APIs den Proxy nicht erreichten und stattdessen unverschlüsselte UDP-53-Abfragen an den Standard-Nameserver des Systems sendeten
- Reproduzieren lässt sich dies, indem man in Little Snitch die DNS-Verschlüsselung aktiviert, Wireshark mit dem Filter
port 53ausführt und anschließend in einem Xcode Playgroundgetaddrinfo("dnsproxytest.com")aufruft - Abfragen auf Basis von High-Level-APIs, etwa in Safari und Chrome, schienen zunächst nicht betroffen zu sein; Firefox schien betroffen zu sein, doch der endgültige Umfang wurde auf den DNS-Proxy von Little Snitch 6.1 eingegrenzt
Fehlgeschlagene DNS-Verschlüsselung in Little Snitch 6.1
- Die DNS-Verschlüsselungsfunktion von Little Snitch 6 leitet Hostnamen-Abfragen an Little Snitch weiter, wo sie in verschlüsselter Form verarbeitet werden
- Dafür registriert Little Snitch einen DNS-Proxy, und macOS muss alle DNS-Anfragen an diesen Proxy senden
- Es wurde festgestellt, dass einige DNS-Anfragen, insbesondere solche über bestimmte Low-Level-Legacy-APIs, nicht beim Proxy ankamen
- Diese Anfragen konnten unverschlüsselt an den Standard-Nameserver des Systems gesendet werden und waren in Wireshark als Traffic auf UDP-Port 53 sichtbar
- Im Little Snitch Network Monitor wurde dieser Abfrage-Traffic nicht angezeigt, da die Abfrage den Netzwerkfilter vollständig umging
Reproduktionsschritte und Verlauf der Updates
-
Reproduktionsschritte
- In den Einstellungen von Little Snitch DNS encryption aktivieren
- Wireshark mit dem Capture-Filter
port 53ausführen - In einem Xcode Playground eine Abfrage von
dnsproxytest.commitgetaddrinfoausführen - Die Abfrage von
dnsproxytest.comkann auf UDP 53 in unverschlüsselter Form sichtbar sein
-
Anfänglicher Umfang der Auswirkungen
- DNS-Abfragen über High-Level-APIs schienen nicht betroffen zu sein
- Web-Browsing mit Safari und Chrome schien weiterhin von verschlüsselten Abfragen zu profitieren
- Firefox schien betroffen zu sein
-
Update-Verlauf
- 2024-09-17 19:10: Es wurde bestätigt, dass dieses Problem möglicherweise seit macOS 14.5 Sonoma existierte; ältere 14.x-Systeme konnten nicht getestet werden
- 2024-09-18 12:05: Das Problem wurde nicht als allgemeines DNS-Proxy-Problem von macOS, sondern als Problem eingeordnet, das nur den DNS-Proxy von Little Snitch 6.1 betrifft
- 2024-09-18 15:52: Das Problem wurde in Little Snitch 6.1.1 behoben
2 Kommentare
Hacker-News-Meinungen
Es fühlt sich etwas seltsam an, dass getaddrinfo() als „Low-Level-Legacy-API“ behandelt wird.
Unter macOS kann die Lage deutlich anders sein, aber unter Linux und vermutlich *BSD ist es der Standardweg für Namensauflösung.
Die meisten macOS-Apps verwenden für DNS-Abfragen wohl Frameworks wie Foundation oder NetworkKit; überraschend ist aber auch, dass diese intern offenbar nicht letztlich auf Aufrufe wie getaddrinfo() heruntergehen.
Da GAI blockierend ist, gibt es vermutlich einen anderen Low-Level-asynchronen Aufruf.
getaddrinfo_async.Allerdings will Apple nicht, dass Endnutzer IPs direkt über getaddrinfo oder die von CF bereitgestellten asynchronen Varianten auflösen und dann per
connect()zu dieser IP verbinden.Insgesamt wird man dazu angehalten, per Hostname zu verbinden, damit Apple intern die Happy-Eyeballs-Implementierung handhaben kann.
Warum Apple das getaddrinfo()-Modell nicht bevorzugt, sieht man unter https://www.ietf.org/proceedings/72/slides/plenaryw-6.pdf. Unter jeder Folie gibt es auch Vortragenden-Notizen.
Ob es „Low-Level“ ist, hängt von der Perspektive ab.
Leute nehmen an, glibc sei der Standardweg im Linux-Userspace, aber das muss nicht zwingend so sein.
Zum Beispiel hat systemd seinen eigenen resolved-Mechanismus gebaut, der sich als deutlich besser herausgestellt hat als die glibc-Seite.
Ich baue ebenfalls eigenständige Software für Linux, daher ist es gut möglich, dass ich irgendwann selbst etwas Ähnliches baue.
https://man.openbsd.org/man3/asr_run.3
https://github.com/openbsd/src/tree/master/lib/libc/asr
Auch zwischen den *BSDs gibt es Unterschiede.
Auf einem System kann ein Funktionsaufruf über Jahre hinweg beibehalten werden und der „richtige“ Weg sein, während er auf einem anderen System tatsächlich veraltet und wenig nützlich sein kann.
Es hat sich herausgestellt, dass das hier behandelte Problem kein macOS-weites Problem ist, sondern nur Little Snitch 6.1 betrifft; es soll später heute mit einem Little-Snitch-Update behoben werden.
Weitere Untersuchungen haben ergeben, dass dieser Bug mindestens seit macOS 14.5 Sonoma existierte.
Vielleicht sogar schon früher, aber offenbar gibt es derzeit keinen Zugriff auf ein älteres 14.x-System zum Testen.
Oder ob man es einmal mit CFNetwork funktionieren sah, es dabei beließ und später einen Blogpost darüber schrieb, dass es kaputt sei.
Es gibt praktisch keinen technischen Grund, warum Apple Downgrades nicht erlauben könnte.
Sequoia macht, wenn die macOS-Firewall aktiviert ist und eine App mit „eingehende Verbindungen blockieren“ registriert ist, die Fähigkeit dieser App zur DNS-Nutzung kaputt, vermutlich auch UDP-basierte Funktionen allgemein.
https://waclaw.blog/macos-firewall-blocking-web-browsing-aft...
Wenn ich das VPN trenne, geht alles durch.
Ich frage mich, ob das damit zusammenhängt. Die macOS-Firewall ist aktiviert, aber nicht „alle eingehenden Verbindungen blockieren“.
Als ich in den DNS-Einstellungen der WLAN-Verbindung die Google-DNS-Server 8.8.8.8 und 8.8.4.4 hinzugefügt habe, war es behoben; sie ersetzten die zuvor automatisch eingetragenen DNS-Server.
Der Grund, warum Apps das tun, ist, dass sie verhindern wollen, dass Nutzer Dinge wie Telemetrie blockieren.
Es ist mein Computer, also sollte ich die letzte Entscheidungsgewalt darüber haben, was nach außen geht.
Der Titel deutet an, dass dies absichtlich oder privilegiert für Apple gilt, tatsächlich wirkt es aber eher einfach wie ein Bug
Wenn man so etwas meldet, wäre es gut, auch die FB-Nummer und Details zur Meldung mit zu veröffentlichen
Solange das Ziel erreicht wird, ist die Implementierung beliebig flexibel
Einige Geräte beginnen bereits, solche Verfahren zu nutzen, um Adblocker zu umgehen
Vielleicht täusche ich mich, aber ich habe ein Déjà-vu, dass es bei jedem neuen iOS- oder Mac-Release DNS-Probleme gibt, die Dinge wie Little Snitch und Mullvad betreffen
Falls das stimmt, fragt man sich wirklich, was Apple während der monatelangen Entwickler- und Beta-Tests macht
Die Erwähnung von Little Snitch hat mich verwirrt, aber nach weiterem Lesen wirkt es wie ein LS-Bug, der nur in bestimmten Fällen auftritt
Wenn das der LS-Blog ist, bleibt meine einzige Frage, warum es wie ein macOS-Bug beschrieben wird
Ich meine nicht, dass das falsch ist; das ist ihr Fachgebiet, nicht meins, aber allein aus dem Text wirkt es nicht besonders gut begründet
Ich meine mich zu erinnern, dass Apple die Nutzung bestimmter Netzwerk-APIs für Drittentwickler deprecated hatte
Apples eigene Apps, etwa der App Store, unterliegen aber nicht denselben Einschränkungen
Wenn man also versucht hat, Netzwerk-Traffic mit der neuen API über eine App-Firewall zu filtern, scheiterte das, weil der App Store die Legacy-API verwendete
Das könnte Teil eines alten Bugs sein, von dem ich dachte, er sei längst behoben
Ankündigungen wie „Bug in neuem OS-Release gefunden! Korrektur: Tatsächlich war es ein Bug, den es schon ziemlich lange gibt!“ sind immer amüsant
Ich nutze routedns [0] als lokalen Stub-Resolver und wähle selbst aus, welche Anfragen wohin gehen und welches Transportverfahren verwendet wird
Es kann auch Blocklisten, Rewrites, Cache, Load Balancing und Fallback-Request-Handling, wodurch man viel Kontrolle hat
Für lokale Anfragen verwende ich einen Stub-Listener auf localhost:53, und die meisten Anfragen werden mit Cache über UDP QUIC, also TLS 0-RTT, an Cloudflare 1.1.1.1 weitergeleitet
Schnell und ziemlich sicher
[0] https://github.com/folbricht/routedns
Vielen Dank für diese wichtigen Informationen.
Es ist auf jeden Fall beruhigend, dass man sich bei Safari und Chrome erst einmal keine Sorgen machen muss.