• Aucun résultat trouvé

Attaques par accès direct à la mémoire

Chapitre 3 Mise en œuvre d’attaques par entrées-sorties sur une architecture PC 49

3.2 Contrôle des accès directs à la mémoire centrale

3.2.1 Attaques par accès direct à la mémoire

L’accès direct à la mémoire ou DMA (Direct Memory Access) est un mécanisme où la gestion des transferts de données vers la mémoire centrale est laissée aux contrôleurs d’entrées-sorties. Les processeurs ne sont notifiés qu’a posteriori par une interruption qui les prévient de la fin du transfert. Pour accomplir ces transferts, un contrôleur d’entrées-sorties endosse temporaire-ment le rôle de maître sur les bus d’entrées-sorties de façon à en prendre le contrôle et à émettre sur ceux-ci les requêtes d’accès correspondantes. Jusqu’à très récemment, ces transferts se réa-lisaient de manière transparente pour le système d’exploitation. Ni les processeurs, ni le chipset n’étaient alors en mesure de contrôler les adresses vers lesquelles s’effectuaient ces transferts et, encore moins, de bloquer les éventuels accès frauduleux. Des attaquants ont naturellement profité de cette faiblesse structurelle pour violer les propriétés de sécurité (intégrité et confi-dentialité) des composants logiciels chargés en mémoire centrale. L’accès à certaines régions de mémoire (par exemple, celles contenant le code du noyau de système d’exploitation) pouvant être restreint par les processeurs, il était ainsi plus simple, pour un attaquant, de mettre en place ces accès avec le concours d’un contrôleur d’entrées-sorties. En effet, de tels accès ne peuvent pas être contrôlés par un logiciel de détection ou de protection étant donné qu’ils ne nécessitent pas l’intervention des processeurs principaux. Nous parlons alors d’attaques par accès direct à la mémoire, en référence au type d’accès d’entrées-sorties sur lequel elles s’appuient. Chaque contrôleur d’entrées-sorties implémente une manière de configurer un transfert de données qui lui est spécifique. Toutefois, cette configuration s’effectue depuis un processeur, depuis un périphérique, voire depuis le contrôleur d’entrées-sorties lui-même.

3.2.1.1 Attaques DMA initiées par les processeurs

Les attaques par accès direct à la mémoire dont les transferts sont initiés par les proces-seurs nécessitent l’exécution d’un code malveillant par le processeur principal. Une attaque ty-pique consiste à mettre en place, dans un premier temps, des structures de contrôle en mémoire centrale qui décrivent les transferts à effectuer : l’adresse, la direction20 et la taille de chacun d’eux doivent notamment être précisées. Le logiciel malveillant précise ensuite au contrôleur d’entrées-sorties, en positionnant un registre prévu à cet effet, la localisation de la structure de contrôle concernée, et le contrôleur exécutera les transferts programmés à la réception d’un évé-nement spécifique (par exemple, une interruption). Ces transferts peuvent cibler une adresse quelconque de la mémoire centrale. En particulier, il peut être intéressant, pour un attaquant, de cibler le noyau de système d’exploitation (code ou tables de configuration, en particulier les tables de gestion de la mémoire). En effet, corrompre le système d’exploitation signifie poten-tiellement corrompre l’ensemble des applications qui s’exécutent au dessus de ce noyau.

Les preuves de concept d’attaques qui reposent sur ce mode opératoire mettent en œuvre des contrôleurs d’entrées-sorties variés. Celle publiée dans [Duflot 07] décrit, par exemple, une escalade de privilèges à l’aide de contrôleurs de périphériques USB : l’attaquant met en place plusieurs transferts de données dans le contrôleur USB de façon à lui faire écraser des régions précises de la mémoire centrale (la région de données contenant la valeur du securelevel21dans un système OpenBSD) par les données fournies par les périphériques USB. Les transferts sont

20Nous distinguons deux directions de transfert de données possibles : un transfert de la mémoire centrale vers le contrôleur d’entrées-sorties ou l’inverse, c’est-à-dire du contrôleur d’entrées-sorties vers la mémoire centrale.

21Dans un système de type BSD, cette variable indique le niveau de sécurité mis en œuvre par le noyau de système d’exploitation. Des restrictions au sein du système (par exemple, accès aux périphériques virtuels, opérations au-torisées sur les disques, etc.) sont instaurées en fonction de sa valeur. Plus celle-ci est élevée, plus elle implique de restrictions.

3.2. Contrôle des accès directs à la mémoire centrale

exécutés par le contrôleur de périphériques USB à la détection d’un événement sur l’un de ses bus (la ré-initialisation d’un bus USB, le branchement d’un périphérique USB, etc.).

Les contrôleurs réseau peuvent, de la même façon, être détournés à des fins d’attaques. Pour atteindre des bandes passantes de l’ordre du gigabit sur les liens réseau, ceux-ci reposent, en particulier, sur le mécanisme d’accès direct à la mémoire pour échanger des trames Ethernet (reçues ou à émettre) avec la mémoire centrale. Les attaques typiques impliquant ces contrô-leurs nécessitent de reconfigurer contrô-leurs transferts de données de façon à modifier une région de mémoire avec des données reçues par le réseau ou, au contraire, à exfiltrer des données sto-ckées dans la mémoire centrale vers le réseau. En fonction du contrôleur réseau qu’il utilise, un attaquant peut rencontrer quelques difficultés d’ordre technique. Un transfert de données dans un contrôleur réseau correspond soit à la trame qui vient d’être reçue depuis le réseau et que le contrôleur réseau copie dans la mémoire centrale, soit à une trame qui a été construite par le système d’exploitation et que le contrôleur réseau va lire en mémoire centrale puis émettre sur le réseau. Lorsqu’un attaquant détourne l’un de ces transferts pour modifier la mémoire centrale par exemple, il doit s’assurer que les données qu’il souhaite y inscrire correspondent à une trame valide, notamment pour que celle-ci puisse être commutée correctement au travers du réseau jusqu’au contrôleur réseau sur lequel repose l’attaque. Un problème analogue existe lorsqu’un attaquant s’en sert pour exfiltrer des données vers le réseau : les données lues en mémoire doivent également correspondre à une trame valide afin que celle-ci puisse être com-mutée au travers du réseau jusqu’à l’attaquant. Ces contraintes techniques rendent difficile l’exploitation de ces transferts depuis un contrôleur réseau car l’attaquant n’a pas une maîtrise sur l’intégralité des données.

Dans [Wojtczuk et Rutkowska 11b], les auteurs proposent une solution intéressante à ce problème. Elle consiste à détourner le mécanisme de scatter-gather embarqué dans les contrô-leurs réseau récents dans le but de diviser les transferts de données en transferts plus petits. L’attaquant peut alors s’arranger, en configurant ce mécanisme, pour que les octets sur lesquels il n’a aucune maîtrise (par exemple, les entêtes de la trame Ethernet et du paquet IP) soient lus depuis (ou copiés vers) une région de mémoire arbitraire, et que les octets restants sur lesquels il a une maîtrise complète soient lus depuis (ou copiés vers) la région souhaitée de la mémoire centrale. Dans leur preuve de concept, ils mettent en œuvre cette solution pour modifier à leur guise les régions de la mémoire centrale, depuis un contrôleur réseau Intel e1000e. Ce mo-dèle de contrôleur réseau est aujourd’hui présent dans la majorité des chipsets Intel. L’attaque a consisté à envoyer des paquets réseau ping malveillants : les octets correspondant aux en-têtes des trames Ethernet, des paquets IP et des paquets ping sont copiés par le contrôleur réseau dans les tampons de réception du système d’exploitation (afin de le leurrer et le laisser croire en la réception de paquets réseau normaux) alors que les octets restants sont copiés dans une région souhaitée de la mémoire centrale et écrasent par exemple des structures de contrôle du système d’exploitation.

3.2.1.2 Attaques DMA initiées par les périphériques

Les attaques par accès direct à la mémoire dont les transferts sont initiés par les périphé-riques requièrent au préalable un accès physique au système cible. En effet, elles nécessitent la modification d’un périphérique de façon à ce qu’il puisse se comporter à la fois en maître et en esclave sur son bus et non plus uniquement en esclave comme est supposé se comporter un périphérique classique. Un attaquant exploite ensuite la capacité de ce périphérique à prendre le contrôle de son bus afin de soumettre au contrôleur de périphérique des commandes pour mettre en place des transferts de données avec la mémoire centrale. Aujourd’hui, de nombreux

standards de bus tels que le FireWire22 et certaines variantes de l’USB, motivés par des exi-gences de performances de plus en plus élevées, autorisent les périphériques à se comporter à la fois en tant que maître et en tant qu’esclave. Ceux-ci sont susceptibles d’être utilisés à des fins d’attaques. M. Dornseif a été pionnier dans ce domaine. Il a présenté, à l’occasion des confé-rences PacSec [Dornseif 04] et CanSecWest [Becher et al. 05], plusieurs preuves de concept d’at-taques consistant à relier par un câble FireWire, un système BSD, Linux ou Mac OS à un iPod sur lequel avait été installé un système d’exploitation Linux modifié. L’exploit a consisté à utili-ser cet iPod pour lire ou modifier l’intégralité de la mémoire centrale du système auquel il était connecté. Ses travaux ont été complétés par [Boileau 06], qui a proposé une technique consis-tant à usurper l’identité d’un autre périphérique FireWire, pour également faire fonctionner ces attaques sur les systèmes Windows. Ces travaux en ont inspiré d’autres : [Martin 07] présente plusieurs techniques de compromission de systèmes Linux alors que [Aumaitre 08] s’est foca-lisé sur les systèmes Windows. Des variantes de l’USB, en particulier l’USB On-The-Go (OTG), fournissent des fonctionnalités similaires au FireWire. [Maynor 05] montre ainsi qu’un télé-phone portable peut être modifié de façon à injecter du code en mémoire centrale. Il semble-rait également que les périphériques USB 3 puissent commander les contrôleurs de périphé-riques auxquels ils sont connectés. Cependant, à notre connaissance, aucune étude n’a encore confirmé cette assertion.

3.2.1.3 Attaques DMA initiées par un contrôleur d’entrées-sorties

Finalement, certains contrôleurs d’entrées-sorties peuvent initier eux-mêmes des transferts de données vers la mémoire centrale. Nous distinguons, parmi les contrôleurs d’entrées-sorties qui disposent d’une telle capacité, ceux qui ont été conçus délibérément pour cela et ceux qui ont été modifiés à cet effet.

La plupart des contrôleurs d’entrées-sorties conçus pour initier eux-mêmes des transferts de données vers la mémoire centrale reposent sur un micro-contrôleur pour piloter les bus d’entrées-sorties ou sont programmés à l’aide de technologies de logique programmable tels que les FPGA. De nombreuses preuves de concept d’attaques par entrées-sorties ont recours à ce type de contrôleur d’entrées-sorties malveillant [Aumaitre et Devine 10,Carrier et Grand 04, Devine et Vissian 09,Petroni et al. 04]. Puisque l’attaquant conçoit lui-même son propre contrô-leur d’entrées-sorties, il a la liberté de définir son propre canal de commande et d’implémenter, au sein de son contrôleur d’entrées-sorties, des fonctionnalités qui ne seraient pas disponibles dans les contrôleurs d’entrées-sorties sur étagère.

Une autre possibilité, cependant moins permissive que l’approche précédente, consiste à modifier un contrôleur d’entrées-sorties existant. Ceci est possible parce que les contrôleurs d’entrées-sorties disposent de plus en plus de capacités de calcul pour décharger davantage les processeurs principaux de certains calculs et pour gagner en performances. À cet effet, ils embarquent un ou plusieurs processeurs sur lesquels s’exécute un firmware qui décrit les trai-tements à effectuer. Il est possible de modifier ce programme de façon à ce que le contrôleur d’entrées-sorties puisse, de lui même, initier des accès à la mémoire centrale. À notre connais-sance, A. Triulzi a été le premier à utiliser cette technique : il décrit dans [Triulzi 08a] une modification (hors-ligne) du firmware de la carte réseau Broadcom Tigon consistant à

trans-22À l’origine, les bus FireWire ont été créés pour accueillir des périphériques externes qui nécessitent une bande passante élevée. Parmi ceux-ci, les périphériques multimédias tels que les appareils photo, les caméras numériques et les disques durs externes nécessitent des taux de transferts particulièrement élevés. Ces besoins expliquent la possibilité offerte à ces périphériques de commander le contrôleur de périphériques auquel ils sont reliés et d’initier des transferts avec sa mémoire. Les accès à cette mémoire sont généralement redirigés vers la mémoire centrale.

3.2. Contrôle des accès directs à la mémoire centrale

férer automatiquement les trames réseau reçues qui respectent un certain motif vers la mé-moire centrale. Il a suffit qu’il envoie des trames réseau forgées d’une manière spécifique pour initier l’attaque. La modification d’un firmware peut également se faire en cours d’exécution, par exemple, par l’exploitation d’une vulnérabilité au sein de celui-ci. Récemment, l’équipe de L. Duflot [Duflot et al. 10] a démontré la faisabilité d’une telle attaque sur plusieurs cartes ré-seau Broadcom NetXtreme. L’un des firmware exécuté par ce modèle de cartes réré-seau, chargé d’implémenter la fonctionnalité d’administration ASF (Alert Standard Format), contenait une vulnérabilité de type débordement de tampon. Ils ont ainsi pu prendre le contrôle d’un des processeurs embarqués dans la carte réseau et ils lui ont fait exécuter du code arbitraire en lui envoyant de trames réseau malformées. Cette technique peut aussi être utilisée pour insérer une porte dérobée [Delugré 10].

Les attaques DMA précitées exploitent le manque de contrôle d’accès dans les architec-tures PC. Nous rappelons qu’il est extrêmement difficile de détecter de manière logicielle ces attaques, dans la mesure où leur mise en œuvre ne nécessite pas l’intervention des processeurs principaux. Comme nous allons le montrer dans les sous-sections 3.2.2 et 3.2.3, il est possible de s’en protéger au moyen de contre-mesures matérielles. Néanmoins, les contre-mesures ma-térielles elles-mêmes présentent des insuffisances, et d’autres attaques par entrées-sorties res-tent possibles. Ainsi, nous présentons en sous-section 3.2.4, un exploit consistant à injecter des trames réseau par des accès DMA initiés depuis un périphérique FireWire, et ceci en présence de mécanismes matériels visant à contrôler ces accès. Il nous est alors possible de mener tout type d’attaque réseau (par exemple, de l’ARP spoofing) sans qu’elles puissent être détectées puisqu’elles ne laissent aucune trace sur les réseaux.