Détection dynamique d’attaques logicielles et matérielles basée sur l’analyse de signaux microarchitecturaux
Terminologie de la sécurité informatique
Le terme de sécurité en français est ambigu. Il peut désigner aussi bien la sécurité-innocuité (en anglais safety) que la sécurité-immunité (en anglais security), qui sont deux concepts relevant de la sûreté de fonctionnement. Nos travaux s’inscrivant dans le cadre de la sécurité-immunité. Cette section a pour objectif de définir le vocabulaire dont nous aurons besoin par la suite. Dans un premier temps, nous décrivons les concepts généraux de la sûreté de fonctionnement, introduits dans [Laprie 1996] et mis à jour dans [Avizienis 2004], puis nous nous concentrons sur l’application de ces concepts au domaine de la sécurité-immunité.
Sûreté de fonctionnement
La sûreté de fonctionnement d’un système informatique est définie comme “la propriété qui permet aux utilisateurs du système de placer une confiance justifiée dans le service qu’il leur délivre”. Le service délivré par un système est son comportement tel qu’il est perçu par ses utilisateurs. Un utilisateur étant un autre système (humain ou physique) qui interagit avec le système considéré. La non-sûreté de fonctionnement survient lorsque la confiance ne peut plus, ou ne pourra plus, être placée dans le service délivré. La sûreté de fonctionnement comporte trois axes principaux : les attributs qui la décrivent, les entraves qui empêchent sa réalisation et les moyens d’atteindre celle-ci (voir la figure 1.2).
Terminologie de la sécurité informatique
Disponibilité Fiabilité Sécurité-innocuité Confidentialité Intégrité Maintenabilité Attributs Sécurité-immunité Fautes Erreurs Défaillances Entraves Prévention de fautes Tolérance aux fautes Elimination de fautes Prévision des fautes Moyens Sûreté de fonctionnement Figure 1.2 – Vocabulaire de la sûreté de fonctionnement. La sûreté de fonctionnement peut être perçue selon les propriétés suivantes, appelées attributs de la sûreté de fonctionnement : — Disponibilité : capacité du système à être prêt à l’utilisation ; — Fiabilité : continuité du service ; — Sécurité-innocuité : absence de conséquences catastrophiques pour l’environnement ; — Confidentialité : absence de divulgations non autorisées de l’information ; — Intégrité : absence d’altérations inappropriées de l’information ; — Maintenabilité : aptitude aux réparations et aux évolutions. Ainsi ces attributs permettent d’une part d’exprimer les propriétés devant être respectées par le système et d’autre part d’évaluer la qualité du service délivré vis-à-vis de ces propriétés. Les attributs à considérer dépendent des applications auxquelles le système est destiné. Ces attributs peuvent être mis à mal par des entraves. Une entrave est une circonstance indésirable mais non-inattendue. Elle est la cause ou le résultat de la non-sûreté de fonctionnement. On distingue trois types d’entraves : — Défaillance : survient lorsque le service délivré dévie de l’accomplissement de la fonction du système ; — Erreur : la partie de l’état du système susceptible d’entraîner une défaillance ; — Faute : la cause adjugée ou supposée d’une erreur. Une faute est dite active lorsqu’elle produit une erreur. Par propagation, une erreur crée de nouvelles erreurs. Une défaillance survient lorsque, par propagation, une erreur affecte le service délivré par le système. Cette défaillance peut alors apparaître comme une faute du point de vue d’un autre composant. L’enchaînement crée ainsi la chaîne fondamentale suivante : . . . → défaillance → faute → erreur → défaillance → . . . Enfin, les moyens de la sûreté de fonctionnement permettent de minimiser l’impact des entraves sur les attributs. Ce sont les méthodes et techniques permettant de conforter les utilisateurs quant au bon accomplissement de la fonction du système. On distingue quatre catégories en fonction de l’objectif visé : — Prévention des fautes : empêcher l’occurrence ou l’introduction de fautes ; — Tolérance aux fautes : fournir un service qui remplit la fonction du système en dépit des fautes ; — Elimination des fautes : réduire le nombre et la sévérité des fautes ; — Prévision des fautes : estimer la présence, la création et la conséquence des fautes. Dans la suite de ce mémoire, nous nous intéressons uniquement à la sécuritéimmunité, qui se définit comme une combinaison de la disponibilité, la confidentialité et l’intégrité. 1.2.2 Sécurité-immunité La sécurité-immunité définit les propriétés selon lesquelles un système est dit “sécurisé” (protégé contre les fautes intentionnelles, aussi appelées malveillances). Contrairement à la sécurité-innocuité, qui définit les propriétés selon lesquelles un système est dit “sûr” (sans défaillance catastrophique pouvant conduire à des pertes de vies humaines ou des conséquences économiques importantes). Les concepts de sûreté de fonctionnement présentés précédemment sont génériques afin de pouvoir couvrir un grand nombre de concepts. Nous allons maintenant nous intéresser à leur application dans le contexte plus spécifique de la sécurité-immunité. Dans le reste de ce manuscrit, le terme sécurité ou de sécurité informatique sont à considérer au sens de sécurité-immunité, sauf si explicitement précisé. Attributs Considérés du point de vue de la sécurité-immunité, les attributs de la sûreté de fonctionnement que l’on cherche à garantir peuvent être définis ainsi : — Confidentialité : prévention de toute divulgation non autorisée d’information ; — Intégrité : prévention de toute modification non autorisée d’information ; — Disponibilité : prévention de toute rétention non autorisée d’information. Malveillances Les définitions qui suivent proviennent de la terminologie des malveillances introduite lors du projet Malicious- and Accidental- Fault Tolerance for Internet Applications [MAFTIA 2003]. Il existe deux classes de fautes malveillantes : les logiques malignes et les intrusions. Une logique maligne est une partie du système conçue pour provoquer des dégâts (bombe logique) ou pour faciliter des intrusions futures (vulnérabilités créées volontairement). Elles peuvent être introduites dès la 1.3. Classification des attaques 15 conception du système (par un concepteur malveillant) ou en phase opérationnelle (par l’installation d’un logiciel contenant un cheval de Troie ou par une intrusion). Une intrusion est définie grâce aux concepts d’attaque et de vulnérabilité : — Attaque : une faute d’interaction malveillante visant à violer une ou plusieurs propriétés de sécurité. C’est une faute externe créée avec l’intention de nuire, incluant les attaques lancées par des outils automatiques (vers, virus, etc.) ; — Vulnérabilité : une faute, accidentelle ou intentionnelle, présente lors de la conception du système ou lors de son utilisation ; — Intrusion : une faute malveillante correspondant au résultat d’une attaque qui a réussi à exploiter une vulnérabilité. Les attaques, vulnérabilités et intrusions étant des fautes, les moyens de la sûreté de fonctionnement peuvent être appliqués pour améliorer la sécurité-immunité d’un système.
Classification des attaques
Dans cette section, nous proposons une classification des attaques menaçant la sécurité de l’exécution du logiciel. Pour chaque classe, nous donnons des exemples d’attaque avec une explication rapide de leur fonctionnement.
Critères de classification
Notre classification d’attaques est basée sur deux critères : l’origine de l’attaque et la vulnérabilité exploitée par l’attaque. Origine de l’attaque Nous avons identifié trois origines d’attaque différentes : — Dispositif externe physique : l’attaque provient de composants externes du système, qui interagissent avec le système indirectement via son environnement physique. Cela comprend principalement la modification et l’observation des propriétés physiques du système (par exemple la température, le champ électromagnétique, ou l’apparence visuelle) ; — Composant matériel : l’attaque provient de composants matériels du système. Elle correspond à un composant matériel contenant des défauts volontairement introduits dans sa conception, fabrication ou diffusion, et qui a réussi à être intégré dans le système (pendant l’assemblage du système, ou être branché temporairement) ; — Composant logiciel : l’attaque provient de composants logiciels du système. Cela comprend la manipulation des entrées d’un logiciel légitime (par exemple des entrées d’utilisateur, des fichiers ou des données du réseau), ou un logiciel malveillant installé dans le système. Vulnérabilité visée Nous classifions les vulnérabilités visées par l’attaque à l’aide de notre modèle de couches d’abstraction. Nous obtenons ainsi quatre types de vulnérabilités différentes : — Vulnérabilité physique : l’attaque vise une vulnérabilité liée aux propriétés physiques du système. Les propriétés physiques incluent par exemple l’émission d’énergie pendant l’utilisation du circuit, la variation des propriétés électroniques selon la température et la tension courante, ou les imperfections de fabrication ; — Vulnérabilité microarchitecturale : l’attaque vise une vulnérabilité liée à la microarchitecture du système. Ces choix d’implémentation, principalement faits pour des raisons d’optimisation, incluent par exemple le partage des ressources, la persistance des états internes ; — Vulnérabilité architecturale : l’attaque vise une vulnérabilité logicielle non algorithmique. Ces vulnérabilités incluent la possibilité d’accéder à des zones mémoire en dehors d’une table, de modifier des données de contrôle permettant la gestion de la pile ou l’appel de fonction, etc. Elles viennent principalement de l’utilisation des langages de programmation qui ne sont pas assez restrictifs, et des compilateurs qui n’ont pas ajouté suffisamment de vérifications ; — Vulnérabilité algorithmique : l’attaque vise une vulnérabilité liée à la description haut niveau du comportement et des fonctionnalités du logiciel. Contrairement aux vulnérabilités architecturales, les vulnérabilités algorithmiques ne peuvent pas être résolues par la réécriture du logiciel dans un autre langage de programmation et l’utilisation d’un compilateur plus sécurisé. Le manque de vérification et de protection des données, le manque de prise en compte des différents chemins d’exécution, l’utilisation d’une clé de chiffrement cassable en force brute entrent dans cette catégorie.
Exemples d’attaques
Dans cette section, nous présentons des attaques typiques des différentes catégories (figure 1.3). Notons que dans cette figure, le nombre d’attaques dans chaque catégorie n’est pas proportionnel au nombre de carrés ou la taille du carré. Typiquement, la plupart des attaques existantes concerne l’interaction de type logiciel et exploite une vulnérabilité de la couche algorithmique.
Attaque par dispositif externe physique
Les attaques par dispositif externe physique nécessitent que l’attaquant ait un accès physique au circuit électronique de la machine pendant l’exécution du logiciel. La perte ou le vol de la machine, une personne interne malveillante permet de satisfaire cette condition, mais cette restriction forte rend l’attaque difficile à réaliser. Avec un dispositif externe physique, une cible évidente est la modification ou l’exploitation des propriétés physiques de la cible. L’attaque par injection de faute [Hsueh 1997] par exemple, repose sur la modification de l’état d’un système afin d’altérer son flot de contrôle ou changer la valeur de certains de ses registres. Les 1.3. Classification des attaques 17 Externe Matériel Logiciel Origine de l’attaque Physique Microarchitecture Architecture Algorithmique Vulnérabilité visée Injection de faute Sonde externe Sonde matérielle Logiciel Firmware corrompu Cheval de Troie Mémoire Algorithmique CA temps Exécution transitoire Effet de bord physique Figure 1.3 – Attaques représentatives de chaque catégorie pour l’exécution des logiciels. Abréviation : CA : canal auxiliaire. méthodes usuelles d’injection de fautes reposent essentiellement sur des modifications de température ou de tension, la perturbation de l’alimentation ou de l’horloge du système, ou encore l’utilisation d’impulsions laser ou électromagnétiques sur le circuit. Les attaques référencées sous le terme sonde externe dans la figure 1.3 correspondent à des attaques basées sur des sondes physiques pour observer le système. Elles visent des vulnérabilités physiques impactées par le changement des états logiques de la microarchitecture. Le microprobing [Skorobogatov 2017] consiste à placer des sondes sur des fils de cuivre et à observer l’évolution des niveaux de tension pendant l’exécution du système. Par exemple, lorsqu’un logiciel demande de réaliser un accès mémoire, cet accès est envoyé vers la mémoire principale à l’aide d’un bus constitué d’un ensemble de fils de cuivre contenant différents états binaires sous forme de niveaux de tension. En mesurant l’évolution des tensions, il est possible de déduire l’adresse mémoire utilisée par le logiciel. Les attaques par canaux auxiliaires physiques [Kocher 1996, Camurati 2018] utilisent des sondes à proximité du circuit, du millimètre à une dizaine de mètres en fonction du canal exploité. Les canaux typiques observables sont les émanations électromagnétiques, les ondes sonores, thermiques ou optiques, induites par les changements d’état des éléments logiques dans la microarchitecture. Ces mesures permettent de déduire des logiques du circuit activées dans le temps et certaines valeurs dans ces logiques. Dans le cas où l’utilisation des logiques est couplée avec l’exécution du logiciel, on peut en déduire des informations liées à l’exécution du logiciel.
Introduction |