Caractรฉristiques des jeux dโinstructions
Le jeu dโinstructions ou ISA influe directement sur lโimplรฉmentation du processeur. Selon les opรฉrations dรฉfinies, ce dernier devra รชtre conรงu pour les implรฉmenter. Ainsi, il existe plusieurs types de jeu dโinstructions, qui peuvent varier dans leur maniรจre de reprรฉsenter les donnรฉes ou les instructions.
Reprรฉsentation des donnรฉes Une instruction spรฉcifie รฉgalement les donnรฉes avec lesquelles ont lieu les opรฉrations. Ces donnรฉes, selon les architectures, peuvent prendre diffรฉrentes formes. Voici quelques modรจles :
– Le modรจle ร accumulateur possรจde un registre interne utilisรฉ par dรฉfaut pour stocker le rรฉsultat des instructions. Des instructions de load et de store sont nรฉcessaires pour respectivement recevoir ou envoyer des donnรฉes en mรฉmoire.
– Le modรจle mรฉmoire-mรฉmoire nโeffectue des opรฉrations que sur des donnรฉes en mรฉmoire. Le rรฉsultat est ainsi directement stockรฉ en mรฉmoire. Plusieurs accรจs sont donc nรฉcessaires pour chaque instruction.
– Le modรจle registre-registre effectue des opรฉrations uniquement sur des donnรฉes contenues dans des registres. De mรชme, le rรฉsultat est stockรฉ dans un registre. Ce modรจle nรฉcessite lui aussi des instructions dรฉdiรฉes de load et de store pour accรฉder ร la mรฉmoire.
Les ISA utilisรฉes actuellement suivent quasiment toute le modรจle registre-registre. Les mรฉmoires รฉtant trop lentes, chaque accรจs ralentit le systรจme. Le modรจle registre-registre offre une flexibilitรฉ intรฉressante au programmeur qui dispose de plusieurs emplacements rapides dโaccรจs pour stocker des donnรฉes. Les accรจs mรฉmoires pour rรฉcupรฉrer des donnรฉes ne sont pas systรฉmatiques. Pour la suite de ce manuscrit, sauf indication contraire, nous ne considรจrerons donc que ce modรจle lร . Familles de jeu dโinstructions Les diffรฉrents jeux dโinstructions peuvent รฉgalement varier dans leur choix de reprรฉsentation des opรฉrations. En voici les trois principales familles :
1. Les ISA de type Reduced Instruction Set Computer (RISC) visent ร associer des opรฉrations simples ร chaque instruction. Chacune ne nรฉcessite donc que peu de cycles dโhorloge pour รชtre exรฉcutรฉe.
Un autre avantage est la simplicitรฉ dโimplรฉmentation : un nombre rรฉduit dโopรฉrations รฉlรฉmentaires est suffisant. Le logiciel est ensuite responsable de les combiner pour rรฉaliser des opรฉrations pluscomplexes.
2. Les ISA de type Complex Instruction Set Computer (CISC) visent ร
associer des opรฉrations complexes ร chaque instruction. Contrairement au RISC, un plus grand nombre de cycles dโhorloge est
nรฉcessaire pour exรฉcuter chaque instruction. De plus, lโimplรฉmentation est complexifiรฉe : chaque instruction mรจne ร plusieurs
sous-opรฉrations au niveau du matรฉriel. En revanche, ce jeu dโinstructions est intรฉressant du point de vue logiciel de par la variรฉtรฉ
dโopรฉrations quโil offre. Une seule instruction CISC peut-รชtre lโรฉquivalent de plusieurs instructions RISC. Cela impacte รฉgalement la taille des programmes et des mรฉmoires : moins dโinstructions sont nรฉcessaires pour des opรฉrations complexes.
3. Les ISA de type Very Long Instruction Word (VLIW) visent ร regrouper plusieurs sous-opรฉrations dans des instructions trรจs longues. Lโobjectif de ce genre dโarchitecture est de permettre au processeur de rรฉaliser un grand nombre dโopรฉrations en mรชme temps. Pour cela, le compilateur joue un rรดle essentiel : il sโassure que les diffรฉrentes parties dโune mรชme instruction utilisent des mรฉcanismes diffรฉrents du processeur. Cela permet dโรฉviter des conflits internes dโaccรจs aux ressources lors de lโexรฉcution.
Historiquement, les caractรฉristiques des processeurs RISC et CISC รฉtaient opposรฉes. Ce contraste est maintenant obsolรจte et se rรฉsume ร un compromis entre coรปt de dรฉcodage (traduction de lโinstruction en opรฉrations matรฉrielles) et coรปt mรฉmoire (place pour stocker les instructions).
Architectures dโISA existantes Plusieurs ISA ont รฉtรฉ dรฉveloppรฉes. Chacune dโentre elles a des caractรฉristiques qui lui sont propres. Par la suite, trois dโentre elles seront particuliรจrement รฉvoquรฉes :
1. LโISA propriรฉtaire x86 dโIntel. Cโest un jeu dโinstructions CISC que lโon retrouve dans les processeurs dโIntel et dโAMD, notamment ร destination des serveurs ou ordinateurs personnels.
2. LโISA proriรฉtaire ARM dโArm. Cโest un jeu dโinstructions RISC que lโon retrouve majoritairement dans les processeurs dโArm principalement ร destination des systรจmes embarquรฉs et tรฉlรฉphones.
3. LโISA libre et ouverte RISC-V maintenue par la fondation du mรชme nom. Cโest la cinquiรจme version dโISA RISC dรฉveloppรฉe par lโUniversitรฉ de Berkeley. Au dรฉpart dรฉveloppรฉe pour des travaux de recherche, elle est ces derniรจres annรฉes au cลur de nombreux projets industriels.
Mรฉmoires caches
Nous avons vu que la latence mรฉmoire est un facteur limitant dans les performances des processeurs. Celui-ci est ainsi capable dโexรฉcuter bien plus vite les instructions (une chaque cycle) que la mรฉmoire nโest capable de lui en envoyer (plusieurs dizaines de cycles). Un mรฉcanisme pour tenter de contrer ce problรจme est lโutilisation de mรฉmoires caches.
Une mรฉmoire cache est une mรฉmoire plus rapide que la mรฉmoire principale (gรฉnรฉralement de la mรฉmoire dynamique) : moins de cycles dโhorloge sont nรฉcessaires pour accรฉder ร ses donnรฉes. En contrepartie, les mรฉmoires caches ont une contenance rรฉduite. Augmenter la taille dโune mรฉmoire cache augmente รฉgalement sa complexitรฉ. Chaque donnรฉe doit รชtre accessible ร tout moment : certains mรฉcanismes matรฉriels sont pour cela nรฉcessaires. Un plus grand nombre de donnรฉes implique donc plus dโopรฉrations matรฉrielles ร rรฉaliser et une latence accrue. Ainsi, ces mรฉmoires sont gรฉnรฉralement conรงues pour contenir une quantitรฉ limitรฉe de donnรฉes, en plus du fait quโelles nรฉcessitent des technologies de fabrications onรฉreuses.
Le but des mรฉmoires caches est de stocker localement une copie de certaines donnรฉes ou instructions situรฉes dans la mรฉmoire principale.
Ces copies deviennent plus rapidement accessibles. Cependant, seule une petite partie de la mรฉmoire principale peut รชtre placรฉe dans un cache.
Lors dโun accรจs du processeur ร une donnรฉe, on appelle un cache hit le fait que la donnรฉe demandรฉe se trouve dans le cache. Du point de vue du pipeline, cela revient ร effectuer un accรจs mรฉmoire accรฉlรฉrรฉ : moins de cycles dโhorloge sont nรฉcessaires. ร lโinverse, si la donnรฉe demandรฉe nโest pas dans le cache, on appelle cela un cache miss. Cela revient donc ร effectuer un accรจs mรฉmoire ralenti : plus de cycles dโhorloge sont nรฉcessaires pour aller accรฉder ร la mรฉmoire principale.
Finalement, le choix des donnรฉes ou instructions placรฉes dans un cache est essentiel. Il dรฉtermine directement quels accรจs effectuรฉs par le pipeline seront accรฉlรฉrรฉs (hit) ou ralentis (miss). Pour maximiser lโefficacitรฉ, ce choix se base sur le principe de localitรฉ.
Spรฉculation
La spรฉculation est un principe utilisรฉ pour accรฉlรฉrer lโexรฉcution des instructions. Lโidรฉe gรฉnรฉrale est de prรฉvoir les futurs รฉvรจnements (redirection du flot dโexรฉcution, accรจs mรฉmoires, etc.) pour les anticiper et rรฉduire leur impact sur les performances.
Pipeline et exรฉcution dans le dรฉsordre
Le mรฉcanisme le plus simple usant de spรฉculation dans un processeur est le pipeline lui-mรชme. Le fait de rรฉcupรฉrer en avance les prochaines instructions en mรฉmoire avant dโavoir complรจtement exรฉcutรฉ les prรฉcรฉdentes est une forme dโanticipation. Cependant, le fonctionnement basique dโun pipeline impose rapidement des limites ร la spรฉculation.
Dรฉpendances de donnรฉes Il existe au sein des programmes des dรฉpendances entre les instructions. Par exemple, lโopรฉrande dโune instruction peut รชtre le rรฉsultat dโune instruction prรฉcรฉdente. Le Code 2.2 reprรฉsentele cas classique dโun calcul de PGCD, un algorithme mathรฉmatique simpliste. On y retrouve alors plusieurs cas de dรฉpendances (e.g. les lignes 3 et 5, 4 et 5, 18 et 20 etc.). Ces dรฉpendances peuvent crรฉer des bulles au sein du pipeline : il faut attendre que le rรฉsultat soit disponible avant de faire avancer la prochaine instruction. Ces mรชmes bulles peuvent aussi รชtre crรฉรฉes dans le cas oรน un accรจs mรฉmoire est ralenti ร cause dโun cache miss par exemple (e.g. si la ligne 3 est un miss, la ligne 4 devra attendre รฉgalement). Des mรฉcanismes de renvoi de registre (register forwarding) existent pour limiter lโimpact des dรฉpendances de donnรฉes. Ils servent ร rendre utilisable un rรฉsultat dรจs quโil est calculรฉ. ร lโรฉchelle dโun pipeline, un rรฉsultat est donc disponible en interne avant quโil ne soit stockรฉ dans un GPR par le dernier รฉtage.
Les dรฉpendances deviennent un facteur limitant dโautant plus important dans le cas de processeurs superscalaires. Ces derniers cherchent ร augmenter le dรฉbit dโexรฉcution en traitant plusieurs instructions ร la fois dans chaque รฉtage. Pour cela, la plupart des mรฉcanismes sont dupliquรฉs (e.g. plusieurs dรฉcodeurs et unitรฉs dโexรฉcutions). Ainsi, en cas de bulle, le nombre dโinstructions ralenties est dโautant plus important.
Or, le nombre dโinstructions en cours dโexรฉcution รฉtant plus grand, le nombre de dรฉpendances ร gรฉrer lโest รฉgalement.
Rรฉorganisation dynamique des instructions Un mรฉcanisme utilisรฉ dans les processeurs complexes pour diminuer les blocages dus aux dรฉpendances est lโexรฉcution dans le dรฉsordre. Son rรดle est dโoptimiser les cas oรน aucune dรฉpendance nโest bloquante. Lโobjectif devient alors dโexรฉcuter une instruction dรจs que toutes ses dรฉpendances sont rรฉsolues.
Cela sโoppose donc au format linรฉaire dโun pipeline basique, oรน une instruction nโest forcรฉment exรฉcutรฉe quโaprรจs toutes les prรฉcรฉdentes. Des mรฉcanismes matรฉriels sont alors responsables de prรฉserver lโordre du programme. Ils sโassurent que si les instructions sont exรฉcutรฉes dans un ordre diffรฉrent de celui prรฉvu par le logiciel, lโรฉtat architectural 20 2. Composants microarchitecturaux (celui visible par le logiciel) reste celui attendu. Mรชme dans le cas dโun algorithme simple comme celui du Code 2.2, on retrouve plusieurs cas oรน cette optimisation peut รชtre bรฉnรฉfique. Par exemple, en cas de blocage de la ligne 10, les lignes 11 et 12 peuvent tout de mรชme รชtre exรฉcutรฉes.
Si les opรฉrandes se situent gรฉnรฉralement dans des registres, il existe รฉgalement des opรฉrations rรฉalisant des accรจs mรฉmoires. De la mรชme maniรจre, des dรฉpendances se crรฉent si des instructions accรจdent ร une mรชme adresse. Il existe donc des processeurs qui รฉtendent lโexรฉcution dans le dรฉsordre ร ces accรจs mรฉmoire. Ils tentent alors de prรฉdire les adresses utilisรฉes ainsi que les valeurs lues/รฉcrites.
Pour รชtre implรฉmentรฉe au niveau matรฉriel, lโexรฉcution dans le dรฉsordre demande un grand nombre de ressources coรปteuses. Des tables sont par exemple nรฉcessaires pour mรฉmoriser lโordre original du programme, rรฉaliser des sauvegardes temporaires des รฉtats en cas dโerreur etc. Ce mรฉcanisme est donc gรฉnรฉralement rรฉservรฉ aux processeurs avec dโimportantes contraintes sur les performances. Cโest par exemple le cas de la plupart des processeurs grand public (e.g. les processeurs Intel ou AMD) fabriquรฉs depuis de nombreuses annรฉes.
Exploitation de la microarchitecture par le logiciel
Rรฉsumรฉ du chapitre : Dans ce chapitre, nous nous intรฉressons aux attaques logicielles exploitant les mรฉcanismes de la microarchitecture. De nombreux travaux ont montrรฉ que des programmes normalement isolรฉs pouvaient interagir grรขce au matรฉriel : un principe microarchitectural comme le partage de ressources est notamment utilisรฉ. Aprรจs quelques rappels sur des รฉlรฉments et concepts nรฉcessaires, nous รฉtudions les diffรฉrentes attaques exploitant la microarchitecture en quatre parties : les attaques par analyses des variations temporelles, les attaques par contention dynamique de ressources, les attaques par exรฉcution transitoire et enfin les attaques par canaux contrรดlรฉs.
Objectifs de sรฉcuritรฉ
Contexte Nous avons vu dans le chapitre prรฉcรฉdent que les processeurs sont des composants รฉlectroniques essentiels. Ils sont responsables de lโexรฉcution des calculs au sein de systรจmes variรฉs, que ce soit des ordinateurs, des serveurs, de tรฉlรฉphones ou dโautres systรจmes embarquรฉs. Selon les cas dโapplication, ils peuvent รชtre utilisรฉs pour le traitement de donnรฉes sensibles et confidentielles. Ils doivent alors รชtre capables dโassurer la protection de ces donnรฉes.
Ce dernier aspect a longtemps รฉtรฉ nรฉgligรฉ au profit des performances. Lโexistence de potentielles failles exploitables est connue depuis de nombreuses annรฉes. Lโajout de nouveaux mรฉcanismes, comme vu prรฉcรฉdemment, nโa fait quโaccroรฎtre les faiblesses de ces systรจmes. Cela mรจne aux processeurs modernes de ces derniรจres annรฉes, cibles dโattaques certes plus complexes, mais surtout plus puissantes.
Modรจle dโattaquant Un modรจle dโattaquant dรฉfinit les capacitรฉs dโun attaquant. Il dรฉtermine la maniรจre dont ce dernier peut influer sur le systรจme et quelles actions il peut mener. De la mรชme maniรจre, ce modรจle dรฉlimite les menaces que doivent considรฉrer les solutions mises en place. Dans ce manuscrit, nous nous intรฉressons aux attaques logicielles exploitant la microarchitecture. Elles peuvent รชtre dรฉfinies comme des programmes qui, au cours de leur exรฉcution, utilisent les diffรฉrents mรฉcanismes matรฉriels ร disposition ร des fins malveillantes (e.g. retrouver des informations secrรจtes).
Dans notre cas, nous considรฉrons donc un attaquant capable dโexรฉcuter des programmes sur un processeur et dโeffectuer des mesures de temps. Gรฉnรฉralement, les ISA incluent des instructions permettant de connaรฎtre le nombre de cycles exรฉcutรฉs. Cette fonctionnalitรฉ est commune et essentielle pour de nombreux programmes. En exรฉcutant deux mesures de cycles, un attaquant est capable de dรฉduire le nombre de cycles qui sโest รฉcoulรฉ entre ces deux instructions. Il peut ainsi connaรฎtre le temps quโa utilisรฉ le processeur pour exรฉcuter les instructions entre ces deux mesures. Dans notre modรจle, lโattaquant dispose du minimum de droits sur le systรจme. Il nโest donc pas privilรฉgiรฉ et nโa accรจs quโร ses propres donnรฉes.
|
Table des matiรจres
Remerciements
Sommaire
Liste des figures
Liste des tableaux
Liste des codes
Liste des acronymes
1. Introduction
1.1. Contexte
1.2. Sรฉcuritรฉ dans les systรจmes
1.3. Objectifs et contributions
1.4. Organisation du manuscrit
Comprendre les microarchitectures modernes
2. Composants microarchitecturauxย
2.1. Principes gรฉnรฉraux
Circuits logiques et mรฉmoires
Organisation du processeur
Caractรฉristiques des jeux dโinstructions
2.2. Lโenjeu des performances
Limites du modรจle de base
Utilisation dโun pipeline
Mรฉmoires caches
2.3. Spรฉculation
Pipeline et exรฉcution dans le dรฉsordre
Prรฉdiction dynamique de branchement
Prefetcher
2.4. Parallรฉlisme des exรฉcutions
2.5. Mรฉmoire virtuelle
2.6. Mรฉcanismes de sรฉcuritรฉ
Privilรจges
Exceptions et interruptions
2.7. Conclusion
3. Exploitation de la microarchitecture par le logiciel
3.1. Objectifs de sรฉcuritรฉ
3.2. Principes microarchitecturaux exploitรฉs
3.3. Attaques par analyse des variations temporelles
Principes
Attaques sur les mรฉmoires caches
รtude gรฉnรฉralisรฉe du systรจme
3.4. Attaques par contention dynamique de ressources
Principes
Impact sur les timings
3.5. Attaques par exรฉcution transitoire
Principes
Spectre
Meltdown
รchantillonnage des donnรฉes microarchitecturales
3.6. Attaques par canal contrรดlรฉ
3.7. Synthรจse et conclusion
4. Solutions existantes contre lโexploitation logicielle
4.1. Solutions pour la gestion des ressources partagรฉes
Suppression des mรฉcanismes
Effacement des traces
Partitionnement des ressources
4.2. Solutions pour la gestion de la spรฉculation
Modifications du logiciel
Renforcement du matรฉriel
4.3. Solutions de gestion du temps et des รฉvรจnements
Modification des รฉvรจnements microarchitecturaux
Indรฉterminisme du fonctionnement
Altรฉration des mesures de temps
Exรฉcution en temps constant
4.4. Stratรฉgie globale
Prise en compte ciblรฉe des failles
Rรดles des couches dโabstraction
4.5. Conclusion et suite
Repenser le jeu dโinstructions
5. Modifier lโISA pour la sรฉcuritรฉ
5.1. Principes de base
5.2. Organisation des domaines de sรฉcuritรฉ
Hiรฉrarchie statique
Hiรฉrarchie hybride
Hiรฉrarchie dynamique
5.3. Politique dโisolation microarchitecturale dans lโISA
Forme des modifications de lโISA
Stratรฉgies dโabstraction du matรฉriel
5.4. Conclusion
6. Domes
6.1. Stratรฉgie de modification de lโISA
ISA de base : RISC-V 32 bits
Objectifs dโimplรฉmentation
6.2. Proposition dโimplรฉmentation
Modรจles et reprรฉsentation
Opรฉrations et instructions
Utilisation des capacitรฉs : les exceptions
6.3. Support dโune politique dโisolation
6.4. Impact sur le logiciel
Conception de la hiรฉrarchie
Compilation
Scรฉnario de dome.switch frรฉquents
6.5. Extension du modรจle
Accรจs aux compteurs de performances
Intรฉgritรฉ du flot dโexรฉcution
Chiffrement et authentification de la mรฉmoire
Augmentation du nombre de domes
6.6. Version rรฉtrocompatible avec les privilรจges statiques
6.7. Conclusion
Adapter la microarchitecture
7. Conception des ressources partagรฉesย
7.1. Dรฉfinitions
Ressource partagรฉe
Problรฉmatique et objectifs
7.2. Allocation statique des ressources
Principe
Mรฉcanismes pour lโimplรฉmentation
7.3. Sรฉparation des ressources
Principes
Mรฉcanismes pour lโimplรฉmentation
7.4. Suppression des traces
Principe
Mรฉcanismes pour lโimplรฉmentation
7.5. Homogรฉnรฉitรฉ
7.6. Modรจle mรฉmoire et renforcement des frontiรจres
Objectif
Accรจs contrรดlรฉ
Duplication
Cohรฉrence
7.7. Conclusion
8. Implรฉmentation dโune politique dโisolationย
8.1. Contexte
8.2. Processeur Aubrac
Description de lโarchitecture de base
Support des domes
8.3. Processeur Salers
Description de lโarchitecture de base
Support des domes
8.4. Mรฉmoire cache
Fonctionnement gรฉnรฉral des caches
Partie ยซย mรฉmoireย ยป des caches
Partie ยซย contrรดleurย ยป des caches
Partie ยซย busย ยป des caches
8.5. Gรฉnรฉricitรฉ de lโapproche
8.6. Autres mรฉcanismes
8.7. Conclusion
9. รvaluationย
9.1. Timesecbench : une suite de tests pour la sรฉcuritรฉ
Objectif et contraintes de dรฉveloppement
Scรฉnario dโattaquant
Vulnรฉrabilitรฉs couvertes par Timesecbench
9.2. Mesure dโefficacitรฉ des contremesures
Comparaison des implรฉmentations vulnรฉrables et sรฉcurisรฉes
Isolation temporelle
Isolation spatiale
9.3. Analyse des performances et du coรปt
Performances
Coรปt en ressources matรฉrielles
9.4. Bilan et conclusion
10. Conclusion
10.1. Rรฉsumรฉ des travaux
10.2. Bilan synthรฉtique
10.3. Travaux futurs et perspectives
Publications et communications
Bibliographie
Annexes
A. Paramรจtres des processeurs
A.1. Processeur Aubrac
A.2. Processeur Salers
B. Liste des instructions pour les domes