Vous utilisez un navigateur obsolète !

L'affichage de la page peut être incorrect.

  • Ajouter aux favoris
    Ajouter aux favoris

Vulnérabilité du matériel

Lu par: 23456 Commentaires: 4 Cote de popularité: 11

mercredi 17 janvier 2018

Les news de la fin de l'année 2017 sur les vulnérabilités détectées dans différents processeurs ont provoqué un mouvement de panique. Les programmeurs du monde entier, pendant les fêtes, ont été contraints d'analyser d'urgence les vulnérabilités et de chercher des moyens de se protéger. Mais qu’a-t-on trouvé ?

En fait, trois failles de sécurité ont été détectées : Meltdown (CVE-2017-5754) et Spectre (CVE-2017-5753 et CVE-2017-5715). Envisageons de près la première.

En général, il est logique que les utilisateurs puissent travailler simultanément avec des droits différents. Et chacun d'entre eux peut lancer des applications avec des droits d'accès différents. Les données sont traitées par un (ou plusieurs) processeurs de sorte qu’un logiciel ayant des droits limités n'a pas accès à certaines données si ses privilèges ne sont pas suffisants. Jusqu'à présent, des vulnérabilités permettant d'élever les privilèges afin d'accéder aux données protégées ont été détectées, mais des vulnérabilités au niveau des processeurs étaient jusque là restées inconnues.

Au lieu d'accéder directement à la mémoire physique, les applications reçoivent des plages d'adresses virtuelles qui correspondent à la mémoire physique de sorte que les plages correspondant à des applications différentes ne se croisent pas. Le contrôle des espaces d'adressage se fait à l'aide, notamment, de l'unité MMU, Memory Mangement Unit.

https://geektimes.ru/post/297029

En d'autres termes, c'est comme si vous lanciez des programmes sur des machines virtuelles, dont chacune opère avec la mémoire qui lui est allouée. Dans ce cas, le contrôle pour veiller à ce qu'un logiciel ne soit pas croisé avec un autre s’effectue au niveau matériel. Tout semble clair, mais il existe une nuance.

Supposons que vous marchiez dans la rue. Pour aller d’un point A à un point B, vous devez faire N pas. Vous faites exactement la même séquence d'actions, pas à pas. Dans ce cas, il est logique de supposer que si vous avez fait un pas du point A1 vers le point A2, vous ferez sans doute des pas similaires pour arriver du point A2 au point A3, du point A3 au point A4 etc. Mais si vous pouviez passer toutes les étapes en un seul pas, vous pourrez vous trouver tout de suite au point B !

C'est le principe de fonctionnement des processeurs modernes. Calculer chaque pas d'un logiciel est un processus coûteux qui prend du temps. La majorité des actions du programme ont un caractère linéaire et ne se divisent pas en plusieurs opérations simultanées. Cependant les processeurs modernes peuvent exécuter plusieurs actions simultanément. Si les commandes du programme étaient exécutées étape par étape, cela serait très lent, puisque le processeur ne serait pas utilisé à pleine capacité. Par conséquent, le processeur divise le code exécutable en parties et les traite en parallèle, ainsi il exécute un code et en même temps un autre code qui aurait pu être exécuté plus tard. Scientifiquement, ceci est appelé « fonction de l'exécution de l'instruction spéculative et de prévision des bifurcations ».

Par exemple :

Ces algorithmes sont nécessaires pour assurer une haute performance du système à condition que tous les périphériques, y compris la mémoire vive, fonctionnent plus lentement que le processeur central. Lorsqu’une instruction nécessite qu'on attende des données de l'extérieur, le processeur ne reste pas inactif pendant ce délai d'attente mais commence à exécuter le code suivant l'instruction en question, en prenant en compte ses estimations sur les données qu'il recevra avec une forte probabilité.

https://geektimes.ru/post/297029

Ici, on voit le premier problème. Lorsque le processeur calcule le pas suivant, il ne sait pas exactement quelles données seront disponibles pour le programme au début de cette étape, c'est pourquoi il suppose que n'importe quelles données pourront arriver, y compris les données auxquelles le programme n'a pas accès. Voici un exemple simple. Le logiciel déclare un tableau de données, par exemple, de 200 éléments, puis il effectue une séquence d’actions avec ce tableau. Le processeur pense ainsi : " Ok ! " et il commence à effectuer des pas à l'avance. Mais à un moment, dans le code du programme, on voit un appel à des données qui ne sont pas incluses au tableau (il est à noter que tous les langages de programmation n'interdisent pas automatiquement de sortir à l'extérieur du tableau, cette action peut donc être correcte). Ainsi, le processeur demande les données qui sont en réalité indisponibles pour le programme.

Qu'est-ce qui se passe si une variable se trouve non seulement hors du tableau mais également hors de la mémoire accessible au processus ? Malgré tout, le processeur exécute la deuxième ligne du code. Le problème est que le module MMU qui est chargé de déterminer si le processus est autorisé ou pas à lire des données à l'adresse X nécessite un certain temps, c'est pourquoi le mécanisme de l'exécution spéculative commence à exécuter le code avant de recevoir une réponse du MMU disant que le code est correct ou pas.

Si le MMU déclare que le code est incorrect et que cette partie de la mémoire est inaccessible, le processeur efface tout simplement tout ce qu'il a calculé.

Mais imaginons que les prévisions ne soient pas confirmées et qu’au début de l'étape déjà calculée, on reçoive d'autres données à la place de celles qu'on attendait. Les calculs ne posent pas de problèmes, les résultats seront effacés et le calcul sera refait. Les données reçues qui ne devaient pas être disponibles sont rejetées et le programme ne les recevra pas. Mais à ce stade, il faut prendre en compte une autre technologie appliquée pour accélérer la vitesse, il s'agit de la mémoire cache.

Toutes les données qui sont passées via le processeur sont mises en cache. Le cache est autonome, il ne sait pas d'où viennent les données, si elles ont été reçues à la suite d'une exécution spéculative ou consécutive, si l'exécution spéculative était considérée comme correcte ou pas. Les données sont passées, elles sont mises en cache.

Autrement dit, les résultats d’un calcul incorrect se trouvent également en mémoire cache et ne sont pas supprimés. La tâche du pirate est d'extraire ces données du cache. Mais le problème est qu’un logiciel ne peut pas lire directement le cache. Cependant, le délai d'attente d'une réponse peut permettre de déterminer si la zone demandée a été lue par le processeur précédemment. Si oui, le délai est plus court.

Les programmes contiennent des données et des liens vers les données. Un lien est une adresse qui peut être utilisée pour demander des données. Si des données ont déjà été demandées, elles seront retrouvées plus rapidement.

Par exemple, une application peut accéder à la plage de données 0...9999, le noyau peut accéder à la plage 10000...20000, ces chiffres étant donné uniquement à titre d’exemple. Dans ce cas, nous préparons une construction située dans le code de sorte que le processeur l'exécutera en mode spéculatif (par exemple lorsque le même cycle sera reproduit pour la 1000eme fois, si les 999 exécutions précédentes ont été correctes) et qui sera un adressage indirect en fonction de la valeur qui est située à l'adresse 15000.

  1. En mode spéculatif, le processeur lit la valeur à l'adresse 15000. Supposons, qu'à cette adresse se trouve la valeur 98 (l'action exécutée précédemment, durant laquelle on demande des données qui ne sont pas accessibles à l'application, car seules les adresses de la plage 0...9999 sont disponibles).
  2. Le processeur lit la valeur qui se trouve à l'adresse indiquée, c'est 98 (la valeur qui se trouve à l'adresse 15000).
  3. L'unité MMU donne la réponse que l'adresse 15000 est invalide (n'oublions pas que les calculs précèdent la vérification de l'accessibilité de données).
  4. Le processeur efface la chaîne et à la place de la valeur se trouvant à l'adresse 98 nous signale une erreur.
  5. Notre application commence à lire les adresses à partir de 0 et plus haut dans son propre espace d'adresses (il a le droit), et enregistre le temps nécessaire pour lire chaque adresse, elle les lit dans un ordre aléatoire pour ne pas créer un accès spéculatif.
  6. Et lorsqu'elle arrive à l'adresse 98, le temps d'accès est plus court que pour les autres adresses.

Ainsi, nous réalisons que quelqu'un a déjà lu récemment quelque chose à cette adresse, c'est pourquoi elle a été mise en cache. Mais qui a pu faire cela ? Oui, c'est notre processeur. A l'adresse 15000 se trouve la valeur 98.

Ainsi, nous pouvons lire toute la mémoire du noyau de l'OS dans lequel, dans les OS modernes, toute la mémoire physique de l'ordinateur est reflétée.

Qui est sujet à Meltdown ?

Au moins toute la gamme des processeurs Intel Core, tous les processeurs Intel de la gamme Xeon, tous les processeurs Intel Celeron et Pentium utilisant les noyaux de la famille Core.

Les processeurs utilisant les noyaux ARM Cortex-A75 sont également exposés au risque mais il n'y a encore aucun dispositif utilisant ces processeurs, et le premier processeur - Qualcomm Snapdragon 845 utiliant le noyau Kryo 385 et basé sur Cortex-A75 et Cortex-A53 a été annoncé seulement il y a un mois. Il est fort probable que Kryo 385 soit également sujet à Meltdown.

Conformément à la déclaration d'Apple, " tous les dispositifs iOS " sont sujets à Meltdown. Ceci ne peut pas, bien évidemment, toucher tous les processeurs utilisés dans iPhone/iPad (sans doute, un iPhpone 4 utilise un noyau standard Cortex-A8), mais les processeurs ARM dans les modèles contemporains d'iPhone et iPad peuvent être considérés comme vulnérables.

Pour plus d'informations, visitez le lien : https://geektimes.ru/post/297029 и https://geektimes.ru/post/297031.

Le projet Lumières sur la sécurité recommande

La situation est effrayante mais il y a des " mais ".

  1. Les vulnérabilités détectées ne permettent pas aux pirates d'obtenir un accès distant au système. Pour exploiter la vulnérabilité, un fichier malveillant doit d'abord être téléchargé dans le système. Cela signifie que la présence d'un antivirus et la limitation des droits relatifs à l'installation des applications sont nos meilleurs amis pour protéger les processeurs.
  2. Les patchs pouvant protéger contre Meltdown transfèrent la zone de mémoire du noyau vers une autre zone, ce qui distingue les données non seulement à l'aide du contrôle au niveau matériel (qui, hélas, a échoué), mais également via le contrôle d'accès par adresse. Comme le contrôle est effectué non seulement au niveau matériel mais au niveau logiciel, ceci ralentit le fonctionnement des appels systèmes. Là, il existe encore une nuance. Les applications de l’utilisateur n’ont pas besoin d'appels système. Selon les données reçues, le fonctionnement des jeux n'est pas touché, et le patch peut être installé sans aucune crainte. En ce qui concerne les serveurs, leur protection consiste en leur isolation complète. Pas de nouveaux fichiers - pas de possibilité d'exploiter la vulnérabilité. Mais il serait mieux d'installer le patch là aussi.

    Les tests donnent des résultats avec une chute de 30% de la vitesse du processeur, mais en réalité, même sous un OS qui utilise les appels système, vous aurez plus de performances, et le réseau et la mémoire peuvent également influencer. A l'échelle des centres de données de type GCP, AWS et FB, la part de ces serveurs n'est pas dominante, et finalement, les pertes de performances ne sont que de quelques pour cent. Les clients les plus exposés au risque lié à cette vulnérabilité sont ceux dont la majorité des serveurs montrent une chute des performances, mais ils ne sont pas nombreux.

    Pour les utilisateurs du navigateur Mozilla Firefox :
    Mozilla a fourni une solution temporaire dans son navigateur en version Firefox 57. La société affirme que cette solution est en mesure d'empêcher une attaque utilisant Meltdown et Spectre : https://drw.sh/dsubnp. A ceux qui utilisent Mozilla Firefox, il est fortement recommandé de le mettre à niveau vers la dernière version.

    Pour les utilisateurs de Google Chrome :
    1) Vous pouvez cesser de l’utiliser temporairement jusqu’au 23 janvier, jusqu'à la sortie de la version 64 (vers le 23 janvier 2018, un patch correspondant sera inclus à la mise à jour,) - https://drw.sh/xsfwmz
    2) Vous pouvez (à vos risques et périls, bien évidemment) activer la fonction de test qui doit protéger contre les vulnérabilités dans Google Chrome. Pour ce faire, allez à la page des paramètres cachés de Chrome chrome://flags/#enable-site-per-process, activez l'option « Strict site isolation » et redémarrez le navigateur https://DRW.sh/yjrlpf.

    A l'attention des internautes utilisant Yandex Browser :
    1) Vous pouvez cesser d'utiliser ce navigateur jusqu'à la sortie de sa nouvelle version corrigeant les vulnérabilités,
    2) Vous pouvez (également à vos risques et périls), activer l'isolation de données : Pour ce faire, entrez dans le browser, dans la ligne intelligente l'adresse suivante browser://flags/#enable-site-per-process. Ensuite, appuyez sur Enter. Sous la description de l’option « Strict site isolation », cliquez sur Activer. En bas de l’écran, cliquez sur le bouton qui apparaît : Redémarrer dès maintenant https://DRW.sh/oxknrw.

  3. Dans les navigateurs, Javascript doit être désactivé par défaut.

[Twitter]

Nous apprécions vos commentaires

Pour laisser un commentaire, vous devez accéder au site via votre compte sur le site de Doctor Web. Si vous n'avez pas de compte, vous pouvez le créer.

Commentaires des utilisateurs