- Dans Little Snitch 6.1, le chiffrement DNS pouvait échouer dans certaines situations, mais le problème a été circonscrit à cette version plutôt qu’à macOS dans son ensemble, et corrigé dans la 6.1.1
- Pour un fonctionnement normal, les requêtes DNS de macOS doivent être transmises au proxy DNS de Little Snitch, qui effectue ensuite la résolution chiffrée
- Lors de l’enquête, il a été observé que certaines requêtes via des API héritées de bas niveau n’atteignaient pas le proxy et envoyaient des requêtes UDP 53 non chiffrées au serveur de noms par défaut du système
- La reproduction consiste à activer le chiffrement DNS dans Little Snitch, à lancer Wireshark avec le filtre
port 53, puis à appelergetaddrinfo("dnsproxytest.com")dans un playground Xcode - Les résolutions fondées sur des API de haut niveau, comme celles de Safari et Chrome, semblaient initialement ne pas être affectées, tandis que Firefox semblait l’être, mais le périmètre final a été ramené au proxy DNS de Little Snitch 6.1
Échec du chiffrement DNS survenu dans Little Snitch 6.1
- La fonction de chiffrement DNS de Little Snitch 6 route les résolutions de noms d’hôte vers Little Snitch afin de les traiter sous forme chiffrée
- Pour cela, Little Snitch enregistre un proxy DNS, et macOS doit envoyer toutes les requêtes DNS à ce proxy
- Il a été constaté que certaines requêtes DNS, en particulier celles effectuées via certaines API héritées de bas niveau, n’étaient pas reçues par le proxy
- Ces requêtes pouvaient être envoyées sous forme non chiffrée au serveur de noms par défaut du système, ce qui était visible dans Wireshark sous forme de trafic UDP sur le port 53
- Le trafic de ces résolutions n’apparaissait pas dans Little Snitch Network Monitor, car la résolution contournait entièrement le filtre réseau
Procédure de reproduction et chronologie des mises à jour
-
Procédure de reproduction
- Activer DNS encryption dans les réglages de Little Snitch
- Lancer Wireshark avec le filtre de capture
port 53 - Dans un playground Xcode, lancer une résolution de
dnsproxytest.comavecgetaddrinfo - La résolution de
dnsproxytest.compeut apparaître sur UDP 53 sous forme non chiffrée
-
Portée initiale de l’impact
- Les résolutions DNS via des API de haut niveau semblaient ne pas être affectées
- La navigation web avec Safari et Chrome semblait conserver les bénéfices des résolutions chiffrées
- Firefox semblait être affecté
-
Historique des mises à jour
- 2024-09-17 19:10 : il a été confirmé que ce problème pouvait exister depuis macOS 14.5 Sonoma, et les systèmes 14.x plus anciens n’ont pas pu être testés
- 2024-09-18 12:05 : le problème a été requalifié comme n’étant pas un problème général de proxy DNS de macOS, mais comme n’affectant que le proxy DNS de Little Snitch 6.1
- 2024-09-18 15:52 : le problème a été corrigé dans Little Snitch 6.1.1
2 commentaires
Avis de Hacker News
Le fait que getaddrinfo() soit considéré comme une « API bas niveau héritée » me paraît un peu étrange
Sur macOS, la situation peut être très différente, mais sous Linux et probablement *BSD, c’est la méthode standard utilisée pour la résolution de noms
La plupart des apps macOS utilisent sans doute Foundation ou des frameworks du type NetworkKit pour les requêtes DNS, mais je trouve aussi surprenant que, sous le capot, cela ne finisse pas par descendre vers des appels comme getaddrinfo()
Comme GAI est bloquant, il existe probablement un autre appel asynchrone bas niveau
getaddrinfo_asyncCela dit, Apple ne veut pas que les utilisateurs finaux résolvent eux-mêmes une IP via getaddrinfo ou une variante asynchrone exposée par CF, puis fassent un
connect()vers cette IPDe manière générale, on est incité à se connecter par nom d’hôte, afin qu’Apple puisse gérer en interne son implémentation de happy eyeballs
On peut voir pourquoi Apple n’apprécie pas le modèle getaddrinfo() ici : https://www.ietf.org/proceedings/72/slides/plenaryw-6.pdf. Il y a aussi des notes du présentateur sous chaque diapositive
Le fait que ce soit « bas niveau » ou non dépend du point de vue
Les gens supposent que glibc est la méthode standard dans l’espace utilisateur Linux, mais ce n’est pas forcément obligatoire
Par exemple, systemd a créé son propre mécanisme resolved, qui s’est révélé bien meilleur que celui de glibc
Comme je développe moi aussi un logiciel autonome visant Linux, il est très probable que je finisse un jour par créer quelque chose de similaire
https://man.openbsd.org/man3/asr_run.3
https://github.com/openbsd/src/tree/master/lib/libc/asr
Il existe aussi des différences entre les *BSD
Sur certains systèmes, un appel de fonction peut rester pendant des années la « bonne » méthode, tandis que sur d’autres il peut être réellement obsolète et peu utile
Il s’est avéré que le problème traité ici ne concerne pas macOS dans son ensemble, mais uniquement Little Snitch 6.1, et qu’il doit être corrigé par une mise à jour de Little Snitch plus tard aujourd’hui
Des investigations supplémentaires ont montré que ce bug existait déjà au moins depuis macOS 14.5 Sonoma
Peut-être même avant, mais il n’aurait actuellement pas accès à un système 14.x plus ancien pour le tester
Ou s’ils l’ont simplement vu fonctionner une fois avec CFNetwork, puis ont publié plus tard un billet de blog disant que c’était cassé
Il n’y a pratiquement aucune raison technique qui empêcherait Apple d’autoriser le downgrade
Sequoia, lorsque le pare-feu de macOS est activé et qu’une app est enregistrée comme « bloquer les connexions entrantes », casse la capacité de cette app à utiliser le DNS, et probablement les fonctionnalités basées sur UDP en général
https://waclaw.blog/macos-firewall-blocking-web-browsing-aft...
Si je déconnecte le VPN, tout passe
Je me demande si c’est lié. Le pare-feu macOS est activé, mais je ne bloque pas toutes les connexions entrantes
En allant dans les paramètres DNS de la connexion Wi‑Fi et en ajoutant les serveurs DNS de Google, 8.8.8.8 et 8.8.4.4, le problème a été résolu, et ils ont remplacé les serveurs DNS qui avaient été renseignés automatiquement auparavant
Si les apps font cela, c’est pour empêcher l’utilisateur de bloquer des choses comme la télémétrie
C’est mon ordinateur, donc c’est à moi que devrait revenir la décision finale sur ce qui sort
Le titre laisse entendre que c’est intentionnel ou appliqué de façon privilégiée à Apple, mais en réalité cela ressemble plutôt à un simple bug.
Quand on dit avoir signalé ce genre de chose, ce serait bien de publier aussi le numéro FB et les détails du signalement.
Tant que l’objectif est atteint, la manière de l’implémenter peut être très flexible.
Certains appareils ont déjà commencé à utiliser ce genre de méthode pour contourner le blocage des publicités.
Je me trompe peut-être, mais j’ai comme une impression de déjà-vu : à chaque nouvelle version d’iOS ou de Mac, il y a un problème DNS qui affecte des outils comme Little Snitch ou Mullvad.
Si c’est vrai, on peut vraiment se demander ce que fait Apple pendant des mois de développement et de tests développeurs/bêta.
La mention de Little Snitch prêtait à confusion, mais en lisant davantage, cela ressemble à un bug de LS qui ne se manifeste que dans certains cas.
Si c’est le blog de LS, la seule question est pourquoi c’est décrit comme un bug de macOS.
Je ne dis pas qu’ils ont tort, c’est leur domaine et pas le mien, mais le texte seul ne semble pas vraiment le justifier.
Il me semble qu’Apple avait déprécié l’utilisation de certaines API réseau pour les développeurs tiers.
Mais les apps d’Apple elles-mêmes, par exemple l’App Store, ne sont pas soumises à la même restriction.
Donc, quand on essayait de filtrer le trafic réseau via un pare-feu applicatif avec la nouvelle API, cela échouait parce que l’App Store utilisait l’API legacy.
Cela pourrait faire partie d’un vieux bug que je pensais corrigé depuis longtemps.
Les annonces du genre « Bug découvert dans la nouvelle version de l’OS ! Correctif : en fait, c’était un bug présent depuis assez longtemps ! » sont toujours amusantes.
J’utilise routedns [0] comme résolveur stub local, ce qui me permet de choisir moi-même quelles requêtes vont où et quel mode de transport utiliser.
Il permet aussi les listes de blocage, les réécritures, le cache, la répartition de charge et le traitement des requêtes de secours, donc il offre beaucoup de contrôle.
Pour les requêtes locales, j’utilise un listener stub sur localhost:53, et la plupart des requêtes sont transmises avec cache à Cloudflare 1.1.1.1 via UDP QUIC, c’est-à-dire TLS 0-RTT.
C’est rapide et plutôt sûr.
[0] https://github.com/folbricht/routedns
Merci pour cette information importante.
C’est déjà rassurant de savoir que Safari et Chrome semblent, pour l’instant, pouvoir être considérés comme sûrs.