Vous êtes sur le site public du Cert-IST
Le prefetching DNS dans les navigateurs web

Date :07 Décembre 2010

Publication: Article

Ce mois-ci, Apple a publié deux nouvelles versions (5.0.3 et 4.1.3) de Safari corrigeant 27 vulnérabilités. L’une de ces vulnérabilités (CVE-2010-3813) permet de forcer le pré-chargement des requêtes DNS, même si cette fonctionnalité a été désactivée (Cf. avis de sécurité CERT-IST/AV-2010.545).

Il nous a paru intéressant d’approfondir le contexte de cette vulnérabilité en consacrant un article à cette fonctionnalité de pré-chargement (prefetching) DNS, afin de mieux comprendre en quoi elle consiste, et de cerner ses impacts sur la sécurité des systèmes informatiques.

Nota : Le DNS (Domain Name System) est un protocole permettant à un ordinateur de connaître, à partir d’un nom donné, l’adresse IP d’un système distant (par exemple un serveur web). Chaque fois que vous demandez à votre navigateur de se connecter à un site (www.google.com par exemple), il envoie automatiquement une requête DNS pour connaître l’adresse IP de ce serveur web. Le DNS peut donc être assimilé à un système d’annuaire global dans lequel chaque nom Internet est associé à une adresse IP.

 

Principe du pré-chargement

De manière générale, une fonctionnalité de pré-chargement est une fonctionnalité d’optimisation d’utilisation des ressources. Il s’agit tout simplement de mettre à profit des périodes d’inactivité afin de charger par avance des informations dont on pense avoir besoin plus tard dans le but de pouvoir les utiliser instantanément à ce moment-là.

Le pré-chargement DNS ou DNS prefetching

Trois types de pré-chargement des résolutions DNS peuvent être utilisés par certains navigateurs web :

  • Lors du chargement d’une page HTML, le navigateur commence par identifier les liens vers toutes les ressources nécessaires au traitement de cette page. Puis il traite la résolution DNS de ces liens en parallèle afin que les résultats soient disponibles au plus tôt.
    Le résultat escompté est un chargement de la page plus rapide.
  • Après avoir chargé une page HTML, le navigateur recherche les liens intégrés dans cette page, puis il demande la résolution DNS de ces liens et il stocke les résultats en cache. Lorsque l’utilisateur cliquera sur un des liens de la page la résolution DNS sera déjà faite.
    Le résultat escompté est une navigation plus rapide.
  • Le concepteur de la page HTML identifie les liens qui ont une forte probabilité d’être suivis par les utilisateurs, et il demande au navigateur, via une étiquette spécifique sur les liens en question, d’anticiper leur résolution DNS. Cette technique permet de diminuer les pré-chargements inutiles.
    Certains navigateurs (Chrome, Firefox à partir de la version 3.5) prennent en charge un type de lien qui implémente cette méthode. Ce type de lien est défini de la façon suivante :
    <link rel="dns-prefetch" href="//example.org">.
    Nota : Ce type de lien ne fait pas partie du protocole HTML.

Pour information, le navigateur Chrome met en œuvre d’autres types de pré-chargement DNS donnant un sentiment d’efficacité aux utilisateurs :

  • Il pré-charge au démarrage les résolutions DNS des dix domaines résolus lors du précédent démarrage. Les premiers clics à l’ouverture du navigateur sont donc accélérés.
  • Il pré-charge les sites proposés dans l’autocomplétion de la barre d’adresse et de recherche.

Les navigateurs Safari, Chrome et Firefox implémentent la fonctionnalité de pré-chargement DNS. Par défaut ils mettent en œuvre cette technique pour HTTP mais pas pour HTTPS, cependant cette configuration est modifiable. A noter que le client de messagerie Thunderbird (à partir de la version 2.0) implémente également cette fonctionnalité.

 

Risques liés au DNS prefetching

D’un point de vue sécurité, l’aspect négatif de cette fonctionnalité est le nombre important de requêtes DNS émises qui peuvent donner des informations à une personne malveillante pour mettre au point d’éventuelles attaques.
Il est en effet possible d’imaginer qu’un site web malveillant puisse traquer des utilisateurs en glissant des liens vers des domaines spécifiques dans les pages HTML qu’il envoie et en observant les requêtes de résolution DNS faites pour ces domaines.

Notons qu’il est toutefois possible d’obtenir le même genre de renseignement, plus simplement, en insérant dans une page web des balises images ou des iframes spécifiquement formatés.

Pour les utilisateurs ayant des exigences de sécurité élevées, il est possible de désactiver cette fonctionnalité.

 

Pré-chargement des liens (link prefetching)

Le concept de pré-chargement de résolution DNS peut être étendu à un pré-chargement des ressources pointées par les liens. Ces ressources (page HTML, image, …) sont alors mises en mémoire cache pour être ressorties instantanément lors de leur demande par l’utilisateur.

Cette technique peut sembler séduisante en raison du confort de navigation qu’elle apporte via des réponses quasi immédiates aux requêtes de l’utilisateur, mais elle présente de nombreux inconvénients :

  • Elle peut  provoquer un encombrement des réseaux de communication.
  • Elle accroit sensiblement les coûts de communication pour les utilisateurs qui payent leurs communications en fonction du volume d’informations traitées.
  • Elle fausse les statistiques de fréquentation des sites web car une page chargée n’est plus forcément lue.
  • Elle se confronte aux liens associés à des actions, comme les liens provoquant la déconnexion d’un service web. Par exemple si le navigateur pré-charge un tel lien en arrière-plan, l’utilisateur pourrait se voir déconnecté d’un service alors que ce n’est pas son intention.
  • Enfin, le pré-chargement de certaines pages en arrière plan pourrait dans certains cas conduire à l’infection automatique du système par un malware (drive-by download), si la page pré-chargée contient un code malveillant spécifique. Dans ce cas, l’utilisateur n’aurait même pas eu besoin de cliquer sur un lien particulier pour que son navigateur se retrouve compromis.

La norme HTML5 prévoit la définition d’un lien de type "prefetch" demandant le pré-chargement et la mise en cache de toute la ressource associée au lien. Les ressources à pré-charger seraient alors spécifiées par le concepteur de la page. Cela limiterait les ressources chargées inutilement et permettrait d’éviter les chargements indésirables (déconnexion, pages publicitaires, …).

 

Pour en savoir plus :