Le début de l’année 2018 a été marqué par Meltdown et Spectre, des failles informatiques affectant les processeurs Intel (Spectre touche également d’autres technologies). Ces vulnérabilités sont très particulières : elles concernent la couche matérielle des systèmes d’information, ce qui est très rare. Ainsi, toutes les machines équipées de ces processeurs risquent la compromission, peu importe les logiciels ou le système d’exploitation utilisé. Cela représente un nombre énorme de machines, Intel équipant de ses processeurs 80% du parc mondial.

Attaque informatique faille MeltdownCet article se concentre sur la faille Meltdown, dont l’exploitation est moins complexe que celle de Spectre. Elle permet à un attaquant de récolter des informations, souvent sensibles, en accédant à l’ensemble de la mémoire vive d’une machine. Comment fonctionne cette menace informatique ? C’est ce que nous allons voir !

Processeur Intel et fonctionnement général

Pour exploiter la faille Meltdown et récupérer des informations tels que des identifiants de connexion, un pirate informatique doit avoir accès à un processus de la machine visée. Ce dernier, pour fonctionner, peut utiliser un ou plusieurs processeurs (CPU), et se voit alloué un espace dédié de mémoire vive (RAM). Au sein de cet espace, chaque donnée correspond à une adresse virtuelle spécifique qui permet de récupérer l’information.

Il est en effet indispensable que des échanges se produisent entre la mémoire et le processeur, ce dernier ayant besoin des informations stockées pour traiter les requêtes envoyées par le processus. C’est le noyau (kernel en anglais) qui gère ces communications, en faisant l’intermédiaire entre les logiciels et les éléments matériels de la machine. Ce noyau, même s’il est différent selon les systèmes d’exploitation, en est un composant essentiel qui garde des fonctionnalités de base universelles.

On retrouve ce noyau dans l’espace de mémoire vive dédié au processus. Il est en effet séparé en deux « sous-espaces », l’un réservé à l’utilisateur (userland) et l’autre au noyau (kernelland). Le noyau étant commun à tous les processus utilisés sur la machine, il doit pouvoir accéder aux données de chacun : son espace mémoire au sein de chaque processus contient donc une cartographique (mapping) de l’ensemble de la mémoire physique.

L’espace utilisateur, de son côté, contient une cartographie de l’espace noyau. Cependant, ce dernier contenant des informations sensibles, il est normalement impossible pour un utilisateur d’y accéder.

Faille Meltdown : l’exécution spéculative

C’est là que se trouve la faille de sécurité informatique Meltdown, qui permet au pirate d’accéder à cet espace noyau malgré l’interdiction. En effet, cette gestion des accès est gérée par le processeur, qui lève ce que l’on appelle une « exception » pour arrêter le traitement de toute requête interdite. Or, il existe une fonctionnalité des processeurs modernes, y compris ceux d’Intel, qui permet d’accéder à l’espace noyau malgré cette interdiction : il s’agit de l’exécution spéculative, ou « out-of-order execution ».

L’exécution spéculative permet d’améliorer les performances des processeurs. Pour cela, quand le processeur reçoit une séquence d’instructions, il prend en compte la première, puis fait un pari sur le futur en essayant de deviner quelles seront les prochaines instructions à traiter. Ainsi, il peut prendre de l’avance en traitant en parallèle toutes ces instructions sélectionnées, peu importe l’ordre dans lequel il les a reçues.

Lorsqu’il traite ces instructions, le processeur commence par récupérer en mémoire vive les données dont il a besoin. Il enregistre alors dans son propre système de cache les adresses virtuelles qu’il a visitées, pour y accéder plus rapidement les fois suivantes. Puis, il effectue ses opérations de calcul, et stocke dans un registre de sa mémoire interne les résultats de ces opérations, qui sont les réponses aux instructions qu’il vient de traiter.

Arrive alors le moment de vérité : une fois les instructions traitées, le processeur découvre si sa prédiction était bonne ou non. Si la première instruction n’influe pas sur les suivantes, ou si le résultat de la première instruction confirme qu’il a fait le bon choix, il envoie les résultats depuis son registre vers l’espace utilisateur, pour faire fonctionner le processus. Il peut alors recommencer l’opération avec la prochaine série d’instructions.

S’il s’est trompé, il supprime de son registre les résultats des instructions traitées par erreur, envoie les résultats de la première instruction si besoin, et reprend son travail habituel. Cependant, le cache interne du processeur, lui, n’est pas vidé : le composant garde donc une trace des adresses virtuelles auxquelles il a accédé pendant le traitement, à tort, de ces instructions. C’est ce dernier cas de figure qui est utilisé pour l’exploitation de la faille Meltdown, comme nous allons le voir dans la suite de l’article.

Attaque pirate : l’exploitation de Meltdown

La préparation de l’attaque

Comme on l’a vu, le pirate informatique doit avoir accès à un processus pour pouvoir exploiter la faille. Il accède donc à un espace utilisateur qu’il va utiliser pour atteindre l’espace noyau. L’attaquant commence par créer un tableau (l’équivalent d’un réseau de sondes, ou « probe array ») dans son espace mémoire utilisateur, avec des cases (appelées « pages ») indépendantes. A chacune de ces cases est associée un identifiant.

L’accès à l’espace noyau

Imaginons que l’attaquant souhaite connaître la valeur X qui est stockée dans l’espace noyau à l’adresse N. La deuxième étape du piratage informatique consiste à envoyer au processeur une série d’instructions à traiter. Ces lignes de code demandent, en substance, à :

  • Se rendre à l’adresse virtuelle N pour récupérer la valeur X
  • Se rendre, sur le tableau dans l’espace utilisateur, à la case dont l’identifiant est égal à X. Nous nommerons C l’adresse correspondant à cette case.

Comme on l’a vu, sans l’exécution spéculative, le processeur lirait la première instruction, lèverait une exception, et arrêterait son traitement sans même l’exécuter. Avec l’exécution spéculative, il a le temps de traiter les deux instructions en parallèle avant même que l’exception ne soit levée.

À la levée de l’exception, le processeur réalise qu’il a traité ces instructions à tort, et supprime donc les résultats de son registre. Mais les adresses auxquelles il a accédé pour récupérer les informations nécessaires au traitement, elles, sont toujours stockées dans son cache interne. Dans notre exemple, ce dernier comprend donc l’adresse N de l’espace noyau, et l’adresse C correspondant à une case du tableau de l’espace utilisateur.

A noter, le pirate informatique ne pourra jamais avoir un accès direct à la valeur X. Elle a été récupérée par le processeur et a été stockée puis supprimée dans son registre interne, mais n’a jamais été remontée au niveau de l’espace utilisateur, et reste donc inaccessible.

La récupération des informations stockées

L’attaquant sait alors que le cache du processeur contient les adresses évoquées ci-dessus. Il connaît déjà l’adresse N et sait qu’y est stockée la valeur X. Le pirate sait également à quelle adresse virtuelle est associée quelle case du tableau qu’il a créé, et surtout l’identifiant de cette case. Il ne lui reste donc qu’à récupérer l’adresse C, et retrouver la case correspondante : son identifiant est égal à la valeur X. C’est ainsi qu’il va finaliser son attaque informatique !

Pour récupérer cette adresse C, le pirate exploite une « side-channel cache attack », autrement dit une attaque de cache par canal auxiliaire, comme « Flush+Reload » par exemple. Elle permet de mesurer le temps d’accès à une adresse virtuelle, ici située dans l’espace utilisateur. En effet, le pirate effectue ce test sur l’ensemble des adresses correspondant aux cases de son tableau, et repère l’adresse pour laquelle l’accès a été le plus rapide : c’est cette adresse qui a été mise en cache par le processeur.

C’est ainsi que, dans notre cas, le pirate apprend que c’est l’adresse C qui a été cachée, et remonte logiquement jusqu’à la valeur X.

L’itération de l’attaque, un moyen de lire l’ensemble de la mémoire

On l’a évoqué en début d’article : au sein de l’espace noyau, on retrouve une cartographie de l’intégralité de la mémoire physique de la machine attaquée. En récupérant toutes les données stockées dans l’espace noyau grâce à la répétition de l’attaque sur l’ensemble des adresses virtuelles de cet espace, le pirate peut donc y avoir accès et récupérer une énorme quantité d’informations…

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

 

Mise à jour à venir : comment NBS System protège ses clients contre l’exploitation de la faille Meltdown

Lucie Saunois
Lucie Saunois
Passionnée d'informatique, en particulier de sécurité, depuis qu'elle a rejoint l'OT Group en 2015, Lucie se spécialise dans la vulgarisation technique pour permettre à tous d'appréhender ces sujets parfois complexes.