Les hyperviseurs résolvent-ils tous les problèmes de partitionnement logiciel… ou pas ?

Green Hills noyau de séparation

[APPLICATION GREEN HILLS SOFTWARE] Il est bien connu que le partitionnement des logiciels, c'est-à-dire l'exécution d'applications dans des environnements distincts, permet de répondre aux exigences en matière de sûreté et de sécurité. Très souvent, les hyperviseurs sont considérés comme la meilleure et/ou la seule solution pour cela, mais c'est loin d'être le cas. Les hyperviseurs eux-mêmes peuvent introduire des risques et des vulnérabilités supplémentaires. Cet article signé par la société Green Hills Software propose donc une approche différente : le noyau de séparation.

Auteur : Marcus Nissemark, ingénieur d'applications de terrain et dirigeant de l'équipe FAE EMEA de Green Hills Software.

Les hyperviseurs embarqués permettent à plusieurs systèmes d'exploitation de fonctionner sur la même plate-forme matérielle, maximisant ainsi les performances du matériel tout en garantissant l'indépendance. Ces solutions de virtualisation embarquées s'accompagnent parfois d'exigences en matière de sûreté et de sécurité, pour lesquelles la séparation des responsabilités est cruciale.

Cependant, le fait de s'appuyer sur des hyperviseurs soulève des problèmes de confiance et impose des contraintes supplémentaires lorsque des normes de sûreté et de sécurité, telles que les normes ISO 26262 ou ISO 21434, sont en jeu.

Une alternative aux hyperviseurs

Une alternative aux hyperviseurs est la mise en œuvre d'un noyau de séparation au sein d’un système d'exploitation temps réel. Cette approche permet de séparer les responsabilités au sein d'un système d'exploitation unique, en garantissant une séparation au niveau de l'application plutôt qu'au niveau du système d'exploitation. Examinons ces technologies un peu plus en profondeur.

Un hyperviseur embarqué est un logiciel qui permet à plusieurs systèmes d'exploitation de fonctionner en partageant les ressources limitées d’un seul processeur. L'hyperviseur sert en quelque sorte de système d'exploitation pour des systèmes d'exploitation, leur permettant de partager le processeur, la mémoire et les ressources périphériques selon un schéma prédéfini. Il s'agit donc d'un superviseur pour les superviseurs, d'où le nom d'hyperviseur.

Les hyperviseurs peuvent être dynamiques, avec un nombre de processeurs (CPU) et une utilisation de la mémoire flexibles, ou statiques, avec un nombre de CPU et une allocation de mémoire fixes. Les pilotes de périphériques peuvent être dédiés ou partagés entre différents systèmes d'exploitation.

Architecture d'un hyperviseur typique pour la séparation logicielle

L'introduction d'hyperviseurs dans l'architecture logicielle pour la séparation n'est pas sans poser de problèmes, car elle ajoute de la complexité. L'hyperviseur doit assurer la séparation et la protection de la mémoire ainsi que l'ordonnancement des différentes charges de travail. Il doit également gérer les niveaux de privilèges des systèmes d'exploitation invités virtualisés en même temps que lui-même, tout en équilibrant l'accès aux ressources matérielles. L'hyperviseur devient donc le logiciel le plus privilégié du système.

Cet ensemble complexe de logiciels ajoute du code aux parties les plus critiques d'un système, fonctionnant au niveau de privilège le plus élevé du matériel. L'implémentation de l'hyperviseur doit donc être sûre et sécurisée, sinon l'ajout d'hyperviseurs pour améliorer la sécurité et la sûreté ne sera pas valable.

Ainsi, l'utilisation d'hyperviseurs avec une base de code importante dans la partie la plus sensible du système crée de nombreux risques d'ajout de vulnérabilités. Par exemple, l'examen de l’hyperviseur open source Xen et de ses vulnérabilités répertoriées dans la National Vulnerability Database montre plusieurs centaines d’entrées répertoriées. Ce n'est pas un hyperviseur fiable sur lequel compter lorsque l’on veut accroître la sécurité du système par le biais de la virtualisation.

Le noyau de séparation logicielle, introduit par John Rushby dans un article de 1981, vise à créer un environnement qui ressemble à un système physiquement distribué. Il garantit que chaque domaine d'application apparaît comme une machine séparée et isolée, permettant le flux d'informations uniquement le long de lignes de communication externes connues. Le noyau offre un haut niveau de sécurité en créant des domaines ou partitions isolés sur un système physique unique. Il sépare strictement ces partitions, empêchant les logiciels d'une partition d'affecter les logiciels d'une autre partition. L'ensemble du système est ainsi protégé contre les logiciels malveillants et les accès non autorisés.

Caractéristiques d’un noyau de séparation

Reposant sur une architecture à micronoyau, le noyau de séparation offre des services minimaux et s'appuie sur des services distincts pour des fonctionnalités supplémentaires. Cette conception réduit la surface d'attaque du noyau et améliore sa résistance aux corruptions. Un noyau de séparation adéquat fournit une isolation équivalente à l'isolation matérielle, ce qui le rend moins sensible aux vulnérabilités.

Certains noyaux de séparation, tels que le micronoyau L4, ont fait l'objet d'une vérification formelle afin de garantir leur bon fonctionnement. Il existe également des noyaux de séparation disponibles dans le commerce, comme le système d'exploitation en temps réel Integrity de Green Hills Software.

Dans un environnement de système d'exploitation en temps réel à noyau de séparation, la séparation au niveau de l'application est représentée comme le montre la figure ci-dessus

Lorsque plusieurs systèmes d'exploitation accèdent aux mêmes ressources, maintenir la séparation peut affecter les performances sur certaines implémentations. Par exemple, les hyperviseurs de type 1 ont besoin de deux changements de contexte pour exécuter une tâche critique lors de la réception d'une interruption. La première interruption est transmise à l'hyperviseur, puis traitée et transmise au système d'exploitation invité pour la planification des tâches. Une solution reposant sur un noyau de séparation ne nécessiterait qu'une seule interruption pour permettre la planification d'une tâche critique.

Bien que cela soit spécifique à l'implémentation, la virtualisation n'est pas toujours gratuite en matière de performance, en particulier pour les tâches critiques ou pour l'accès aux ressources partagées. Par conséquent, les performances du noyau de séparation et de l'hyperviseur doivent être des considérations de conception importantes et nécessitent une architecture adaptée aux cas d'utilisation spécifiques dans les systèmes embarqués.

Pourquoi la séparation est-elle nécessaire ?

La séparation des responsabilités est nécessaire pour plusieurs raisons. Dans cette analyse, trois cas d'utilisation sont répertoriés :

- Sécurité : isolation de fonctions spécifiques au sein de plusieurs instances du même système d'exploitation afin d'établir un accès sécurisé à des ressources spécifiques.

- Réutilisation du code ou de systèmes existants : l'utilisation de plusieurs systèmes d'exploitation différents permet de réutiliser des fonctionnalités sans qu'il soit nécessaire de réarchitecturer ou de réimplémenter.

- Criticité mixte : utilisation de plusieurs systèmes d'exploitation pour répondre à des normes de sûreté ou de sécurité qui exigent la séparation des applications.

Pour répondre à ces exigences, une solution d'hyperviseur est souvent envisagée. Cependant, un noyau de séparation peut également répondre à ces besoins sans recourir à la virtualisation. Voici une analyse plus approfondie des trois cas d'utilisation différents explicités plus haut avec un noyau de séparation.

- Garantir l'accès à des ressources spécifiques : Si les méthodes de contrôle d'accès du système d'exploitation sous-jacent sont suffisamment sûres, il est possible de protéger l'accès aux ressources au niveau de l'application. L'usage de systèmes d'exploitation à noyau de séparation comme alternative à la virtualisation permet d’éviter des pièges potentiels. Ces implémentations utilisent généralement des politiques de contrôle d'accès obligatoires pour y parvenir et peuvent utiliser les mécanismes du système d'exploitation tels que les accès périphériques dédiés pour partager ces ressources en toute sécurité.

- Réutilisation sans réarchitecture ni ré-implémentation : Certains logiciels ne peuvent être rendus sûrs ou sécurisés en raison de facteurs échappant au contrôle du projet, tels que des bibliothèques tierces ou des contraintes matérielles. Dans ce cas, le logiciel doit être partitionné pour éviter toute interférence avec les exigences de sûreté et de sécurité du reste du système. La virtualisation est une solution courante, mais elle ajoute une complexité inutile.

Il peut être plus efficace de modifier le code de manière sélective et de collaborer avec des fournisseurs tiers, en particulier lorsque les noyaux de séparation offrent des couches de portabilité spécifiques. Ce cas d'utilisation est plus difficile à réaliser avec les noyaux de séparation, mais des changements doivent être apportés dans le but de créer un système sûr et sécurisé.

- Normes de sûreté ou de sécurité : Les normes de sûreté de fonctionnement exigent souvent une séparation pour éviter les interférences. Plutôt que d'introduire une couche de virtualisation complète, une autre couche de séparation répondant aux objectifs de la norme peut suffire. L'utilisation d'une base de confiance plus petite pour la sûreté et la sécurité s'aligne sur les exigences de sécurité fonctionnelle. Par exemple, le noyau de séparation Integrity RTOS de Green Hills Software est utilisé dans divers domaines tels que l'automobile, l'industrie et l'avionique, offrant plusieurs couches de sûreté et de sécurité.

La virtualisation n'est pas obligatoire

Les trois cas d'utilisation de la séparation peuvent donc être conçus sans virtualisation, en repensant l'architecture logicielle. La solution du noyau de séparation est capable d'héberger des applications avec des exigences de criticité mixtes sans avoir besoin d'un hyperviseur. Les couches de compatibilité des applications, telles que Posix, les sockets TCP/IP et les interactions standard avec le système de gestion de fichiers, sont réalisées par le biais d'interfaces ouvertes.

Le noyau de séparation suit une architecture de micronoyau et l'améliore en isolant des fonctions, en implémentant un contrôle d'accès obligatoire aux périphériques et en fournissant une base pour une architecture logicielle alternative. Cette approche se traduit par une conception moins complexe avec une base de code plus petite, ce qui permet de plus facilement garantir la sûreté, la sécurité et l'absence de bogues ou de vulnérabilités. En outre, les noyaux de séparation permettent la coexistence d'applications à criticité mixte.

Les principes d'un noyau de séparation imposent une phase de conception architecturale statique, qui s'aligne sur les meilleures pratiques en matière de systèmes de sûreté et de sécurité.

Pour obtenir des systèmes sécurisés, les ingénieurs logiciels doivent adopter un état d'esprit qui se concentre sur l'architecture des fonctionnalités en gardant à l'esprit la séparation. Des interfaces claires et protégées entre les applications et les services sont cruciales, et il est important de reconnaître qu'un service, tel qu'une bibliothèque ou un pilote de périphérique, peut être une application distincte dans le contexte des noyaux de séparation.

Il faut donc envisager d'autres voies architecturales logicielles pour parvenir à une séparation adéquate en matière de sûreté et de sécurité.

Résumé

En conclusion, les hyperviseurs embarqués et les noyaux de séparation peuvent tous deux répondre aux exigences de séparation en matière de sûreté et de sécurité. Toutefois, l'approche par défaut consistant à s'appuyer uniquement sur les hyperviseurs devrait être remise en question. Envisager des noyaux de séparation avec une base de traitement de confiance plus petite est un choix judicieux du point de vue de la sécurité, car les fonctionnalités fournies par les deux méthodes sont égales.

Donner la priorité à une sécurité accrue dans la conception plutôt qu'à la réutilisation des logiciels suggère de remplacer les systèmes d'exploitation hérités ou de facto par des noyaux de séparation plus sûrs qui s'appuient sur des couches de compatibilité, ce qui conduit à de meilleures conceptions en matière de sûreté et de sécurité.