Article de reference

Anneau de protection

Anneaux de privilèges pour x86 disponibles en mode protégé En informatique , les domaines de protection hiérarchiques , souvent appelés anneaux de protection , sont des mécanism...

Anneaux de privilèges pour x86 disponibles en mode protégé

En informatique , les domaines de protection hiérarchiques , souvent appelés anneaux de protection , sont des mécanismes permettant de protéger les données et les fonctionnalités contre les pannes (en améliorant la tolérance aux pannes ) et les comportements malveillants (en assurant la sécurité informatique ).

Les systèmes d'exploitation offrent différents niveaux d'accès aux ressources. Un anneau de protection correspond à l'un des deux ou plusieurs niveaux hiérarchiques de privilèges au sein de l'architecture d'un système informatique . Ce niveau est généralement appliqué matériellement par certaines architectures de processeur qui proposent différents modes de fonctionnement au niveau matériel ou microcode . Les anneaux sont organisés hiérarchiquement , du plus privilégié (le plus fiable, généralement numéroté 0) au moins privilégié (le moins fiable, généralement avec le numéro d'anneau le plus élevé). Sur la plupart des systèmes d'exploitation, l'anneau 0 est le niveau qui offre le plus de privilèges et interagit le plus directement avec le matériel, notamment certaines fonctionnalités du processeur (par exemple, les registres de contrôle) et les contrôleurs d'entrée/sortie.

Des mécanismes spécifiques permettent à un anneau externe d'accéder aux ressources d'un anneau interne selon une méthode prédéfinie, évitant ainsi un usage arbitraire. Un contrôle d'accès rigoureux entre les anneaux renforce la sécurité en empêchant les programmes d'un anneau ou d'un niveau de privilège d'utiliser abusivement les ressources destinées aux programmes d'un autre anneau. Par exemple, un logiciel espion exécuté comme programme utilisateur dans l'anneau 3 ne devrait pas pouvoir activer une webcam sans en informer l'utilisateur, car l'accès au matériel est une fonction de l'anneau 1 réservée aux pilotes de périphériques . Les programmes tels que les navigateurs web exécutés dans des anneaux de niveau supérieur doivent demander l'accès au réseau, une ressource réservée aux anneaux de niveau inférieur.

L'architecture X86S , une architecture Intel annulée et publiée en 2024, ne comporte que les anneaux 0 et 3. Les anneaux 1 et 2 devaient être supprimés de X86S car les systèmes d'exploitation modernes ne les utilisent jamais.

Mises en œuvre

La protection multi-anneaux figurait parmi les concepts les plus révolutionnaires introduits par le système d'exploitation Multics , un prédécesseur hautement sécurisé de la famille Unix actuelle. L'ordinateur central GE 645 disposait certes d'un contrôle d'accès matériel, incluant les deux mêmes modes que les autres machines de la série GE-600, ainsi que des permissions au niveau des segments dans son unité de gestion de la mémoire (« Unité d'ajout »). Cependant, cela ne suffisait pas pour une prise en charge matérielle complète des anneaux. Multics les prenait donc en charge en interceptant les transitions d'anneau par logiciel ; son ​​successeur, le Honeywell 6180 , les implémentait matériellement, avec la prise en charge de huit anneaux ; les anneaux de protection de Multics étaient indépendants des modes du processeur ; le code de tous les anneaux, à l'exception de l'anneau 0, et une partie du code de l'anneau 0, s'exécutait en mode esclave.

Cependant, la plupart des systèmes d'exploitation généralistes n'utilisent que deux anneaux, même si le matériel sur lequel ils fonctionnent offre davantage de modes de processeur . Par exemple, Windows 7 et Windows Server 2008 (et leurs prédécesseurs) n'utilisent que deux anneaux : l'anneau 0 correspond au mode noyau et l'anneau 3 au mode utilisateur , car les versions antérieures de Windows NT fonctionnaient sur des processeurs ne prenant en charge que deux niveaux de protection

De nombreuses architectures de processeurs modernes (dont la populaire architecture Intel x86 ) intègrent une forme de protection par anneaux, bien que le système d'exploitation Windows NT , à l'instar d'Unix, n'exploite pas pleinement cette fonctionnalité. OS/2 utilise, dans une certaine mesure, trois anneaux : pour le code du noyau et les pilotes de périphériques, l'anneau 2 pour le code privilégié (programmes utilisateur disposant d'autorisations d'entrée/sortie) et l'anneau 3 pour le code non privilégié (la quasi-totalité des programmes utilisateur). Sous DOS , le noyau, les pilotes et les applications s'exécutent généralement sur l'anneau 3 (cependant, cela n'est vrai que lorsque des pilotes en mode protégé ou des extensions DOS sont utilisés ; en mode réel, le système fonctionne sans protection), tandis que les gestionnaires de mémoire 386, tels qu'EMM386, s'exécutent sur l'anneau 0. De plus, EMM386 3.xx de DR-DOS peut, en option, exécuter certains modules (comme DPMS ) sur l'anneau 1. OpenVMS utilise quatre modes appelés (par ordre de privilèges décroissants) : Noyau, Exécutif, Superviseur et Utilisateur.

Bien que l'architecture x86 dispose de quatre anneaux de protection, il est plus courant que les autres architectures n'en possèdent que deux. Même sur x86, la plupart des systèmes d'exploitation n'utilisent que les anneaux 0 et 3.

L'intérêt renouvelé pour cette structure de conception est apparu avec la prolifération du logiciel Xen VMM , les discussions en cours sur les noyaux monolithiques par rapport aux micro-noyaux (en particulier dans les groupes de discussion Usenet et les forums Web ), la structure de conception Ring-1 de Microsoft dans le cadre de son initiative NGSCB et les hyperviseurs basés sur la virtualisation x86 tels que Intel VT-x (anciennement Vanderpool).

Le système Multics d'origine comportait huit anneaux, mais de nombreux systèmes modernes en possèdent moins. Le matériel conserve en permanence la connaissance de l'anneau dans lequel s'exécute le thread d'instructions , grâce à un registre machine dédié. Dans certains systèmes, des zones de mémoire virtuelle se voient attribuer des numéros d'anneau par le matériel. C'est le cas, par exemple, du Data General Eclipse MV/8000 , où les trois bits de poids fort du compteur de programme (PC) servaient de registre d'anneau. Ainsi, un code exécuté avec le PC virtuel initialisé à 0xE200000, par exemple, se trouverait automatiquement dans l'anneau 7, et l'appel d'une sous-routine située dans une autre zone de mémoire provoquerait automatiquement un transfert d'anneau.

Le matériel restreint considérablement les modes de transfert de contrôle entre anneaux et impose des restrictions sur les types d'accès mémoire autorisés. Prenons l'exemple de l'architecture x86 : une structure de porte spécifique , référencée par l' instruction d'appel , transfère le contrôle de manière sécurisée vers des points d'entrée prédéfinis dans les anneaux de niveau inférieur (plus fiables). Cette structure joue le rôle d'un appel superviseur dans de nombreux systèmes d'exploitation utilisant l'architecture en anneau. Ces restrictions matérielles visent à limiter les risques de failles de sécurité, qu'elles soient accidentelles ou malveillantes. De plus, l'anneau le plus privilégié peut bénéficier de capacités spéciales (comme l'adressage mémoire réel, contournant la mémoire virtuelle matérielle).

L'architecture ARM version 7 implémente trois niveaux de privilèges : application (PL0), système d'exploitation (PL1) et hyperviseur (PL2). Le niveau 0 (PL0) est le moins privilégié, tandis que le niveau 2 est le plus privilégié. L'architecture ARM version 8 implémente quatre niveaux d'exception : application (EL0), système d'exploitation (EL1), hyperviseur (EL2) et moniteur sécurisé/micrologiciel (EL3), pour AArch64 et AArch32

La protection en anneau peut être combinée avec les modes de processeur (mode maître/noyau/privilégié/ superviseur versus mode esclave/non privilégié/utilisateur) sur certains systèmes. Les systèmes d'exploitation exécutés sur du matériel compatible avec les deux peuvent utiliser les deux formes de protection ou une seule.

L’utilisation efficace d’une architecture en anneau nécessite une étroite collaboration entre le matériel et le système d’exploitation.

Modes

Mode superviseur

En informatique, le mode superviseur est un indicateur matériel modifiable par le code système. Les tâches ou threads système peuvent avoir cet activé pendant leur exécution, contrairement aux applications utilisateur. Cet indicateur détermine la possibilité d'exécuter des opérations en code machine, comme la modification des registres de différentes tables de descripteurs, ou des opérations telles que la désactivation des interruptions. L'idée de deux modes de fonctionnement distincts repose sur le principe « plus de pouvoir implique plus de responsabilités » programme en mode superviseur est censé ne jamais tomber en panne, car une panne pourrait entraîner le plantage de tout le système.

Le mode superviseur est « un mode d’exécution sur certains processeurs qui permet l’exécution de toutes les instructions, y compris les instructions privilégiées. Il peut également donner accès à un espace d’adressage différent, au matériel de gestion de la mémoire et à d’autres périphériques. C’est le mode dans lequel le système d’exploitation fonctionne habituellement. »

Dans un noyau monolithique , le système d'exploitation s'exécute en mode superviseur et les applications en mode utilisateur. D'autres types de systèmes d'exploitation , comme ceux dotés d'un exokernel ou d'un micro-noyau , ne présentent pas nécessairement ce comportement.

Quelques exemples tirés du monde du PC :

  • Linux , macOS et Windows sont trois systèmes d'exploitation utilisant le mode superviseur/utilisateur. Pour exécuter des fonctions spécifiques, le code en mode utilisateur doit effectuer un appel système vers le mode superviseur, voire vers l'espace noyau. Dans ce cas, du code de confiance du système d'exploitation effectue la tâche nécessaire et retourne l'exécution à l'espace utilisateur. Du code supplémentaire peut être ajouté à l'espace noyau via des modules noyau chargeables , mais uniquement par un utilisateur disposant des autorisations requises, car ce code n'est pas soumis aux contrôles d'accès et aux limitations de sécurité du mode utilisateur.
  • DOS (tant qu'aucun gestionnaire de mémoire 386 tel que EMM386 n'est chargé), ainsi que d'autres systèmes d'exploitation simples et de nombreux dispositifs embarqués fonctionnent en mode superviseur en permanence, ce qui signifie que les pilotes peuvent être écrits directement en tant que programmes utilisateur.

La plupart des processeurs possèdent au moins deux modes différents. Les processeurs x86 en possèdent quatre, répartis en quatre anneaux. Les programmes exécutés en anneau 0 peuvent effectuer toutes les opérations sur le système, tandis que ceux exécutés en anneau 3 peuvent échouer à tout moment sans impacter le reste du système. Les anneaux 1 et 2 sont rarement utilisés, mais peuvent être configurés avec différents niveaux d'accès.

Dans la plupart des systèmes existants, le passage du mode utilisateur au mode noyau engendre une perte de performance importante. On estime que, pour une requête de base getpid, ce passage nécessite entre 1 000 et 1 500 cycles sur la plupart des machines. Sur ce total, une centaine de cycles seulement sont dédiés au basculement proprement dit (70 pour passer du mode utilisateur au mode noyau, et 40 pour revenir au mode noyau), le reste correspondant à la surcharge du noyau. Dans le micro-noyau L3 , la minimisation de cette surcharge a permis de réduire le coût global à environ 150 cycles.

Maurice Wilkes a écrit :

...il est finalement devenu évident que la protection hiérarchique offerte par les anneaux ne correspondait pas aux exigences du programmeur système et n'apportait que peu ou pas d'amélioration par rapport à un système simple à deux modes. Les anneaux de protection se prêtaient à une implémentation matérielle efficace, mais leurs autres avantages étaient limités. [...] L'attrait d'une protection fine persistait, même après avoir constaté que les anneaux de protection n'apportaient pas la solution... Cela s'est une fois de plus révélé être une impasse...

Pour optimiser les performances et la stabilité, certains systèmes exécutent en mode noyau des fonctions généralement considérées comme de la logique applicative plutôt que comme des pilotes de périphériques ; les applications de sécurité ( contrôle d’accès , pare-feu , etc.) et les moniteurs du système d’exploitation en sont des exemples. Au moins un système de gestion de bases de données embarqué, eXtremeDB Kernel Mode , a été développé spécifiquement pour un déploiement en mode noyau, afin de fournir une base de données locale aux fonctions applicatives du noyau et d’éliminer les changements de contexte qui se produiraient autrement lorsque les fonctions du noyau interagissent avec un système de base de données exécuté en mode utilisateur.

Il arrive aussi que des fonctions soient déplacées entre anneaux dans l'autre sens. Le noyau Linux, par exemple, injecte dans les processus une section vDSO contenant des fonctions qui nécessiteraient normalement un appel système, c'est-à-dire une transition d'anneau. Au lieu d'effectuer un appel système, ces fonctions utilisent des données statiques fournies par le noyau. Cela évite une transition d'anneau et est donc plus léger qu'un appel système. La fonction `gettimeofday` peut être fournie de cette manière.

Mode hyperviseur

Les processeurs récents d'Intel et d'AMD proposent des instructions de virtualisation x86 permettant à un hyperviseur de contrôler l'accès matériel de niveau 0. Bien qu'incompatibles entre eux, Intel VT-x (nom de code « Vanderpool ») et AMD-V (nom de code « Pacifica ») permettent tous deux à un système d'exploitation invité d'exécuter nativement des opérations de niveau 0 sans impacter les autres systèmes d'exploitation invités ni le système d'exploitation hôte.

Avant la virtualisation assistée par matériel , les systèmes d'exploitation invités fonctionnaient sous le niveau 1. Toute tentative nécessitant un niveau de privilège plus élevé (niveau 0) produisait une interruption et était ensuite traitée par logiciel ; c'est ce qu'on appelle « piéger et émuler ».

Pour faciliter la virtualisation et réduire la surcharge liée à la raison évoquée précédemment, VT-x et AMD-V permettent au système d'exploitation invité de s'exécuter en mode Ring 0. VT-x introduit le fonctionnement VMX Root/Non-Root : l'hyperviseur s'exécute en mode VMX Root, bénéficiant ainsi des privilèges les plus élevés. Le système d'exploitation invité s'exécute en mode VMX Non-Root, ce qui lui permet d'opérer en Ring 0 sans disposer de privilèges matériels. Le fonctionnement VMX Non-Root et les transitions VMX sont contrôlés par une structure de données appelée contrôle de machine virtuelle. Ces extensions matérielles permettent à la virtualisation classique « Trap and Emulate » de fonctionner sur l'architecture x86, mais avec un support matériel.

Niveau de privilège

−1 », le mode de gestion du système est appelé « anneau −2 », le moteur de gestion Intel et le processeur de sécurité de la plateforme AMD sont parfois appelés « anneau −3 ».

Utilisation des fonctionnalités matérielles

De nombreuses architectures matérielles de processeurs offrent une flexibilité bien supérieure à celle exploitée par les systèmes d'exploitation qu'elles exécutent habituellement. L'utilisation optimale des modes de fonctionnement complexes du processeur exige une collaboration étroite entre le système d'exploitation et le processeur, ce qui tend à lier le système d'exploitation à l'architecture du processeur. Lorsque le système d'exploitation et le processeur sont spécifiquement conçus l'un pour l'autre, cela ne pose pas de problème (bien que certaines fonctionnalités matérielles puissent rester inexploitées). En revanche, lorsque le système d'exploitation est conçu pour être compatible avec plusieurs architectures de processeurs différentes, une grande partie des fonctionnalités des modes de fonctionnement du processeur peut être ignorée. Par exemple, si Windows n'utilise que deux niveaux (anneau 0 et anneau 3), c'est parce que certaines architectures matérielles prises en charge par le passé (telles que PowerPC ou MIPS ) n'implémentaient que deux niveaux de privilège.

Multics était un système d'exploitation conçu spécifiquement pour une architecture de processeur particulière (elle-même conçue spécifiquement pour Multics), et il exploitait pleinement les modes de fonctionnement du processeur. Cependant, il constituait une exception. De nos jours, ce haut degré d'interopérabilité entre le système d'exploitation et le matériel est rarement rentable, malgré les avantages potentiels en matière de sécurité et de stabilité.

En définitive, l'objectif des différents modes de fonctionnement du processeur est d'assurer une protection matérielle contre toute corruption accidentelle ou intentionnelle de l'environnement système (et les failles de sécurité qui en découlent) par le logiciel. Seules les parties « de confiance » du logiciel système sont autorisées à s'exécuter dans l'environnement non restreint du mode noyau, et ce, généralement uniquement en cas d'absolue nécessité. Tous les autres logiciels s'exécutent dans un ou plusieurs modes utilisateur. Si un processeur génère une erreur ou une exception en mode utilisateur, la stabilité du système reste généralement inchangée ; en revanche, si une telle erreur ou exception survient en mode noyau, la plupart des systèmes d'exploitation arrêtent le système et génèrent une erreur irrécupérable. Lorsqu'une hiérarchie de modes existe (sécurité par anneaux), les erreurs et exceptions à un niveau de privilège donné ne déstabilisent que les niveaux de privilège supérieurs. Ainsi, une erreur dans l'anneau 0 (le mode noyau avec le privilège le plus élevé) provoque le plantage de l'ensemble du système, tandis qu'une erreur dans l'anneau 2 n'affecte que les anneaux 3 et suivants, et l'anneau 2 lui-même au maximum.

Les transitions entre les modes sont à la discrétion du thread d'exécution lorsque la transition se fait d'un niveau de privilège élevé à un niveau de privilège faible (comme du mode noyau au mode utilisateur), mais les transitions de niveaux de privilège inférieurs à supérieurs ne peuvent avoir lieu que par le biais de « portes » sécurisées et contrôlées par le matériel, qui sont franchies en exécutant des instructions spéciales ou lorsque des interruptions externes sont reçues.

Les systèmes d'exploitation à micro-noyau tentent de minimiser la quantité de code s'exécutant en mode privilégié, pour des raisons de sécurité et d'élégance .

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index