Les failles de sécurité informatique Meltdown et Spectre, touchant les processeurs Intel (ainsi que AMD pour Spectre), ont marqué ce début d’année 2018. Une immense quantité de machines sont vulnérables à ces failles, qui ont cela d’exceptionnel qu’elles touchent la couche matérielle de nos systèmes d’information. Peu importe le système d’exploitation ou les logiciels : si un ordinateur ou un serveur est équipé de processeurs Intel, il risque de se faire compromettre.

Cyberattaque MeltdownDans cet article, nous nous concentrerons sur Meltdown, qui est plus simple à exploiter pour les pirates que Spectre… même si elle est loin d’être triviale ! Le risque : en exploitant la faille, un attaquant peut avoir accès à toute la mémoire vive (RAM) de la machine visée, et donc récupérer des informations sensibles comme des identifiants de connexion. Comprenons ensemble le fonctionnement de cette menace informatique, utilisant l’exécution spéculative, et comment Net4All a protégé ses clients.

Processeur et processus : remise dans le contexte

Pour pouvoir lire toute la mémoire vive d’une machine vulnérable à la faille Meltdown, un attaquant doit avoir un accès, virtuel ou physique, à un des processus ouverts sur cette machine. Ce processus bénéficie d’un ou plusieurs processeurs (CPU) dédiés, et d’un espace de mémoire vive qui lui est allouée. Cet espace est divisé en plusieurs adresses virtuelles, chacune permettant d’accéder à une donnée.

Le fonctionnement du processus exige des échanges entre la mémoire et le processeur, qui y récupère les données nécessaires au traitement des requêtes. Cette communication est assurée par le “noyau”, ou “kernel” en anglais, une partie vitale de tout système d’exploitation faisant le lien entre les composants matériels et logiciels de la machine.

C’est pourquoi, au sein de l’espace mémoire alloué au processus, on trouve deux “sous-espaces” : le “userland” ou espace utilisateur, et le “kernelland” ou espace noyau. Cet espace noyau, interface entre les processeurs et les espaces utilisateurs, contient un “mapping” (cartographie) de toute la mémoire physique de la machine, donc de l’ensemble des espaces utilisateurs de tous les processus. L’espace utilisateur du process, quant à lui, contient un mapping de l’espace noyau, même s’il ne peut y accéder en raison de la sensibilité des informations que ce dernier contient.

Attaque informatique : l’exploitation de la faille Meltdown

Phase 1 : préparation

Le pirate informatique bénéficie donc de son espace utilisateur, et va l’exploiter pour avoir accès à l’espace noyau. Pour cela, il va commencer par créer l’équivalent d’un tableau (un “probe array”, ou réseau de sondes) au sein de l’espace utilisateur. Toutes les cases du tableau (les “pages” du “probe array”) sont indépendantes, et à chacune correspond un identifiant.

Phase 2 : accès au noyau

En deuxième lieu, l’attaquant va essayer de deviner une valeur secrète X, stockée à l’adresse N de l’espace noyau. Il va donc créer et faire exécuter une séquence d’instructions, qui a pour objectifs de :

  • récupérer la valeur X dans l’espace noyau, à l’adresse virtuelle N
  • accéder, dans le tableau préparé en amont, à la case dont l’identifiant correspondant à la valeur X

Après la première étape, la valeur X est mise dans un registre de la mémoire interne du processeur, inaccessible pour l’attaquant, comme les résultats de tous les traitements. En parallèle, l’adresse virtuelle N est mise en cache, également au sein du processeur, afin d’y accéder plus rapidement la fois suivante.

Pour pouvoir connaître la valeur X, l’attaquant a donc besoin d’un autre levier, correspondant au deuxième objectif : le processeur récupère la valeur X dans sa mémoire interne, puis trouve la case avec la même valeur, et accède à l’adresse virtuelle correspondante, que l’on nommera C. Comme tout à l’heure, cette adresse virtuelle est mise en cache dans la mémoire interne du processeur.

On a donc, une fois que le code est exécuté :

  • la valeur X dans un registre
  • les adresses N et C dans le cache

Faille de sécurité : Meltdown et l’exécution spéculative

L’accès au noyau étant interdit, le processeur devrait arrêter le traitement de ces instructions dès la première ligne de code, et ainsi terminer la tentative de piratage informatique… En effet, en cas de requête interdite, le processeur lève une “exception” qui arrête le traitement.

Or, les processeurs actuels bénéficient d’une fonctionnalité particulière, qui permet de gagner en performance : l’exécution spéculative, ou “out-of-order execution”. Elle permet au processeur de traiter les instructions qu’il reçoit, mais dans un ordre différent de celui demandé par le processus. Ainsi, le processeur peut optimiser l’exploitation de ses ressources en devinant les prochaines instructions à traiter, et en prenant de l’avance sur son travail ! S’il a deviné juste, il enverra le résultat de ses traitements, stockés en attendant dans son registre interne, vers la mémoire du processus, et il continuera ses actions de traitement.

C’est ce temps gagné dans le traitement des instructions qui va permettre au pirate informatique d’accéder à l’espace noyau et de récupérer la donnée. En effet, l’exception levée met plus de temps à arriver qu’il n’en faut pour traiter la séquence d’instructions envoyée par l’attaquant. Le processeur va donc traiter l’ensemble de la séquence d’instructions, puis se rendre compte ensuite qu’il n’aurait pas dû le faire.

Ce cas, où le processeur se rend compte qu’il s’est trompé, n’est pas exceptionnel et ne pose pas de problème particulier. Le processeur supprime simplement de son registre les résultats des instructions qu’il n’aurait pas dû traiter, et reprend la suite des opérations. Cependant, comme on l’a vu, une fois le code exécuté, non seulement les résultats sont stockés dans un registre, mais en plus les adresses virtuelles des espaces mémoire sont mises en cache… et ces dernières, elles, ne sont pas supprimées ! C’est là que se trouve la faille informatique, et c’est ce que l’attaquant va exploiter lors de la troisième phase de l’attaque pirate. 

Phase 3 : récupération des informations

Pour l’instant, tout ce que connaît l’attaquant, c’est l’adresse N qu’il a lui-même choisie, et quelle adresse virtuelle correspond à quelle case du tableau créé dans l’espace utilisateur. Il doit maintenant récupérer une information obtenue lors des phases précédentes pour finaliser sa cyberattaque.

Pour cela, le pirate informatique utilise ce que l’on appelle une attaque par canal auxiliaire (“side-channel attack”). La plus évoquée dans le cadre de Meltdown se nomme “Flush+Reload“, nous ne la détaillerons pas sous peine de prolonger la taille de cet article. Elle lui permet de mesurer le temps d’accès à une adresse de l’espace utilisateur. L’attaquant itère cette attaque sur toutes les adresses correspondant aux cases de son tableau. L’accès à l’une des cases (dans notre cas, celle stockée à l’adresse C) est plus rapide que les autres : c’est celle qui a été mise en cache lors de la phase précédente.

Or, l’attaquant sait qu’à l’adresse C a été cachée la page du tableau dont l’identifiant est égal à la valeur X recherchée. Il ne lui reste qu’à faire la correspondance entre l’adresse et son tableau pour retrouver l’identifiant, et c’est ainsi qu’il connaît enfin la valeur X !

Accès à l’ensemble de la mémoire via itération

Comme on l’a vu dans la présentation du contexte de cette attaque cyber, l’espace noyau contient une carte de l’ensemble de la mémoire physique de la machine. Cela signifie qu’en réitérant les phases 2 et 3 de l’attaque sur toutes les adresses de l’espace noyau, l’attaquant peut, au bout de quelque temps, récupérer l’ensemble des données stockées sur la machine… Dans ce cas, même la randomisation de la répartition des espaces mémoire ne mitige pas la faille !

Protection informatique : échapper à Meltdown

Cette situation très préoccupante, qui ouvre une porte à la cybercriminalité, a grandement mobilisé nos équipes. Pour les serveurs Microsoft, nous suivrons le processus de mise à jour de l’éditeur. Pour les serveurs Linux, cependant, un plan d’actions a rapidement été mis en place, avant même que les correctifs ne soient publiés, afin de pouvoir protéger les machines le plus rapidement possible.

Ainsi, quand le correctif KAISER a été disponible, le mardi 9 janvier, nos équipes ont pu immédiatement tester sa mise en place, puis se lancer dans la mise à jour et le redémarrage des machines de nos clients. Le lundi 15, la quasi-totalité du parc Linux était donc protégée.

Ce correctif permet d’améliorer grandement l’isolation entre les deux espaces mémoire, en retirant de l’espace utilisateur la carte de l’espace noyau, sauf sur quelques cas spécifiques. L’espace utilisateur n’a donc tout simplement plus la possibilité physique d’accéder à l’espace noyau.

Le bémol, c’est une information assez alarmiste qui précise que l’application de ce correctif entraine une baisse de performances jusqu’à 30%… En effet, avec cette modification structurelle, le processeur ne peut plus utiliser son système de cache, et doit donc régulièrement recalculer des données qu’il avait auparavant stockées. Cependant, nous n’avons enregistré chez Net4All qu’une baisse de 1 à 2% des performances avec la cyber protection mise en place, un sacrifice bien léger pour se protéger contre la faille Meltdown ! A noter, grâce à ce faible taux et au fait que nous pratiquons très peu la sur-allocation de ressources, nous avons pu encaisser la surcharge sans aucun incident.

La protection de vos données est et reste notre priorité !
Découvrez plus en détails notre expertise sécurité !

Lucie Saunois
Lucie Saunois
Passionnée d'informatique, en particulier de sécurité, Lucie se spécialise dans la vulgarisation technique pour permettre à tous d'appréhender ces sujets parfois complexes.