• Aucun résultat trouvé

Chapitre 4 Application des techniques de fuzzing sur les bus d’entrées-sorties 77

B.3 Résultats obtenus

qui est affiché sur l’écran de Bob en écrivant par DMA dans cette même mémoire vidéo. La figure B.2 représente ce scénario d’attaque.

BOB EVE

Câble Fir

eWir e

Processeur

FIGUREB.2 – Scénario d’attaque

B.3 Résultats obtenus

Nous avons développé cette attaque en utilisant comme machine cible (Bob) une machine de type desktop disposant d’une carte-mère Intel DX58SO, laquelle embarque un chipset Intel x58 (plus précisément, IOH x58 / ICH10). Elle dispose aussi d’une carte graphique nVidia GeForce 9800 GT et d’un contrôleur FireWire de type PCI. C’est ce contrôleur FireWire qui, lors de l’attaque, sera piloté par la machine de l’attaquant (Ève), un ordinateur portable connecté sur le port FireWire. Nous reconstituons l’écran de Bob à raison de deux images par secondes. Nous considérons cela tout-à-fait acceptable pour récupérer des informations affichées à l’écran (par exemple, un couple identifiant-mot de passe), mais insuffisant pour récupérer un flux en temps réel (par exemple, la capture d’un flux vidéo).

Nous avons déterminé plusieurs facteurs qui impactent les performances que nous obte-nons pour notre attaque :

— L’application exécutée sur l’ordinateur portable d’Ève, qui lit la mémoire de la carte gra-phique au travers du contrôleur FireWire, a été développée dans le langage Python. Les bibliothèques de fonctions que nous avons utilisées pour communiquer sur les bus FireWire et reconstituer l’écran de Bob sont des wrappers Python de bibliothèques dé-veloppées dans le langage C. Nous aurions pu obtenir de meilleures performances en évitant cette sur-couche et en implémentant notre application dans un langage natif. — Dans notre attaque, nous avons utilisé le contrôleur FireWire disponible sur la

carte-mère. Ce contrôleur est de type PCI. Comme la bande passante des bus PCI Express est supérieure à celle des bus PCI, nous aurions pu améliorer la fluidité de la lecture d’écran en impliquant uniquement des contrôleurs de type PCI Express dans l’attaque. Cependant, à l’heure actuelle, peu de cartes-mère embarquent un contrôleur FireWire PCI Express et nous avons voulu utiliser un matériel représentatif des systèmes actuels. — Nous avons remarqué au cours de nos expérimentations que les performances de notre attaque sont fortement dépendantes du contrôleur d’entrée-sortie que nous ciblons. En effet, certains contrôleurs d’entrée-sortie ne gèrent que des accès par octets, d’autres par mots, etc. Les types d’accès supportés par le contrôleur d’entrée-sortie attaqué impactent directement les résultats des expérimentations.

Annexe C

Plusieurs exemples d’expérimentations

avec le contrôleur IronHide

Cette annexe détaille les premières expérimentations que nous avons effectuées avec notre contrôleur IronHide une fois que celui-ci a été mis au point. Comme nos travaux visent à étudier les attaques depuis les entrées-sorties, et que l’interface fournie par la majorité des contrôleurs sur étagère est généralement restreinte aux requêtes d’accès à l’espace d’adressage principal de la mémoire (par exemple, pour le mécanisme d’accès direct à la mémoire), nous avons cherché à présenter dans cette annexe des expérimentations difficiles, voire impossibles à mettre en œuvre depuis des contrôleurs conventionnels. Ainsi, les prochaines sections dé-taillent ces expérimentations atypiques ainsi que les résultats associés. Afin de mieux les cerner, nous commençons par décrire la plate-forme d’expérimentation.

C.1 Description de la plate-forme d’expérimentation

La figure C.1 présente la plate-forme que nous avons utilisée pour nos expérimentations. Elle se compose principalement de deux machines qui jouent respectivement le rôle d’une cible et d’un moniteur. La machine cible représente la machine pour laquelle nous souhaitons étudier le comportement du chipset en réponse à des requêtes d’entrées-sorties diverses. Ces requêtes d’entrées-sorties sont initiées par notre contrôleur qui est relié à l’un des connecteurs d’exten-sion PCI Express ou Express Card disponibles sur la carte-mère de la machine étudiée. Nous l’avons programmé pour servir de serveur mandataire (proxy) PCI Express pour la machine mo-niteur : il émet tous les paquets reçus depuis l’interface Ethernet en provenance de la machine moniteur vers les bus PCI Express de la machine cible et renvoie vers la machine moniteur les réponses éventuelles. Pour cela, le logiciel embarqué dans le contrôleur implémente une pile TCP/IP et contient un serveur TCP qui relaie les paquets entre la machine moniteur et les bus d’entrées-sorties. Le contrôleur est configuré avec une adresse IP statique (192.168.1.10) et le serveur TCP embarqué attend de nouvelles connexions sur le port 65535. Il est à no-ter que nous aurions pu gagner en performance en choisissant l’utilisation d’un serveur UDP plutôt qu’un serveur TCP. Nous avons préféré utiliser le protocole TCP, de façon à fiabiliser les échanges et ainsi éviter les problèmes liés aux pertes de paquets réseau par congestion du contrôleur ou de la machine moniteur lors de nos expérimentations. Afin d’éviter toute ambi-guïté, nous précisons que les adresses réseau que nous avons utilisées sont propres au contrô-leur et ne sont pas liées aux éventuelles cartes réseau de la machine cible. Les trames reçues par le contrôleur sont directement traitées par sa pile TCP/IP interne et ne sont pas vues par le

sys-tème d’exploitation de la machine cible. En plus d’une interface Ethernet, nous avons ajouté au contrôleur une interface série RS-232 sur laquelle les activités du contrôleur sont régulièrement reportées.

FIGUREC.1 – Plate-forme d’expérimentation

La machine moniteur est celle qui va définir les transactions PCI Express à émettre sur la machine cible. Pour construire et disséquer les Transaction Layer Packets (TLP) PCI Express, nous utilisons l’outil réseau Scapy. Comme ce dernier n’implémente pas nativement le protocole PCI Express, nous l’avons étendu pour intégrer ce nouveau protocole36. Scapy est également utilisé pour encapsuler les TLP PCI Express forgés dans un paquet TCP et se charge de les envoyer au contrôleur connecté à la machine cible.