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
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.
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.