Sept ans plus tard, la faille Spectre continue de hanter les processeurs AMD et Intel
Un nouveau dossier Warren
Des chercheurs ont récemment montré que la faille Spectre (dévoilée début 2018) pouvait encore faire parler d'elle. Même si le cas exploré est déjà corrigé, l'attaque se voulait pratique et peu complexe. Elle rappelle également la volée de bois vert de Linus Torvalds contre les multiples modifications du noyau pour tenir compte des bugs dans le matériel.
Le 07 novembre à 10h48
8 min
Hardware
Hardware
Avant de parler de cette découverte, il faut revenir à ce qu’est Spectre. Révélée en même temps que Meltdown, elle réside dans le fonctionnement de pratiquement tous les processeurs Intel, AMD et ARM depuis 1995, déclenchant une frénésie de correctifs. À cette époque, ces entreprises ont intégré une fonctionnalité dans leurs processeurs permettant d’exécuter spéculativement les instructions, la prédiction de branchement.
Sur la base d’hypothèses considérées comme vraisemblables, les processeurs peuvent tenter de prédire les instructions qui seront exécutées au sein d’une application. Si l’hypothèse est vérifiée, le processeur a gagné du temps, entrainant une hausse des performances. Si elle est erronée, la branche spéculative est abandonnée et l’exécution reprend son rythme normal.
Mauvais chemin, vraies données
Problème : pour fonctionner, la branche spéculative accède aux mêmes données que lors de l’exécution classique. L’attaque Spectre consistait alors à accéder à ces données pour les exfiltrer par canal auxiliaire. « Comme elle n'est pas facile à corriger, elle va nous hanter pendant un certain temps », avaient alors déclaré les chercheurs à l’origine de la découverte, en 2018. Ils avaient choisi le nom « Spectre » en référence à cette « hantise ».
Une attaque Spectre cherche donc à faire passer les instructions par le mauvais chemin. Elle peut fracasser l’isolation entre les processeurs et permet à un malware de manipuler les applications afin de leur faire remonter des données dans la branche spéculative.
Trois ans plus tard, le problème restait presque entier
Des correctifs avaient été publiés, mais de nouvelles variantes sont apparues régulièrement. Pour que les défenses soient rebâties, il fallait surtout qu’Intel, AMD et ARM sortent de nouvelles puces incluant des barrières physiques. Et même si ce fut le cas, ces protections n’ont pas été suffisantes.
Intel a recommandé de mettre en place la barrière nommée LFENCE (qui existait déjà depuis des années) pour atténuer les risques de Spectre. Elle place le code sensible dans une zone d’attente, le temps que tous les contrôles de sécurité aient été effectués. Malheureusement, d’autres chercheurs avaient montré que ce n’était pas si simple : les murs de cette salle d’attente étaient poreux.
Il était donc possible de faire passer des informations de cette salle d’attente vers le cache dédié aux micro-opérations (ou micro-ops), les instructions bas niveau du CPU. Avec l’attaque Spectre modifiée, ce cache devenait lui aussi un nouveau canal auxiliaire, permettant la récupération des informations par des malwares. Et là encore, presque tous les processeurs étaient concernés.
Les branchements indirects
Pour se rapprocher encore un peu du problème soulevé récemment par les chercheurs suisses, il faut revenir au mécanisme de prédiction de branchement. Il prend appui sur deux paramètres : l’adresse de destination et le statut « pris ». Le premier définit où le branchement se fera (direction de prédiction), tandis que le second reflète le statut du saut conditionnel, qui indique si la branche spéculée est acceptée ou pas. Quand la prédiction se révèle erronée, il n’y a pas de branchement et les instructions en attente, dites transitoires, sont abandonnées et écrasées. L’algorithme permettant de savoir si un branchement est pris ou non est matériel et donc implémenté dans le processeur.
On distingue également deux types de branchement. Le premier, direct, correspond à la situation où l’adresse mémoire d’un branchement est déjà connue, car le plus souvent inscrite dans l’instruction. C’est le cas le plus simple. Le second, indirect, reflète le cas où l’adresse n’est pas connue, par exemple parce qu’elle n’est pas constante ou qu’elle est inconnue à la compilation.
Il existe des mécanismes de prédiction pour les deux types de branchement. Sur les processeurs récents, on trouve ainsi des prédicteurs de branches indirectes. L’opération étant beaucoup plus complexe, ces prédictions fonctionnent seulement dans certains cas, notamment quand l’adresse de destination change de manière cyclique. Le tampon (buffer) associé peut stocker plusieurs adresses de destination par branchement, ainsi que d’autres informations pour mieux prédire la bonne adresse.
Des branches indirectes si désirables
Ces branches indirectes ont été au cœur des attaques dites Spectre v2, basée sur la faille CVE-2017-5715. L’attaque se fait sur les instructions transitoires et vise à injecter une cible dans la branche spéculée. En clair, un pirate peut essayer d’introduire dans une branche indirecte un élément indiquant au processeur que l’adresse pointée est la bonne. Pour le pirate, le jeu consiste alors à faire envoyer les instructions – et les données liées – vers l’adresse mémoire qui l’arrange.
Pour protéger les branches indirectes, Intel a introduit un mécanisme nommé IBPB, ou barrière prédictive de branche indirecte. Ce mécanisme « établit une barrière empêchant les logiciels exécutés avant la barrière de contrôler les cibles prédites des branches indirectes exécutées après la barrière sur le même processeur logique ». Il permet ainsi d’atténuer les risques d’injection de cible de branche.
Des chercheurs de l’École polytechnique fédérale de Zurich ont cependant trouvé un bug dans la microarchitecture des processeurs Intel et AMD, ce dernier ayant, lui aussi, une fonction de ce type. Exploitée, la faille peut permettre de contourner entièrement l’IBPB et permet de nouveau l’injection de cible de branche. Les chercheurs ont montré qu’une attaque Spectre basée sur ce bug peut être menée sur les processeurs Core de 12e, 13e et 14e générations, ainsi que les Xeon de 5e et 6e générations.
Des correctifs déjà disponibles, quid de la dangerosité ?
Dans le document [PDF] expliquant la découverte et leurs procédés, les chercheurs indiquent qu'Intel et AMD ont été informés en juin dernier. Les deux entreprises ont confirmé le problème, qui était cependant déjà connu et corrigé. Chez Intel, il s'agissait d'un bulletin de sécurité publié en mars. Une mise à jour du microcode des processeurs concernés avait été ensuite publiée sur le GitHub de l'entreprise. Lorsque les chercheurs ont mené leurs travaux sur Ubuntu, le correctif n'avait pas encore été déployé (il l'a été depuis).
Concernant AMD, le problème avait été détecté il y a deux ans, le bulletin ayant été publié en novembre 2022. Les chercheurs précisent qu'AMD suit la faille depuis. Dans le bulletin, on peut lire qu'AMD considère qu'il s'agit avant tout d'un bug logiciel spécifique à chaque système d'exploitation. Les distributions Linux et Windows ont reçu des correctifs en ce sens.
Dans les deux cas, les chercheurs pensent pouvoir améliorer ces correctifs. Ils indiquent être en contact avec les mainteneurs du noyau Linux en vue de fusionner leur proposition de correction. Ils ajoutent qu'ils mettront à disposition le code source de leurs expériences sur la page de présentation de leurs travaux, sans précision sur les délais.
La découverte rappelle quoi qu'il en soit la récente colère de Linus Torvalds sur l’avalanche de correctifs que les fabricants de matériel réclament aux mainteneurs du noyau Linux pour atténuer des problèmes de sécurité. Il a ainsi indiqué en avoir « marre » des bugs dans le matériel d’Intel et AMD et a fustigé « des attaques complètement théoriques qui n'ont jamais été utilisées en pratique ».
Peut-être parce qu’ils avaient connaissance de cette volée de bois vert, les chercheurs affirment – en gras dans le texte – qu’ils sont les « premiers à montrer une fuite Spectre inter-processus pratique de bout en bout », en opposition à ce qu’ils qualifient d’« exemples irréalistes ».
Sept ans plus tard, la faille Spectre continue de hanter les processeurs AMD et Intel
-
Mauvais chemin, vraies données
-
Trois ans plus tard, le problème restait presque entier
-
Les branchements indirects
-
Des branches indirectes si désirables
-
Des correctifs déjà disponibles, quid de la dangerosité ?
Commentaires (9)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 07/11/2024 à 11h42
Le 07/11/2024 à 13h33
Le 07/11/2024 à 13h59
Le 07/11/2024 à 16h56
Je n'ai pas de chiffre mais je n'ai pas l'impression qu'il y en ait plus qu'avant au contraire je dirais que il y en a autant et qu'elles sont moins évidente, les failles deviennent ultra complexe à trouver alors qu'avant sur des systèmes moins complexe il y avait des failles pas si dure à trouver. En plus vu que plus de monde s'intéressent à ce genre de faille et leur conséquence on en entends plus parler aussi.
Les GPU sont un bon exemple ils sont aussi complexe que les CPU et ont des failles et pourtant on en entends pas ou presque pas parlé. Next par exemple n'en as pas parlé ou le moteur de recherche de next ne les trouvent pas et pourtant il y en a aussi.
https://www.01net.com/actualites/les-cartes-graphiques-dapple-amd-et-qualcomm-sont-victimes-dune-faille-de-securite.html
https://www.hardwarecooking.fr/nvidia-corrige-8-importantes-failles-de-securite-sur-ses-gpu/
Le 07/11/2024 à 18h35
Par contre, je pense qu'il y aussi deux biais : L'un d'observation lié aux fait que plus de gens s'intéresse maintenant qu'avant. Et l'autre que l'accès à ce genre d'informations est plus largement diffusable et diffusé qu'hier. C'est pour ces raisons que je ne m'avance pas pour la causalité.
Pour les GPU je pense qu'il y a autres choses en jeu. Je vois au moins deux facteurs: la vitesse d'évolution des GPU rendant rapidement une faille obsolète à l'usage, et la nature des données à récupérer. Un GPU ça sert concrètement à du calcul ou du jeux vidéos. Un CPU ça fait beaucoup de choses et surtout ils ont accès plus facilement à des données sensibles (clé de chiffrements, token d'ID...) ce qui fait que ce sont des cibles plus intéressantes.
Par exemple, un GPU chez un provider a très peu de chance de voir passer des clés cryptographiques. Il servira à du calcul numérique (CFD, deep learning...). En revanche un CPU va travailler avec les token d'ID, les clés SSH... rendent plus interessante cette cible. Et surtout le provider va conserver plus longtemps un processeur qu'un GPU. Par exemple chez OVH, on peut encore louer du Skylake.
Le 08/11/2024 à 11h37
(intéressant d'ailleurs de voir à quel point Intel semble plus souvent cité qu'AMD, et ARM très très peu cité alors que touché aussi).
Par ailleurs, les marques Intel/AMD, le composant CPU sont les éléments les plus parlants dans un ordi - beaucoup de gens ont une compréhension très limitée des autres éléments. On touche au coeur de l'ordi, ça réagit.
Pour les GPU, c'est légèrement différent: les failles sont plutôt logicielles - tant qu'il y a des failles logicielles suffisamment évidentes, peu de chercheurs iront sur le hardware. Je pense que 80-90% des utilisateurs n'ont pas de notion de leur GPU (je ne parle pas de l'audience de next), surtout si on inclut les téléphones (je ne sais pas du tout quel CPU/GPU j'ai dans mon tel par exemple - juste sa capacité de stockage et qu'il est 5G, ça me suffit). Par contre, en regardant les failles GPU sur les pilotes, je me suis aperçu qu'il y en a un paquet pour des GPU Arm, dont certaines très bien notées - avec Android qui ne se met pas à jour c'est tout bénef.
Mais au-delà des GPU, il y aura aussi les NPU, les processeurs TPM, les cartes Wifi, les SSD - nombre d'éléments dans un ordi sont attaquables, et tous ont de plus en plus de traitements "autonome" (il y a des démos de RAM qui traitent les données). Niveau OS, c'est drôle aussi: lors d'un context-switch, il faut pouvoir prévenir les pilotes et cartes que le processus a changé (la 1ère fuite avec les CG, c'était simplement de pouvoir capturer l'écran du processus précédent).
Quand les éléments NVMe parleront ensemble ça va être drôle aussi (genre la carte réseau qui cause au SSD sans le CPU...).
Les mécanismes de sécu sont en plus maintenant conjointement implémenté entre le CPU, l'OS et ... l'appli! Ca devient impossible à dire qu'on est sécurisé du coup!
Pour se donner une idée de l'ampleur de bazar, on peut reprendre par exemple la sécurité dans Windows. Il y a quelques éléments plus ou moins cocasses qui sont plus sécurisés que les autres: l'imprimante, le fond d'écran, les sons systèmes :) - car pouvoir d'espionnage ou de nuisance maximum - enfin début 2000 :)
Expérience personnelle: j'ai eu un jour un patch à mettre sur des machines. Le cache des cartes RAID était accessible depuis n'importe quelle VM... Oups!
Le 08/11/2024 à 15h55
D'ailleurs, l'API DirectStorage de Microsoft permet maintenant aux applications (principalement jeux mais pas que) de programmer des transferts de données d'un SSD NVMe directement vers le GPU. Ce genre de techno était plutôt dans une niche auparavant soit pour optimiser des choses en interne des noyaux soit pour éviter de la fuite/manipulation de données entre VMs sur une même machine (dans le cas où l'hyperviseur donne l'accès direct à un périphérique physique à une VM, sans IOMMU, l'invité pourrait utiliser ce périphérique pour manipuler les données directement en mémoire physique), ou pour restreindre l'accès à la mémoire centrale si un périphérique n'est pas digne de confiance.
Il existe également des API équivalentes côté monde UNIX pour programmer des transferts de données directs entre périphériques (entre deux cartes réseaux ou une carte réseau et un disque).
Le 07/11/2024 à 13h53
Certes les corrections sont bien poussées par les fabricants vers les éditeurs d'OS, mais quid des conséquences pour les utilisateurs finaux ?
C'est des failles très complexes, et on peut se demander si la correction est utile pour tous les utilisateurs.
Le 07/11/2024 à 14h04
Si ton utilisateur final est Mme Michu, on peut en effet se poser la question.
Si ton utilisateur final est un cloud provider (e.g., OVH), la correction est mettre en regard de son impact sur les performances et le service proposé.
Néanmoins, même si tu désactives les failles car tu considères que c'est ok. Tu peux avoir des softs qui inclus ces contre-mesures dans leur code. Et là, tu ne peux rien faire si le code n'est pas open-source.