A propos du choix aléatoire des ports source DNS

Gazette Linux n°153 — Août 2008

(Adaptation française): Nicolas Provost

Relecture de la version française : Deny

Article paru dans le n°153 de la Gazette Linux d'août 2008.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Note

[note de l'auteur] cet article a été conçu à partir d'extraits des messages d'une liste de discussion, deux semaines après la révèlation de la maintenant célèbre faille de sécurité DNS et quelques heures après que la société de conseil en sécurité informatique Matasano n'ait dévoilé en détails et accidentellement sur son blog comment exploiter cette faille.

Cet article a été écrit spécialement pour la majorité d'entre vous qui ne gérez pas vos propres serveurs DNS (Domain Name System), parce que chacun est concerné dans l'affaire, pas seulement les administrateurs systèmes.

Quand une application (disons, un navigateur web ou un client de messagerie par exemple) doit communiquer avec un ordinateur distant, elle invoque le service de noms de domaines (DNS). Pour les systèmes Linux, cela se fait par l'intermédiaire d'une petite librairie (héritage un peu inquiètant de l'ancien et peu cohérent code de Bind 8) incluse dans la librairie système en C, et appelée résolveur. Ce résolveur, qui est un composant côté client du système de noms de domaines sous TCP/IP, utilise /etc/resolv.conf (sous Linux) comme principal fichier de configuration (parfois aussi /etc/nsswitch.conf, mais nous n'allons pas approfondir maintenant).

Pour les 98% d'entre vous qui obtenez votre adresse IP ainsi que la configuration du service de noms de domaines et du routage, etc., via le service DHCP, ce fichier resolv.conf est modifié fréquemment, chaque fois que votre bail DHCP est renouvelé. Jetez un oeil à votre fichier /etc/resolv.conf. Ce fichier est très simple. Voici son contenu sur mon serveur :

search linuxmafia.com deirdre.org
nameserver 198.144.192.2
nameserver 198.144.192.4
nameserver 198.144.195.186 

La première ligne signifie « si quelqu'un cherche à accéder à une machine sans donner son nom complet, essayer d'ajouter au nom fourni le suffixe 'linuxmafia.com' par défaut, ou encore 'deirdre.org' avant d'abandonner ». Les trois dernières lignes donnent les adresses IP des trois serveurs DNS auxquels le resolveur (client) transmettra les demandes.

Vous vous rappelez que ces lignes sont communiquées par votre serveur DHCP (il est également possible de modifier le comportement du client DHCP sur ce point). Si vous gérez votre propre serveur DHCP, par exemple associé à un boitier pare-feu, vous pouvez spécifier quelles données de configuration vont être transmises avec votre bail DHCP.

Peu importe comment, votre résolveur va transmettre chaque requête à un des serveurs de noms de domaines mentionnés dans le fichier resolv.conf. Que fait alors le serveur contacté ? Tout se passe comme quand vous effectuez une recherche : ou bien vous trouvez la réponse, ou bien vous connaissez quelqu'un qui doit connaître la réponse. Dans le système DNS, cela se traduit par :

- ou bien le serveur traitant la demande est un serveur bien identifié au niveau mondial comme faisant « autorité » à propos du nom de domaine concerné,
- ou bien le serveur interrogé n'est pas la réfèrence pour ce domaine, mais contient les données cherchées dans sa mémoire cache, suite à des demandes déjà propagées dans un passé récent à d'autres serveurs (on parle de "résolution récursive"), « l'âge » de ces données permettant de s'assurer dans ce cas qu'elles sont toujours valables.

Il est connu depuis très longtemps qu'un tel système de résolution récursive est techniquement complexe, et présente des écueils importants au niveau de la sécurité. Parmi les risques les plus importants, se trouve une possibilité de corrompre ("poisoning") la mémoire cache d'un de ces serveurs de résolution récursive que votre résolveur local interroge. Il est possible d'effectuer de telles corruptions simplement par le biais de requêtes adressées par un résolveur (client DNS) à un serveur qui l'aurait autorisé à effectuer une telle demande parce que l'adresse IP du résolveur se trouverait dans sa liste d'IP admises. Souvenez-vous que lorsque vous vous abonnez auprès d'un fournisseur d'accès internet, celui-ci vous transmet une courte liste de serveurs de noms de domaines de résolution récursive utilisables, qui se trouve communiquée à de nombreuses personnes, au minimum tous ses clients, sachant que certains prestataires permettent à n'importe qui d'interroger leurs serveurs publics.

Donc, leçon n°1, une des méthodes les plus simples pour réduire votre exposition aux risques liés aux failles de sécurité du système DNS est d'éviter d'utiliser les serveurs de noms de domaines des fournisseurs d'accès à internet (la plupart) pour vos besoins DNS habituels. Vous pouvez y parvenir en installant votre propre serveur de noms de domaines. Ce qui est probable, c'est que peu de personnes mis à part les administrateurs systèmes savent que c'est très simple à effectuer. Il vous suffit la plupart du temps d'installer un paquet et tout fonctionne très bien automatiquement. Pas de réglage à faire. Vous devez juste vous assurer que resolv.conf pointe sur votre machine. Cela consommera un peu de mémoire vive sur votre système, mais c'est tout. Tout le monde devrait songer à faire ainsi ; même sur les portables.

Choisir un résolveur local pour la résolution récursive des noms de domaines, avec mécanisme de cache

J'ai testé plusieurs candidats et je peux vous donner quelques indications ou recommandations simples et fiables, idéalement. Mais hélas, je n'ai pas pu les explorer à fond pour la plupart, ce qui montre pourquoi les progrès sont lents dans ce domaine, de trop nombreux administrateurs système utilisant en effet Bind 9. La bonne nouvelle c'est que pour utiliser les serveurs DNS ci-dessous, il vous suffira de les lancer et de faire pointer le fichier resolv.conf sur votre machine.

  • BIND9 : cette version, vieille d'un an, est largement utilisée. Désespérément lente, avec un éxécutable trop "lourd" et une librairie compacte offrant de trop nombreuses possibilités (gérant également tous les types possibles de services de noms de domaines). Configuration délicate du service et des fichiers de zones, mais "LE" standard, pour le meilleur et pour le pire.

  • Unbound : excellent de par sa conception là où Bind 9 pêche. Le seul point à remarquer est qu'il s'agit d'un logiciel récent, ce qui est à prendre en compte dans le cas d'un code source portant sur un sujet potentiellement sensible à des problèmes de sécurité.

  • PowerDNSRecursor : composant dédié de recherche récursive (maintenant disponible séparément) issu de la respectable gamme de produits PowerDNS. Requiert probablement une base SQL en arrière-plan. Rapide. L'ensemble PowerDNS est assez « lourd » et nécessite l'installation de très nombreuses librairies ou dépendances—mais je ne sais pas s'il en est de même pour le composant séparé— et a plutôt bonne réputation, sans être parfait.

  • dnscache : le résolveur récursif conçu par Dan Bernstein fait partie de la suite djbdns, et est le premier à considérer le choix des ports source sous l'angle de la sécurité. Code source et fonctionnement plutôt excentriques (je n'en dirai pas plus). Sans égal historiquement parlant du point de vue de la sécurité. Son installation est réputée être un challenge et il faut appliquer dés l'installation un correctif palliant l'absence de développement depuis 2001. Quelques problèmes de résolution de certains noms de domaines (par exemple Akamai) et une conception un peu étriquée qui explique en partie à la fois sa bonne tenue au niveau de la sécurité et les problèmes existants.

  • maraDNS : léger, rapide, avec un développement et un support actifs. Gère de nombreux types de services de noms de domaines tout comme Bind 9, mais sans la lourdeur de ce dernier. Excellent du point de vue de la sécurité.

Fondamentalement, les serveurs de noms de domaines des fournisseurs d'accès à internet restent en général de faux amis. Ne les utilisez pas ! Le fait que j'utilise moi-même le fournisseur Raw bandwith est le reflet de la haute estime que je porte à Mike Durkin, mais cela ne doit pas être systématiquement généralisé à d'autres prestataires.

De nombreuses personnes, depuis des années, ont souligné le fait qu'il était dangereusement facile de construire des requêtes récursives (je veux dire construire des réponses artificielles contenant des données faussées, mais étant acceptées par le résolveur comme venant réellement du serveur qu'il a interrogé). Les requêtes récursives comportent une sorte d'identifiant unique de transaction, appelé identifiant de requête (query ID ou QID). Mais il ne s'agit que d'un nombre codé sur 16 bits, ce qui est assez insuffisant, rendant les réponses plus faciles à construire de toute pièce que si l'identifiant n'était, disons, un entier codé sur 32 bits.

Comme il n'est pas réalisable d'allonger les identifiants, le seul moyen restant en toute logique pour rendre plus difficile la construction de réponses artificielles aux requêtes récursives est de faire la requête initiale sur un port TCP ou UDP choisi au hasard plutôt que sur le port standard DNS 53. Vous devinez que la plupart des serveurs de noms de domaines non dotés du correctif paru le 8 juillet 2008 transmettent stupidement toutes leurs propres requêtes à partir du port 53... Le serveur de noms que vous utilisez en ce moment peut-être également. C'est une très mauvaise chose, comme l'ont démontré la société Matasano et le mathématicien allemand Halvar Flake, les « mauvais garçons » du web ayant déjà été —ou seront bientôt—capables de corrompre facilement le cache de tels serveurs de noms de domaines. Et rien ne rend plus dangereuse cette vulnérabilité que de transmettre les requêtes toujours par le même port.

La société Matasano a également soulevé un second problème : certains serveurs de noms de domaines ont tendance à accepter en même temps que des réponses attendues, des données en rapport avec un nom de domaine complètement différent. Fort heureusement, la plupart des serveurs de noms récents sont relativement épargnés, bien que certains demeurent concernés, ce point n'étant pas rectifié par le correctif du 8 juillet.

Beaucoup de gens ne songe pas à un aspect des choses, c'est que le résolveur DNS de la librairie libc est d'un type simplifié : il amorce une requête DNS avec le bit « récursif » positionné, ce qui implique que le serveur contacté doit transmettre la demande à un autre serveur s'il ne connait pas la réponse lui-même. N'y a-t-il pas là une vulnérabilité potentielle du même type que celle soulevée par la société Matasano ? Si, mais les résolveurs simplifiés ne mettent pas en mémoire cache les réponses qu'ils reçoivent, si bien que c'est moins grave (les données corrompues disparaissant immédiatement). Singulièrement, ce ne sont pas les composants logiciels des ordinateurs de bureau qui sont les plus concernés cette fois. Ce sont les services de noms de domaines fonctionnant sur tous les serveurs (par exemple ceux des fournisseurs d'accès à internet).

Les pare-feu vont devenir un réel problème pour deux raisons :

  1. de nombreux boitiers pare-feu incluent un résolveur récursif de noms de domaines. A combien d'entre eux le correctif doit-il être appliqué ? Certes, presque aucun, la plupart ne disposant pas de mémoire cache DNS.

  2. supposons que vous mettiez mes conseils en pratique en installant un serveur de noms de domaines sur votre machine locale, qui est connectée à internet haut débit par l'ADSL ou le câble, derrière un pare-feu opérant une translation d'adresses ou de ports (NAT/PAT, cela devrait toujours être le cas) de telle façon que vous n'utilisiez qu'une seule adresse IP. Vous êtes prudent et appliquez le correctif du 8 juillet, de telle sorte que votre résolveur initie ses requêtes depuis un port choisi au hasard, et non toujours depuis le port 53. Bien. Sauf que l'algorithme de translation d'adresse ou de port (NAT/PAT) du pare-feu filtre le trafic sortant. Le port source de la requête étant choisi au hasard, les paquets en sortie du pare-feu proviendront également d'un port choisi au hasard. Bien sûr, les boitiers pare-feu économiques disposent tous d'un excellent générateur de nombres aléatoires...?!? Eh bien, non, le port initialement choisi au hasard n'est au bout du compte pas « si » aléatoire, voire pire. Voyez ainsi cette page : http://www.circleid.com/posts/87143_dns_not_a_guessing_game/. En général, un boitier pare-feu d'un type courant constitue un excellent moyen de supprimer ce caractère aléatoire.

Tester le caractère aléatoire des ports source utilisés par votre serveur de noms de domaines

Saisissez la commande :

$ dig [adresse IP du serveur de nom ou nom d'hôte] porttest.dns-oarc.net in txt 

Le résultat inclue un commentaire et une appréciation de la qualité du caractère aléatoire des ports utilisés : GREAT (très bon) ou GOOD (bon), FAIR (faible), ou POOR (très faible)

Vous pouvez utiliser, pour plus de facilité, la page web suivante : https://www.dns-oarc.net/oarc/services/dnsentropy.

Vous devriez vous sentir concerné dés maintenant par ce problème. Ce n'est pas seulement le problème des autres.

Rick utilise des systèmes Unix libres depuis 1992, et a apporté sa contribution au tout premier système BSD386, puis à Linux. Il abandonne les systèmes non-Unix (OS/2 Warp en l'occurence) en 1996. Il se spécialise en administration système, conception et architecture des réseaux WAN/LAN, conseil et support. Il participe à l'organisation de LINC Expo (qui évoluera pour devenir LinuxWorld Expo à San Jose), aux "Windows Refund Day", et plusieurs autres grands évènements de la communauté Linux autour de San Francisco. Il rédige des textes pour IDG/LinuxWorld, SSC, et l'Association USENIX. Il donne des conférences pour LinuxWorld Expo ou en d'autres occasions.

Il eut l'occasion d'approcher un mainframe IBM à cartes à Stanford dés 1969, puis dans les années 70 s'intéressa aux premiers systèmes à temps partagé de HP, ainsi qu'aux ordinateurs de la société PDP8, aux micro-ordinateurs des membres du célèbre Homebrew Computer Club ou d'IBM, suivit aussi les sessions d'été BSD à Berkeley, etc.

Quand il ne joue pas en ligne, il aime faire de longues courses à bicyclette ou s'occuper de science-fiction.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.