« Fonctionnement d'un ordinateur/Les architectures à capacités » : différence entre les versions

Contenu supprimé Contenu ajouté
mAucun résumé des modifications
mAucun résumé des modifications
Ligne 1 :
Certains processeurs incorporent des méthodes qui permettent d’améliorer la sureté de fonctionnement ou la sécurité. Elles permettent d'éviter certaines attaques logicielles, comme des virus ou des accès non autorisés directement en matériel. Ces jeux d'instructions sont conçus en synergie avec certains systèmes d'exploitation. Il s'agit des capability based processors, ou '''architectures à capacités'''. SurDans celles-ci, chaque adresse est associée à des autorisations d'accès.les Pargrandes exemplelignes, leil code ds'un systèmeagit d'exploitationarchitectures auraorientées accès en écriture à certaines adresses critiquesobjet, quidont contiennentle deslangage paramètresmachine deest sécuritéun critique,langage maisorienté lesobjet autres programmes n'y auront accès(bien qu'enétant lectureun (voirelangage pas du toutmachine). Les droits d'accès ne seront pas les mêmes, et les capacités différentes (parfois pour une même adresse). Ces droits d'accès sont rassemblés dans une suite de bits, que l'on appelle une capability, ou capacité. Celles-ci décrivent :
 
===Capacités==
* quels sont les droits d'accès en lecture et écriture : lecture seule, pas de lecture ou écriture possible, et ainsi de suite ;
* à quelle zone de mémoire correspondent ces autorisations : il faut indiquer l'adresse de base et la longueur (nombre de mots mémoire) ;
* et sur certaines architectures, quel est le type de la donnée.
 
Sur les Capability Based processors, la notion même d'adresses mémoire n'existe pas (ou presque). À la place, chaque donnée manipulée par le processeur est stockée dans un '''objet''', une sorte de conteneur générique placé quelque part dans la mémoire, sans que l'on ait de moyen de savoir où. Cet objet peut être absolument n'importe quoi : cela peut être un objet spécifié par le programmeur, ou des objets prédéfinis lors de la fabrication du processeur. Par exemple, on peut considérer chaque périphérique comme un objet, auquel on a défini des méthodes bien particulières qui permettront de communiquer avec celui-ci ou de le commander. Sur d'autres architectures, chaque programme en cours d’exécution est considéré comme un objet, avec des méthodes permettant d'agir sur son état. On peut ainsi stopper l’exécution d'un programme via des méthodes adaptées, par exemple. Mais ce qui va nous permettre d'adapter des langages de programmation orientés objet sur de telles architectures, c'est la possibilité de créer soi-même des objets non définis lors de la fabrication du processeur.
Les instructions de lecture et écriture prennent comme argument une adresse et une capacité. Pour avoir accès à une adresse, le programme doit fournir automatiquement la capacité qui va avec : il doit la charger dans des registres spécialisés. Ces capacités sont mémorisées dans la mémoire RAM : chaque programme ou fonction a accès à une liste de capacités en mémoire RAM. Les instructions qui manipulent les registres de capacités ne peuvent pas, par construction, augmenter les droits d'accès d'une capacité : ils peuvent retirer des droits, pas en ajouter. Ce mécanisme interdit donc à tout sous-programme ou programme de modifier une adresse qui n'est pas dans sa liste de capacité : le programme ne pourra pas récupérer la capacité, et n'aura pas accès à l'adresse voulue. Avec ce genre de mécanismes, il devient difficile d’exécuter certains types d'attaques, ce qui est un gage de sureté de fonctionnement indéniable. Du moins, c'est la théorie : tout repose sur l'intégrité des listes de capability : si on peut modifier celles-ci, alors il devient facile de pouvoir accéder à des objets auxquels on n’aurait pas eu droit.
 
Au lieu d’utiliser des adresses mémoire et autres mécanismes divers et variés, chaque objet se voit attribuer un '''identifiant''' bien précis. Cet identifiant est unique à un objet (deux objets ne peuvent avoir le même identifiant), et il ne change pas au cours du temps : il est défini lorsqu'un objet est crée et ne peut être réutilisé pour un autre objet que lorsque l'objet possédant cet identifiant est détruit. Dans les grandes lignes, on peut voir cet identifiant comme une sorte d'adresse virtuelle, qui permet de localiser l'objet mais peut correspondre à une adresse physique totalement différente. De plus, chaque objet est associée à des '''autorisations d'accès'''. Par exemple, le code d'un système d'exploitation aura accès en écriture à certaines adresses critiques, qui contiennent des paramètres de sécurité critique, mais les autres programmes n'y auront accès qu'en lecture (voire pas du tout). Les droits d'accès ne seront pas les mêmes et les capacités différentes (parfois pour un même objet). Ces droits d'accès sont rassemblés dans une suite de bits, que l'on appelle une '''capacité'''. Celles-ci décrivent les droits d'accès, l'identifiant et éventuellement le type de la donnée.
 
Les instructions de lecture et écriture prennent comme argument uneun adresseidentifiant et une capacité. Pour avoir accès à uneun adresseidentifiant, le programme doit fournir automatiquement la capacité qui va avec : il doit la charger dans des registres spécialisés. Ces capacités sont mémorisées dans la mémoire RAM : chaque programme ou fonction a accès à une '''liste de capacités''' en mémoire RAM. Les instructions qui manipulent les registres de capacités ne peuvent pas, par construction, augmenter les droits d'accès d'une capacité : ils peuvent retirer des droits, pas en ajouter. Ce mécanisme interdit donc à tout sous-programme ou programme de modifier une adresse qui n'est pas dans sa liste de capacité : le programme ne pourra pas récupérer la capacité, et n'aura pas accès à l'adresse voulue. Avec ce genre de mécanismes, il devient difficile d’exécuter certains types d'attaques, ce qui est un gage de sureté de fonctionnement indéniable. Du moins, c'est la théorie : tout repose sur l'intégrité des listes de capabilitycapacité : si on peut modifier celles-ci, alors il devient facile de pouvoir accéder à des objets auxquels on n’aurait pas eu droit.