Qu'est-ce que Exécution spéculative ?

Mécanisme du CPU qui exécute par avance les instructions suivantes sur la base d'une prédiction, avant de connaître par exemple le résultat d'un branchement. En cas d'erreur, les résultats sont annulés, mais des traces peuvent subsister dans le cache, etc.

Nom japonais: 投機的実行

« Exécution spéculative » apparaît dans 5 questions d'entraînement réparties sur 2 thèmes, dont Sécurité matérielle, CPU et architecture.

Domaine: Sécurité matérielle

Pourquoi les CPU exécutent en avance

Un CPU haute performance possède un pipeline profond et exécute les instructions dans le désordre ; attendre la résolution de chaque branchement le laisserait inactif pendant de nombreux cycles. À la place, un prédicteur de branchement devine le résultat et le cœur continue de charger et d'exécuter les instructions le long du chemin prédit. Ces résultats spéculatifs sont conservés dans des tampons internes et ne sont validés (retirés) qu'une fois la prédiction confirmée. Si la prédiction était fausse, le cœur abandonne le travail spéculatif et redémarre sur le bon chemin ; les résultats visibles du programme sont donc toujours corrects.

État architectural et état microarchitectural

L'annulation d'une mauvaise prédiction restaure l'état architectural, c'est-à-dire les registres et la mémoire qu'un programme peut observer directement. Elle n'annule pas les modifications de l'état microarchitectural, comme les lignes présentes dans le cache, le contenu du TLB ou l'historique du prédicteur. Ces modifications sont normalement sans danger, car les programmes ne peuvent pas les lire directement, mais le timing peut les révéler : un accès à une ligne en cache est sensiblement plus rapide qu'un accès à la mémoire principale. Cet écart entre ce qui est annulé et ce qui ne l'est pas est à l'origine des vulnérabilités liées à l'exécution spéculative.

Comment Spectre et Meltdown l'exploitent

Dans Spectre, divulguée en 2018 en même temps que Meltdown, un attaquant entraîne le prédicteur de branchement de sorte qu'un chemin qui ne devrait jamais s'exécuter, comme du code situé après une vérification de bornes, s'exécute de manière spéculative, lise un secret et utilise sa valeur pour accéder à une ligne de cache particulière. Les résultats sont abandonnés, mais mesurer quelle ligne est en cache révèle le secret par un canal auxiliaire de cache. Meltdown exploitait des CPU qui laissaient un chargement spéculatif renvoyer des données de la mémoire noyau avant que la vérification des permissions ne prenne effet. Presque tous les CPU haute performance étaient touchés par au moins une variante.

Contre-mesures et leur coût

Les parades couvrent toutes les couches : les systèmes d'exploitation ont séparé les tables de pages du noyau et de l'espace utilisateur, les compilateurs insèrent des barrières de spéculation ou utilisent des séquences de branchement indirect qui évitent les prédictions empoisonnées, les mises à jour de microcode ajoutent des contrôles sur le comportement des prédicteurs, et les CPU plus récents intègrent des correctifs matériels. Chaque restriction de la spéculation, de la prédiction ou des caches partagés réduit les fuites mais peut coûter en performances ; les concepteurs choisissent donc jusqu'où aller selon les données en jeu. L'épisode a montré que des fonctionnalités de performance peuvent devenir des faiblesses de sécurité, même lorsque le logiciel est exempt de bogues.

S'entraîner : questions sur Exécution spéculative

Quel exemple de vulnérabilité a révélé des attaques exploitant les traces laissées dans le cache par l'exécution spéculative pour déduire des données normalement inaccessibles ?

  1. ARowhammer
  2. BSpectre et Meltdown
  3. CLatch-up
Afficher la réponse et l'explication

Réponse : B. Spectre et Meltdown

Spectre et Meltdown, rendus publics en 2018, exploitent le fait que, même si les résultats d'instructions exécutées spéculativement sont annulés, les données lues restent dans le cache ; ces attaques déduisent des données secrètes normalement illisibles à partir des différences de temps d'accès (canal auxiliaire). Presque tous les processeurs hautes performances étaient concernés, et des correctifs de systèmes d'exploitation ainsi que des modifications de conception ont été apportés. Ce cas a montré qu'un mécanisme d'amélioration des performances peut devenir une faiblesse de sécurité.

Quel est le principe de la vulnérabilité d'exécution spéculative appelée Spectre ?

  1. AUne erreur de calcul du CPU modifie le résultat des additions
  2. BLes instructions exécutées spéculativement selon la prédiction de branchement laissent, même si leurs résultats sont annulés, des traces de chargement dans le cache, lisibles par mesure du temps
  3. CL'exécution spéculative fait trop chauffer le CPU
Afficher la réponse et l'explication

Réponse : B. Les instructions exécutées spéculativement selon la prédiction de branchement laissent, même si leurs résultats sont annulés, des traces de chargement dans le cache, lisibles par mesure du temps

Le CPU exécute à l'avance les instructions du côté prédit avant de connaître le résultat d'un branchement, et abandonne les résultats en cas d'erreur de prédiction. Dans Spectre, l'attaquant fausse la prédiction de branchement pour lire des données secrètes sur un chemin normalement non exécuté, et fait charger dans le cache un emplacement dépendant de leur valeur. Les résultats sont annulés, mais l'état du cache n'est pas restauré ; la valeur peut donc être déduite par canal auxiliaire de cache.

Questions fréquentes

L'exécution spéculative est-elle la même chose que l'exécution dans le désordre ?

Elles sont liées mais différentes. L'exécution dans le désordre réordonne les instructions dont les entrées sont prêtes, tandis que l'exécution spéculative exécute des instructions avant de savoir si elles doivent réellement s'exécuter, comme celles qui suivent un branchement non résolu ; les cœurs modernes font les deux.

Quelle est la différence entre Spectre et Meltdown ?

Spectre trompe le prédicteur de branchement pour faire exécuter de manière spéculative des chemins de code légitimes qui divulguent des données auxquelles le programme victime a accès. Meltdown exploitait des CPU dont les chargements spéculatifs pouvaient lire la mémoire noyau avant que la vérification des permissions ne prenne effet ; elle a été en grande partie corrigée par l'isolation des tables de pages du noyau puis par des modifications matérielles.

Pourquoi des résultats spéculatifs abandonnés peuvent-ils encore divulguer des données ?

Le CPU abandonne les résultats dans les registres mais ne restaure pas le cache ; les données chargées pendant la spéculation laissent donc une trace détectable en mesurant les temps d'accès.

« Exécution spéculative » dans les explications

Questions mentionnant « Exécution spéculative » (5)

  1. Quel exemple de vulnérabilité a révélé des attaques exploitant les traces laissées dans le cache par l'exécution spéculative pour déduire des données normalement inaccessibles ?
  2. Quel est le principe de la vulnérabilité d'exécution spéculative appelée Spectre ?
  3. Lequel des éléments suivants n'est pas une contre-mesure utilisée contre les vulnérabilités d'exécution spéculative comme Spectre ?
  4. Quel énoncé est généralement correct au sujet des contre-mesures aux vulnérabilités d'exécution spéculative ?
  5. Quelle description correspond le mieux aux problèmes traités par la sécurité matérielle ?

Termes associés

Spectre Prédiction de branchement Meltdown Attaque par analyse de consommation Attaque par canal auxiliaire Attaque par démarrage à froid (cold boot) Attaque par injection de fautes Attaque temporelle (timing attack) Attestation à distance Cheval de Troie matériel

Retour au glossaire