Sécurité des noyaux de systèmes d’exploitation

Tout le monde reconnaît maintenant que l’utilisation des ordinateurs (en particulier au travers du réseau Internet) est devenue essentielle dans la vie quotidienne. Chacun d’entre nous utilise un ordinateur pour travailler, pour échanger des informations, pour faire des achats, etc. Malheureusement, les activités malveillantes visant les ordinateurs se multiplient régulièrement et essaient d’exploiter des vulnérabilités qui sont de plus en plus nombreuses en raison de la complexité toujours croissante des logiciels d’aujourd’hui. Pour réduire les coûts de développement, les systèmes informatiques utilisent de plus en plus de composants sur étagère (ou COTS pour Components Off-The-Shelf), même pour des applications plus ou moins critiques. Ces composants peuvent être des matériels (microprocesseurs, chipsets), des logiciels de base (systèmes d’exploitation, outils de développement ou de configuration), des applications génériques (base de données, serveurs Web) ou dédiées à des fonctions plus spécifiques (pare-feux, commande et contrôle). Ces composants étant conçus pour être génériques, ils sont souvent beaucoup plus complexes que ce qui est vraiment utile pour un système particulier. Cette complexité les fragilise vis-à-vis de la sécurité. En effet, il est pratiquement impossible de les vérifier parfaitement, c’est à-dire de garantir d’une part l’absence de bogues, et d’autre part l’absence de fonctions cachées. Par conséquent, des pirates peuvent profiter de cette situation pour réussir à pénétrer dans ces systèmes, et d’en utiliser les ressources associées. Ces pirates peuvent s’attaquer aux applications installées sur le système mais aussi au système d’exploitation lui-même et en particulier, à son noyau. Corrompre le noyau d’un système d’exploitation est particulièrement intéressant du point de vue d’un attaquant parce que cela signifie corrompre potentiellement tous les logiciels qui s’exécutent au-dessus de ce noyau. Cela peut même aller jusqu’à la prise de contrôle complète du système par l’attaquant. Le noyau d’un système d’exploitation doit donc être fortement protégé. Mais, protéger un noyau de façon efficace par des mécanismes de sécurité est particulièrement délicat car il est extrêmement difficile de rendre ces mécanismes incontournables.

Les actions malveillantes qui affectent l’intégrité du noyau du système d’exploitation

La motivation associée à la caractérisation d’une attaque sur un système informatique est de fournir un modèle sur lequel on peut s’appuyer pour concevoir et mettre en place des mécanismes visant à protéger un système vis-à-vis de malveillances. L’objectif poursuivi dans cette caractérisation est d’identifier ce sur quoi repose une attaque afin de mettre en évidence les différents points d’actions “stratégiques” où le système doit intervenir pour assurer sa protection.

Les différents modèles d’attaques que nous trouvons dans la littérature comme les arbres d’attaques [Schneier, 1999], les graphes d’attaques [Sheyner, 2004], ou encore les graphes de privilèges [Dacier et Deswarte, 1994] ne mettent pas suffisamment l’accent sur les aspects que nous venons de mentionner. À cela se rajoute le fait que la sécurité d’un système n’est pas définie de façon uniforme sur tous les modèles. Mis à part les modèles traitant de types particuliers d’attaques, les modèles plus génériques se fondent sur des hypothèses que nous trouvons trop restrictives (au niveau de la définition des propriétés de sécurité), ou au contraire trop floues.

La sécurité des systèmes

Concepts de base et terminologie des systèmes

Avant de définir la notion de sécurité de systèmes, il convient de définir au préalable ce que nous entendons par le terme système. Nous prenons comme référence les définitions de [Laprie, 2004]. Un système est une entité qui interagit avec d’autres entités, donc d’autres systèmes, y compris le matériel, le logiciel, les humains, et le monde physique avec ses phénomènes naturels. Ces autres systèmes qui interagissent avec le système considéré constituent l’environnement du système considéré. La frontière du système est la limite commune entre le système et son environnement. La fonction d’un système est ce à quoi il est destiné. Elle est décrite par la spécification fonctionnelle, qui inclut les performances attendues du système. Le comportement d’un système est ce que le système fait pour accomplir sa fonction, et est décrit par une séquence d’états. L’état total d’un système est l’ensemble des états de traitement, de communication, de mémorisation, d’interconnexion, ainsi que des conditions physiques. La structure d’un système est ce qui lui permet de générer son comportement. D’un point de vue structurel, un système est constitué d’un ensemble de composants interconnectés en vue d’interagir. Un composant est un autre système, etc. Le service délivré par un système est son comportement tel que perçu par ses utilisateurs; un utilisateur est un autre système, éventuellement humain, qui interagit avec le système considéré. La partie de la frontière du système où ont lieu les interactions avec ses utilisateurs est l’interface de service. La partie de l’état total qui est perceptible à l’interface de service est son état externe ; le reste est son état interne. Enfin, fonction et service peuvent être vus comme constitués de fonctions élémentaires et de services élémentaires.

De ces concepts nous déduisons qu’un système est alors entièrement défini par sa structure et son état total.

La sûreté de fonctionnement

Définitions de base

La sécurité des systèmes s’inscrit dans le cadre plus large de la sûreté de fonctionnement. [Laprie, 2004] nous en donne la définition suivante. La sûreté de fonctionnement d’un système est son aptitude à délivrer un service de confiance justifiée. Cette définition met l’accent sur la justification de la confiance, cette dernière pouvant être définie comme une dépendance acceptée, explicitement ou implicitement. La dépendance d’un système d’un autre système est l’influence, réelle ou potentielle, de la sûreté de fonctionnement de ce dernier sur la sûreté de fonctionnement du système considéré. Selon les applications auxquelles le système est destiné, l’accent peut être mis sur différentes facettes de la sûreté de fonctionnement, ce qui signifie que la sûreté de fonctionnement peut être vue selon des propriétés différentes mais complémentaires, qui permet de définir ses attributs: la fiabilité, la sécurité-innocuité, la maintenabilité, la disponibilité, la confidentialité et l’intégrité. L’association, à la confidentialité, de l’intégrité et de la disponibilité vis-à-vis des actions autorisées, conduit à la sécurité-immunité (ou security en anglais), pour la distinguer de la sécurité-innocuité.

Entraves de la sûreté de fonctionnement

Un service correct est délivré par un système lorsqu’il accomplit sa fonction. Une défaillance du service, souvent simplement dénommé défaillance, est un évènement qui survient lorsque le service délivré dévie du service correct. Le service délivré étant une séquence d’états externes, une défaillance du service signifie qu’au moins un état externe dévie du service correct. La déviation est une erreur. La cause adjugée ou supposée d’une erreur est une faute. Les fautes peuvent être internes ou externes au système. La présence antérieure d’une vulnérabilité, c’est-à-dire d’une faute interne qui permet à une faute externe de causer des dommages au système, est nécessaire pour qu’une faute externe entraîne une erreur, et, éventuellement, une défaillance.

Moyens de la sûreté de fonctionnement

Les moyens de la sûreté de fonctionnement sont les méthodes et techniques permettant defournir au système l’aptitude à délivrer un service conforme à l’accomplissement de sa fonction, et de donner confiance dans cette aptitude. Cet ensemble de méthodes et techniques peuvent être classées en :
– prévention des fautes : comment empêcher l’occurrence ou l’introduction de fautes ;
– tolérance aux fautes : comment fournir un service à même de remplir la fonction du système en dépit des fautes ;
– élimination des fautes : comment réduire la présence (nombre, sévérité) des fautes ;
– prévision des fautes : comment estimer la présence, le taux futur, et les possibles conséquences des fautes.

La sécurité

Dans la suite de ce mémoire, nous nous intéresserons uniquement à la sécurité-immunité que, dés à présent, nous référencerons par le seul mot sécurité. Assurer la sécurité d’un système, c’est assurer que les propriétés, confidentialité, intégrité et disponibilité sont toujours vérifiées. Notons dès à présent que les trois propriétés de la sécurité se rapportent à l’information, et le terme d’information doit être pris ici dans son sens le plus large, couvrant non seulement les données et les programmes, mais aussi les flux d’information, les traitements et la connaissance de l’existence de données, de programmes, de traitements, de communications. Cette notion d’information doit aller jusqu’à couvrir le système informatique lui-même, dont parfois l’existence doit être tenue secrète (confidentialité).

La confidentialité

La confidentialité est la propriété d’une information de ne pas être révélée à des utilisateurs non autorisés à la connaître. Ceci signifie que le système informatique doit :
– empêcher que des utilisateurs puissent connaître une information confidentielle s’ils n’y sont pas autorisés ;
– empêcher que des utilisateurs autorisés à connaître une information confidentielle puissent la divulguer à des utilisateurs non autorisés.

Assurer la confidentialité d’un système est un travail bien plus colossal qu’il n’y parait à première vue. Il faut analyser tous les chemins que peut prendre une information dans le système pour s’assurer qu’ils sont sécurisés. C’est un travail fastidieux et souvent trop coûteux par rapport aux besoins réels ; aussi dans bon nombre de cas, on s’occupera de sécuriser un certain nombre des chemins que peut prendre l’information. Les attaques contre la confidentialité consistent à essayer d’obtenir des informations malgré les moyens de protection et les règles de sécurité. Ces attaques peuvent être passives ou actives. Les attaques passives consistent à accéder aux informations qui sont générées, transmises, stockées ou affichées dans des composants vulnérables du système informatique (voies de communication, mémoires, disques, etc.). Par exemple, lorsqu’un utilisateur U se connecte sur une machine B depuis une autre machine A, une écoute passive permet de capter l’identité et le mot de passe de l’utilisateur U tapés depuis la machine A et transmis jusque la machine B. Cette capture permettra à un intrus de se connecter sur la machine B en prenant l’identité de l’utilisateur U. Un attaque active nécessite quant à elle, une action d’un ou plusieurs individus dans le système. L’utilisation des canaux cachés [Lampson, 1973] peut permettre ainsi à un individu autorisé à accéder à des informations de les transmettre à un utilisateur non autorisé à y accéder. Il peut pour cela utiliser par exemple des canaux de mémoire (réutilisation de zones mémoires non réinitialisées) ou des canaux temporels (modulation de l’utilisation des ressources communes comme l’unité centrale ou les disques).

Le rapport de stage ou le pfe est un document d’analyse, de synthèse et d’évaluation de votre apprentissage, c’est pour cela chatpfe.com propose le téléchargement des modèles complet de projet de fin d’étude, rapport de stage, mémoire, pfe, thèse, pour connaître la méthodologie à avoir et savoir comment construire les parties d’un projet de fin d’étude.

Table des matières

Introduction
1 Contexte et problématique
2 Présentation de nos travaux
Chapitre 1 Les actions malveillantes qui affectent l’intégrité du noyau du système d’exploitation
1.1 La sécurité des systèmes
1.1.1 Concepts de base et terminologie des systèmes
1.1.2 La sûreté de fonctionnement
1.1.3 La sécurité
1.1.4 Politiques de sécurité
1.1.5 Évaluation de la sécurité
1.2 Caractérisation d’une attaque logicielle sur un système informatique
1.2.1 Le problème de l’attaquant
1.2.2 La résolution du problème de l’attaquant
1.2.3 Modèle générique d’attaque logique sur un système informatique
1.2.4 Exemples d’attaques issus du modèle
1.3 Introduction aux systèmes d’exploitation
1.4 Introduction à l’architecture x86
1.4.1 Modes d’opération du processeur
1.4.2 Niveaux de privilèges du processeur
1.4.3 Environnement basique d’exécution
1.4.4 Les interruptions matérielles
1.4.5 Accès à la mémoire principale
1.4.6 Accès aux périphériques
1.4.7 Transfert direct de données entre périphériques et mémoire principale
1.5 Les attaques sur les noyaux de systèmes d’exploitation
1.5.1 Vecteurs d’accès à la mémoire du noyau
1.5.2 Vecteurs d’accès à la mémoire du support de contrôle
1.5.3 Vecteurs d’accès aux périphériques
1.5.4 Classes d’actions malveillantes visant le noyau
1.6 Conclusion
Chapitre 2 Étude d’un type de parasite informatique : les rootkits “noyau”
2.1 État de l’art sur les rootkits “noyau” sous Linux
2.1.1 Évolution des rootkits
2.1.2 Méthodes d’injection en espace “noyau”
2.1.3 Détournement des fonctions du noyau
2.2 Caractérisation des rootkits
2.2.1 Analyse de la définition d’un rootkit
2.2.2 L’architecture d’un rootkit
2.2.3 La communication avec le rootkit
2.2.4 Vers l’évaluation d’un rootkit
2.3 Exemple de construction d’un rootkit “invisible”
2.3.1 Principe original de notre rootkit : sa porte dérobée
2.3.2 Architecture de notre rootkit
2.3.3 Installation préliminaire : la partie “noyau” de la porte dérobée
2.3.4 Camouflage de la partie en espace “noyau” de la porte dérobée
2.3.5 Les actionneurs de la porte dérobée pour un processus
2.3.6 Partie en espace “utilisateur” de la porte dérobée
2.3.7 Dissimulation de l’activité système
2.4 Synthèse de l’expérimentation
2.4.1 Les actions malveillantes effectuées par notre rootkit
2.4.2 Quelques considérations sur l’efficacité de notre rootkit
2.4.3 Contributions
2.4.4 Limites de notre rootkit
2.5 Conclusion
Chapitre 3 État de l’art sur la protection du noyau vis-à-vis des actions malveillantes
3.1 À propos de l’élimination de vulnérabilités
3.1.1 Vérification statique
3.1.2 Vérification dynamique
3.2 Protection contre les actions de la classe 1
3.2.1 Contrôle des vecteurs d’accès à la mémoire du noyau
3.2.2 Mécanismes de prévention
3.2.3 Mécanismes de détection et de restauration
3.3 Protection contre les actions de la classe 2 et de la classe 3
3.3.1 Contrôle des vecteurs d’accès à la mémoire du support de contrôle et aux périphériques
3.3.2 Mécanismes de prévention
3.3.3 Mécanismes de détection et de restauration
3.4 Conclusion
Chapitre 4 Hytux : assurer l’intégrité d’un noyau au travers de la préservation de contraintes
4.1 Concepts préliminaires
4.1.1 Introduction à la virtualisation
4.1.2 L’espace d’adressage linéaire des processus sous Linux
4.2 Le chargement de Hytux
4.3 Protection des objets contraints par le noyau
4.3.1 Identification des différentes fonctions d’un noyau
4.3.2 La préservation de l’intégrité du noyau : préservation de contraintes liées à ses fonctions
4.3.3 La préservation de l’intégrité de la structure du noyau : un espace d’adressage contraint
4.3.4 Gestion générique de données simples contraintes par le noyau
4.3.5 Prévention de la corruption des KCO depuis les périphériques ou le mode SMM de la CPU
4.4 Préservation de l’intégrité de Hytux
4.4.1 Au travers du contrôle des vecteurs d’accès de type CPU
4.4.2 Au travers du contrôle des vecteurs d’accès de type DMA
4.5 Synthèse sur notre approche de préservation de contraintes
4.6 Conclusion
Conclusion

Lire le rapport complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *