Attaques par direct memory access et sécurité hardware

Spécialité(s)


Résumé

Le direct memory access est une fonctionnalité présente sur tous les ordinateurs. Nous verrons en quoi il les rend vulnérables, comment attaquer un ordinateur via ce vecteur d'attaque et finalement comment se prémunir de ce type d'attaque.


Body

Dans le domaine des attaques informatiques, il existe une branche que l’on nomme les attaques physiques. Ces dernières s’appliquent à la partie électronique d’un système ou nécessitent un accès physique pour pouvoir être réalisées. Il existe un type d’attaque physique qui tire parti de la capacité d’accès direct à la mémoire des ordinateurs ; ce sont les attaques DMA (Direct Memory Access). Nous allons voir comment obtenir de l’exécution de commandes, monter le système de fichiers et contourner le mot de passe de session d’un ordinateur à l’aide d’attaques DMA. Nous prendrons toujours le cas d’un ordinateur possédant un port M.2, un port Thunderbolt, plus de 4Go de mémoire et qui utilise un Windows 10 21H1 avec les réglages de sécurité de base.

1. Aperçu sur le DMA

Au début de l’informatique, les processeurs (CPU - Central Processing Unit) des ordinateurs devaient traduire les adresses virtuelles en adresses physiques (adresses de la mémoire du système, la RAM). Cette tâche simple, mais répétitive encombrait le CPU en consommant à temps plein une partie de sa puissance de calcul. C’est pour résoudre ce problème que les fabricants de semi-conducteurs et d’ordinateurs ont créé une puce électronique dédiée, l’unité de gestion de mémoire (MMU - Memory Management Unit). Cette puce a pour seule tâche de traduire les adresses virtuelles en adresses physiques et vice-versa. De nos jours, les MMU sont par défaut intégrées dans les CPU ; ce qui a permis une augmentation notable des performances des ordinateurs.

Peu de temps après, la même contrainte est apparue, mais concernant les périphériques. Le CPU devant copier les informations du périphérique vers le système et inversement, une partie de sa puissance de calcul était utilisée pour une opération triviale. Par exemple, un simple transfert de fichier empêchait le système de faire d’autres actions, ou le ralentissait énormément. C’est pour résoudre ce problème que les fabricants d’ordinateurs ont inventé le DMA.

Le DMA (Direct Memory Access) [1] est une fonctionnalité qu’ont tous les ordinateurs modernes. Il permet aux périphériques d’avoir un accès direct à la mémoire du système. Cela permet de décharger le CPU de cette tâche, donc rend un système plus performant. Pour qu’un ordinateur puisse utiliser du DMA, il est nécessaire de disposer d’un contrôleur DMA (DMAC), qui est un petit composant physique qui permet de communiquer sur le canal DMA.

Le DMA permet donc d’optimiser les performances d’un système, mais ouvre la porte à un nouveau type d’attaques physiques qui sont : les attaques DMA [2]. En effet, si un périphérique accède à la mémoire du système sans supervision du CPU, il peut en théorie injecter du code malveillant. L’attaque est invisible aux yeux de l’antivirus qui couvre la partie logicielle et non matérielle. En exploitant la mémoire volatile et non un accès direct au disque, ce type d’attaque est par conséquent plus complexe à tracer.

Pour faire face à ce problème, les fabricants d’ordinateurs ont développé l’unité de gestion de mémoire des périphériques (l’IOMMU [3] - Input Output Memory Management Unit). C’est un composant physique qui à deux fonctions : il virtualise les plages mémoires des périphériques et il gère l’accès des périphériques à la mémoire. L’IOMMU est aussi utile pour les machines virtuelles, par exemple lorsque l’on veut utiliser un périphérique physique dans une VM. L’IOMMU est le principal rempart aux attaques DMA [4] et elle remplit bien son rôle. Tout comme la MMU et le DMAC, l’IOMMU est de nos jours totalement intégrée au CPU. Le nom commercial de l’IOMMU d’Intel est : Intel VT-dIO, celui d’AMD est AMD-VI.

On retrouve du DMA dans les protocoles de communication PCIe [5] et Thunderbolt [6]. Ces protocoles ayant pour ports physiques associés PCIe, M.2 [7] et USB-C [8]. Ces deux protocoles ont une large bande passante à peu près équivalente. Mais présentent certaines différences : le Thunderbolt est connectable à chaud, le PCIe pas du tout, le Thunderbolt est un port externe, le PCIe est un port interne.

Étant un port externe, le Thunderbolt est un vecteur d’attaque bien plus intéressant pour les attaques DMA que le PCIe. A priori, l’exploitation ne nécessite pas l’ouverture ou le redémarrage du poste utilisateur. Il bénéficie donc d’un régime de sécurité supplémentaire. En effet, la sécurité du Thunderbolt est gérée via des « niveaux de sécurité » [9]. Ils sont au nombre de quatre.

Niveau 0 : Pas de sécurité, tout périphérique est connecté sans authentification préalable.

Niveau 1 : Réglage par défaut, tout périphérique connecté pour la première fois doit d’abord être approuvé par l’utilisateur. Il peut décider de se souvenir du périphérique ou non.

Niveau 2 : Il fonctionne comme le niveau 1, mais en plus l’ordinateur échange un secret avec le périphérique. Cela empêche d’usurper l’adresse d’un périphérique déjà connu.

Niveau 3 : Désactive le support du Thunderbolt par le port USB-C, à la place il fait transiter du Display Port Alternate Mode [10] et de l’USB-3 [11]. Il n’y a donc plus de DMA, mais la vidéo et les données peuvent toujours transiter.

Notez que des niveaux 4 (No Daisy-Chaining/ USB Docks Only) [36] et 5 (Disable PCIe Tunneling) [37] existent. Cependant, ils ne sont pas assez répandus ou juste pas encore implémentés. Ils ne sont donc pas pertinents pour le moment.

Le Thunderbolt est un protocole propriétaire développé par Intel, le PCIe est open source. Le Thunderbolt est en fait du PCIe empaqueté différemment avec du Display Port Alternate en plus.

De par ses niveaux de sécurité, l’aspect propriétaire du protocole, et le fait que ses paquets soient différents des paquets PCIe ; le Thunderbolt a besoin d’un contrôleur spécifique. Il n’est pas intégré directement au CPU. Cette puce est par conséquent spécifique ; et est donc simple à identifier, car il en existe un seul modèle et son fabricant est toujours Intel. Cependant, il est strictement impossible de trouver une fiche technique ou d’acheter cette puce à l’unité. Il existe différents modèles de ces contrôleurs, mais ils viennent tous de la même famille dont le nom commence par JHL. Par conséquent, si nous identifions un composant proche du port Thunderbolt dont la référence commence par JHL, il y a de grandes chances qu’il s’agisse du fameux contrôleur Thunderbolt. On peut retrouver du Thunderbolt 1 et 2 dans des connecteurs Mini Display Port et du Thunderbolt 3 et 4 dans des connecteurs USB-C. Tous les produits avec un port USB-C n’ont pas de Thunderbolt ; seuls ceux qui comportent un pictogramme représentant une flèche en forme d’éclair ont la capacité de faire du Thunderbolt. Voyons maintenant comment attaquer un ordinateur via le DMA en pratique.

2. Équipement d’attaque

2.1 Software

Nous avons besoin d’un logiciel capable de communiquer en DMA. Un outil capable d’envoyer du code malveillant à un endroit précis de la mémoire, sans corrompre le fonctionnement du système. Il serait aussi intéressant que ce logiciel permette de cibler des processus spécifiques (comme winlogon.exe ou lsass.exe par exemple). Pour ce faire, nous allons utiliser un outil appelé PCILeech [12], développé par Ulf Frisk [13]. Sa première version est sortie en 2016, il continue à maintenir et améliorer le logiciel depuis. PCILeech possède divers modules différents, ce qui donne une grande granularité quant aux possibilités d’attaques. Parmi ses fonctionnalités les plus performantes : obtention d’un accès en ligne de commandes sur le système, accès au système de fichiers et contournement de l’écran de verrouillage. PCILeech permet l’exploitation d’attaques DMA sur l’ensemble des systèmes d’exploitation.

Nous retrouvons ensuite MemProcFS [14], un logiciel spécialisé dans l’analyse de mémoire. MemProcFS et PCILeech sont intimement liés, ils utilisent tous deux la librairie LeechCore [15] qui leur permet de communiquer à la mémoire des systèmes. MemProcFS peut monter et copier la mémoire d’un système, accéder et modifier des processus, extraire la base SAM [16], etc.

2.2 Hardware

Les attaques DMA sont des attaques physiques, il nous manque donc de l’équipement physique pour pouvoir réaliser notre attaque. Une simple connexion entre les ports PCIe ou Thunderbolt des ordinateurs d’attaque et victime n’est pas suffisante ; il nous faut un équipement capable de communiquer en DMA. Nous pouvons faire cela à l’aide de puces FPGA, cependant il faut interfacer le FPGA avec un port PCIe ou Thunderbolt de l’ordinateur victime. Ces protocoles fonctionnant à très haute vitesse, on ne peut pas connecter simplement les bornes du FPGA à un connecteur M.2 en espérant que cela fonctionne. Toutes les connexions faisant transiter de l’information utile ont besoin d’un moyen de protection contre les interférences, c’est-à-dire des câbles torsadés ou coaxiaux ; le circuit imprimé doit avoir des paires différentielles [17]. On ne peut pas bricoler de connexion, il faut un circuit imprimé spécifique comportant les connecteurs déjà installés (du PCIe, M.2 ou Thunderbolt). Le problème est que le sujet des attaques DMA est un sujet niche, les puces utilisées sont coûteuses, l’usage de la carte est très spécifique et peu répandu ; ces cartes sont produites en faibles quantités, cela les rend rares et onéreuses.

Le sujet des attaques DMA sur protocole PCIe a commencé avec l’USB 3380 [18], cependant ce n’est pas un bon choix dans notre cas, car il ne permet la lecture que de 4Go de RAM (les ordinateurs de nos jours ont pour la plupart plus de 4Go). On pourrait utiliser un AC701 [19] couplé à un FT605 [20], mais cela coûterait très cher et serait surdimensionné. Les PicoEVB [21] et RaptorDMA [22] sont des choix intéressants, mais malheureusement non supportés par PCILeech. Nous retrouvons ensuite, le ScreamerM2 ; peu onéreux, supporté par PCILeech avec un port M.2 (NVMe) déjà intégré. À ce jour cet équipement n’est plus proposé en vente. Nous optons donc pour le SquirrelScreamer [23], plus onéreux (500€) et comportant seulement un port PCIe, mais présent sur le marché et supporté par PCILeech. Nous allons nous concentrer sur l’attaque d’ordinateurs portables, donc des ports M.2 ou Thunderbolt.

3. Attaque sur les ports M.2

Pour attaquer en M.2, il nous faut un adaptateur M.2 (Key A+E) vers PCIe ainsi qu’une alimentation 12VDC. Nous utilisons l’emplacement de la carte Wi-Fi, il faut donc que la clé du port M.2 corresponde (clé A+E). L’alimentation servira pour le Screamer, le port M.2 ne permet pas de faire transiter de 12V. Nous retrouvons donc la configuration illustrée en Figure 1.

Notez qu’en théorie, il est aussi possible de réaliser cette attaque sur du MiniPCIe, il faudra alors un connecteur adapté.

PhotoAttackM2-s

Fig. 1 : Setup d'attaque sur port M.2.

Tout d’abord, le chargement d’un module de noyau est requis :

PS C:\PCILeech> .\pcileech.exe kmdload - kmd win10_x64_3
KMD: Failed Memwrite (CI.d11) #6
PCILEECH: Failed to load kernel module.

Nous observons ici que le chargement du module échoue en raison de l’IOMMU qui nous empêche d’injecter du code. Il est possible de désactiver ce dernier dans le BIOS (tout en conservant les autres mécanismes de sécurité que sont Device Guard, Secure Boot, etc.). Après modification, nous obtenons un accès SYSTEM.

PS C:\PCILeech> .\pcileech.exe kmdload -kmd win10_x64_3
KMD: Code inserted into the kernel - Waiting to receive execution.
KMD: Execution received - continuing ...
KMD: Successfully loaded at address: 0x7ffff000
PS C:\PCILeech> .\pcileech.exe wx64_pscmd - kmd 0x7ffff000
 
EXEC: SUCCESS!
 
C:\Windows\system32>whoami
whoami
autorite nt\système

Après avoir un accès à un shell SYSTEM, il est possible de créer un nouvel utilisateur, modifier le mot de passe d’un utilisateur déjà existant, modifier les valeurs des registres...

Il est possible de monter le système de fichiers de l’ordinateur victime comme ci-dessous. Et donc d’avoir accès à toutes les informations présentes sur le disque.

PS C:\PCILeech> .\pcileech.exe kmdload -kmd win10_x64_3
 
KMD: Code inserted into the kernel - Waiting to receive execution.
KMD: Execution received - continuing ...
KMD: Successfully loaded at address: 0x7ffff000
PS C:\PCILeech> .\pcileech.exe mount - kmd 0x7ffff000
 
MOUNT: Mounting as drive K:\

Il existe un module pour contourner le mot de passe session. Cela rend l’authentification encore plus simple qu’en modifiant le mot de passe à l’aide du shell system.

PS C:\PCILeech> .\pcileech.exe wx64_unlock -0 1 - kmd WIN10_X64_3
KMD: Code inserted into the kernel - Waiting to receive execution.
KMD: Execution received - continuing ...
EXEC: SUCCESS!

Un des modules PCILeech permet aussi de lister les processus en cours sur l’ordinateur. On peut par exemple constater la présence des processus winlogon.exe et lsass.exe.

PS C:\PCILeech> .\pcileech.exe pslist
     608    winlogon.exe
     712    lsass.exe

La désactivation d’autres réglages tels que VT-dIO et VBS peut engendrer des comportements imprévisibles du système (plantages, absence de réactions, etc.).

Ces attaques sont redoutables dans la théorie. Cependant, l’IOMMU est activée par défaut, rendant ces attaques non réalistes dans la pratique.

Voyons quelles perspectives nous offre le port Thunderbolt.

4. Attaque sur le port Thunderbolt

À l’instar du protocole M.2, le protocole Thunderbolt requiert une connectique spécifique (adaptateur Thunderbolt vers PCIe) difficile à se procurer. Une alternative consiste à passer par un boîtier de GPU externe [24] (EGPU) permettant l’utilisation d’une carte graphique externe sur un ordinateur portable (dont la carte graphique est généralement soudée) via un port Thunderbolt.

Il est également possible d’opter pour une option moins onéreuse consistant à se procurer un adaptateur Thunderbolt vers PCIe sur un site d’e-commerce chinois très connu, disposant d’un composant propriétaire fabriqué par Intel.

Nous avons également besoin d’une carte pour interfacer le Screamer et l’adaptateur. Pour cela, nous utilisons une carte d’adaptation de carte graphique, celles-ci sont utilisées pour miner de la cryptomonnaie. Dans notre cas, cette carte va aussi servir à alimenter le Screamer sans avoir besoin de souder l’alimentation directement sur ce dernier. Elle permet un montage plus propre et modulaire du matériel d’attaque. Du fait de l’intérêt grandissant pour les cryptomonnaies, il est relativement facile de se procurer ces cartes. Elles disposent toutes de connecteurs USB qui font en réalité transiter du PCIe.

Après avoir effectué les branchements, nous sommes prêts à lancer l’attaque :

PS C:\PCILeech> .\pcileech.exe kmdload -kmd win10_x64_3 -device fpga -memmap physmemmap.txt -v
 
DEVICE: FPGA: ERROR: Unable to retrieve required Device PCIe ID [4,v4.10,0000]
PCILEECH: Failed to connect to the device.

Malheureusement, nous sommes une fois de plus bloqués en raison du contrôleur Thunderbolt et de l’IOMMU. En revanche, l’ordinateur ne gèle/plante pas. Voyons comment contourner ces mécanismes de défense.

4.1 Contourner l’IOMMU

Le chercheur Björn Ruytenberg [25] a découvert un ensemble de sept vulnérabilités [26] affectant le protocole Thunderbolt et leur a attribué le nom « Thunderspy » [27]. L’une de ces vulnérabilités exploite les possibilités de rétrocompatibilité avec Thunderbolt 2 d’un contrôleur Thunderbolt 3, ce dernier présentant alors les mêmes faiblesses que cette version du protocole. Une autre vulnérabilité consiste à usurper l’identifiant d’un périphérique ayant préalablement été autorisé et enregistré sur le système. Cette attaque n’est pas possible sur un niveau de sécurité 2 ou 3 de Thunderbolt, cependant le niveau par défaut est le niveau 1 et ce dernier n’est que rarement modifié, rendant cette attaque réaliste. Une dernière vulnérabilité cible la chaîne de confiance de l’IOMMU et du contrôleur Thunderbolt. Le firmware de ce dernier est stocké dans une mémoire flash de quelques méga-octets et dispose de bus de communications I2C [28] ou SPI [29]. Bien que ce stockage puisse être configuré en lecture seule, en pratique il est toujours configuré en lecture/écriture, les fabricants se réservent la possibilité d’effectuer des mises à jour de ce firmware rendant ainsi possible sa substitution par une version malveillante disposant d’un niveau de sécurité à 0 (pas de sécurité).

Les lecteurs intéressés sont invités à prendre connaissance des autres vulnérabilités. Dans la suite de cet article, nous ne nous intéresserons qu’à la dernière, jugée plus intéressante et polyvalente.

Avant de passer à la partie attaque, nous allons faire un aparté sur la rétro-ingénierie de circuit imprimé nous permettant de poser des bases utiles pour la suite.

4.2 Localiser des composants physiques sur un circuit imprimé

Une des premières choses à faire est de regarder le circuit imprimé. On peut en apprendre énormément juste en observant. On peut observer les pistes, cela peut permettre de savoir quels composants sont connectés entre eux. Les pistes indiquent aussi la nature du courant qui passe. Si les pistes sont très larges, cela signifie que c’est une alimentation ; si les pistes sont très fines alors ce ne sont que des signaux ; si 2 pistes se suivent et sont strictement parallèles du début à la fin, ce sont vraisemblablement des paires différentielles, donc probablement des protocoles type PCIe, USB ou autre. La présence de pistes ayant des angles arrondis, est en général signe de qualité, attention la contraposée n’est pas vraie. On peut également utiliser un multimètre pour, par exemple, détecter avec précision quels pins de chaque composant sont connectés entre eux, ou vérifier les alimentations. Sur de petits composants passifs, il n’y aura pas nécessairement de référence visible. Cependant, si le composant possède une référence connue, il ne reste ensuite plus qu’à lire la fiche technique de ce dernier pour comprendre son implémentation. Si aucune fiche technique n’est trouvable, seule une analyse partielle du circuit sera possible. Dans certains cas, il sera possible de trouver des références sur le circuit imprimé, qui pourront aider à trouver davantage d’informations sur Internet.

Dans le cas du contrôleur Thunderbolt, nous savions que la référence du composant commençait par « JHL ». Puisqu’il contrôle le Thunderbolt, il devrait donc être proche du port correspondant. En effet, en cherchant près de ce dernier on trouve une puce avec une référence « JHL6240 ». Nous sommes également à la recherche d’une mémoire Flash. En regardant juste au-dessus du contrôleur, on trouve une mémoire Winbond [30] dans un petit boîtier SOIC-8. Nous avons également réussi à nous procurer les plans de fabrication de l’ordinateur. Nous avons ensuite obtenu les références des composants sur la fiche technique (les numérotations des composants correspondent). De plus, cette dernière indique que la mémoire et le contrôleur Thunderbolt sont connectés, et que la mémoire Flash est une mémoire en SPI. Le contrôleur et sa mémoire sont maintenant identifiés, notre rétro-ingénierie est quasi-totale. Il est temps de passer à l’attaque à proprement parler.

PhotoThunderboltArea-s

Fig. 2 : Zone du contrôleur Thunderbolt sur une carte mère et la mémoire flash associée sur la fiche technique.

4.3 Attaque

Pour commencer, il nous faut passer du niveau de sécurité 1 au niveau de sécurité 0. Pour cela, nous devons localiser la mémoire du contrôleur Thunderbolt et lire son contenu. Ensuite, nous utilisons l’outil Thunderspy (développé par Björn) qui prend en entrée le contenu de la mémoire et renvoie le même contenu, mais en modifiant le niveau de sécurité. Ce logiciel se sert d’une base de données de firmware de contrôleurs Thunderbolt déjà connus, elle n’est pas exhaustive. Le cas échéant, il est possible de l’enrichir en effectuant la manipulation sur un environnement de maquettage identique à l’environnement cible, régler son niveau de sécurité sur 0 et procéder à un dump de la mémoire de son contrôleur. Il sera alors possible de reflasher le contrôleur cible avec ce dump.

Le niveau de sécurité de notre contrôleur est maintenant réglé sur 0. Il n’est pas possible de vérifier cela dans le BIOS, car ce dernier ne lit pas la mémoire du contrôleur, il ne fait que l’écrire. Nous aurons besoin d’un programmateur SPI à cet effet (type HydraBus [31] ou BusPirate [32]). Maintenant que nous venons de contourner l’IOMMU, nous pouvons faire l’attaque DMA à proprement parler. Pour cela, nous branchons notre matériel.

PhotoAttackThunderbolt-s

Fig. 3 : Setup d'attaque sur port Thunderbolt.

Si nous utilisons la commande précédente, nous aurons un problème d’exécution. PCILeech a besoin d’attaquer une plage d’adresse mémoire. S’il ne connaît pas cette plage, il attaquera sur toutes les plages possibles. Une telle attaque est trop agressive : l’IOMMU détectera que du code s’exécute hors de sa plage mémoire allouée, donc pour se défendre elle éteindra l’ordinateur. Cela se produira à chaque fois que l’on essaiera d’attaquer de cette façon. Il nous faut donc un moyen d’attaquer une plage mémoire précise. La solution suivante a été proposée par l’auteur de PCILeech. Pour attaquer de manière précise : il faut utiliser le fichier de la cartographie de la mémoire physique (physmemmap.txt) qui peut être récupéré sur l’ordinateur avec un utilitaire, mais cette méthode présente l’inconvénient de nécessiter un accès authentifié sur le système. Nous pouvons aussi récupérer ces données à l’aide de MemProcFS, mais il risque lui aussi de faire une attaque agressive pour constituer le fichier. Nous devons donc lui donner une adresse de mémoire à ne pas dépasser (il n’est pas en mesure de déterminer la taille de la mémoire disponible sur l’ordinateur et essaiera par conséquent des adresses qui n’existent pas). L’option -max permet de donner une adresse physique maximum à ne pas dépasser. Malheureusement, cela ne fonctionne pas forcément du premier coup. Il faut donner une adresse qui correspond approximativement à la quantité de mémoire présente sur l’ordinateur (par exemple, en modifiant l’adresse en rajoutant ou en enlevant un 0). Cette partie est très incertaine et peut durer longtemps.

La commande ci-dessous permet de monter la RAM de l’ordinateur victime sous forme d’un système de fichiers.

PS C:\MemProcFS> .\memprocfs.exe -mount M -device FPGA -memmap auto

Si MemProcFS arrive à se connecter, il ne reste plus qu’à récupérer le fichier dans le dossier M:\sys\memory (M: étant ici notre périphérique). Une autre solution consiste à se procurer le même ordinateur (avec la même quantité de mémoire) et de récupérer le fichier physmemmap.txt en s’authentifiant. Nous pouvons maintenant nous en servir comme le montre la capture ci-dessous. Nous obtenons un accès en ligne de commandes avec les privilèges SYSTEM.

PS C:\PCILeech> .\pcileech.exe wx64_pscmd -device fpga -kmd WIN10_X64_3 -memmap physmemmap.txt -v
 
KMD: Code inserted into the kernel - Waiting to receive execution.
KMD: Execution received - continuing ...
 
EXEC: SUCCESS!
 
C:\Windows\system32

Cette attaque est fonctionnelle, mais il y a quelques précautions à prendre. Si la détection d’intrusion physique est activée dans le BIOS (et qu’il y a un mot de passe BIOS, évidemment), au moment de l’ouverture de l’ordinateur le BIOS le détectera, même si ce dernier est éteint. Au redémarrage suivant, l’ordinateur demandera le mot de passe BIOS avant de poursuivre la phase de démarrage, rendant l’attaque impossible. Il faut donc réussir l’attaque du premier coup sans avoir besoin de redémarrer (très improbable), ou alors trouver un moyen de contourner le détecteur d’intrusion physique. Une technique possible consiste à percer un trou près du bouton de détection pour pouvoir le coller, et ainsi l’empêcher de relever l’intrusion.

4.4 Plugin pypykatz

Il est possible d’ajouter à MemProcFS des plugins lui donnant les fonctionnalités de pypykatz [33]. Une fois ces plugins ajoutés, il suffit de monter la RAM comme vu précédemment. Il est maintenant possible d’avoir accès aux hashes des mots de passe utilisateurs contenus dans la SAM, créer des tickets kerberos et autres. Ces informations sont dans le dossier M:\py\regsecrets.

PhotoPypykatz-s

Fig. 4 : Identifiants et hashes de mots de passe récupérés grâce au plugin pypykatz.

5. Se protéger des attaques DMA

Il existe trois moyens de se protéger de cette attaque, en supposant que les paramètres de sécurité soient déjà proches de ceux imposés par un service informatique.

5.1 Détection d’intrusion

La détection d’intrusion dans le châssis est un réglage de sécurité très efficace. Il ralentit énormément la progression de l’attaquant et le pousse à faire un choix difficile. Percer un trou sous l’ordinateur pour coller le bouton de détection d’intrusion, laissant des traces évidentes d’attaque. Ou alors tenter l’attaque sans percer, mais en cas de besoin de rebooter l’ordinateur l’attaquant n’aura pas de seconde chance. Réussir une attaque DMA sans rebooter l’ordinateur victime est presque impossible.

5.2 Niveau de sécurité

Lorsque le niveau de sécurité 3 du Thunderbolt est activé, malgré le patch de la mémoire flash vers le niveau de sécurité 0 ; PCILeech ne fonctionne plus. Cela a certainement un lien avec le fait que le niveau de sécurité 3 désactive le DMA, alors que les niveaux de sécurité précédents le gardent activé et ne font qu’augmenter sa sécurité ; mais les raisons de ce comportement restent indéterminées.

Notez que lorsque VT-dIO, VBS et DMA Guard sont activés, on est « totalement » protégés des attaques sur port M.2. Ici, on réduit surtout le risque des attaques Thunderbolt.

5.3 Bitlocker

Il est également possible de configurer le chiffrement [34][35] du disque dur pour que celui-ci demande un code PIN ou une PKI avant de démarrer, c’est-à-dire ne pas laisser le TPM seul gérer le déchiffrement du disque. Le système n’ayant pas connaissance de la clé de déchiffrement, ce dernier ne pourra finaliser le démarrage sans intervention de l’utilisateur (saisie d’un code PIN ou insertion d’un token physique). Cela suppose que l’ordinateur est éteint, mais s’il est volé allumé ou en veille, il existe une très mince chance de pouvoir réaliser l’attaque sur port Thunderbolt. Par conséquent, il est recommandé d’exiger le code PIN après un trop long temps en veille.

Activer le code PIN de Bitlocker prévient aussi des attaques par TPM Sniffing [38].

Conclusion

Les mécanismes de sécurité implémentés par les fabricants d’ordinateurs ont permis d’amoindrir les risques liés aux attaques DMA. Cependant, une mauvaise implémentation de ces mécanismes reste une source de vulnérabilité. Il reste de nombreuses mesures possibles pour augmenter la sécurité DMA. Par exemple, les fabricants pourraient implémenter un checksum ; il servirait à vérifier l’intégrité de la mémoire du contrôleur Thunderbolt pour détecter une éventuelle compromission de cette dernière.

Remerciements

Merci à l'équipe de pentesters d'Orange Cyberdefense pour leur soutien et conseil.

Merci à Ulf Frisk et Björn Ruytenberg pour leurs recherches et leur aide.

Références

[1] https://en.wikipedia.org/wiki/Direct_memory_access

[2] https://en.wikipedia.org/wiki/DMA_attack

[3] https://en.wikipedia.org/wiki/Input_output_memory_management_unit

[4] https://docs.microsoft.com/en-us/windows/security/information-protection/kernel-dma-protection-for-thunderbolt

[5] https://fr.wikipedia.org/wiki/PCI_Express

[6] https://fr.wikipedia.org/wiki/Thunderbolt_(interface)

[7] https://fr.wikipedia.org/wiki/M.2

[8] https://fr.wikipedia.org/wiki/USB_Type-C

[9] https://thunderbolttechnology.net/security/Thunderbolt_3_and_Security.pdf

[10] https://www.dell.com/support/kbdoc/en-ie/000141328/displayport-over-usb-type-c

[11] https://en.wikipedia.org/wiki/USB_3.0

[12] https://github.com/ufrisk/pcileech

[13] https://twitter.com/ulffrisk

[14] https://github.com/ufrisk/MemProcFS

[15] https://github.com/ufrisk/LeechCore

[16] https://fr.wikipedia.org/wiki/Security_Account_Manager

[17] https://fr.wikipedia.org/wiki/Paire_diff%C3%A9rentielle

[18] http://www.hwtools.net/adapter/usb3380evb.html

[19] https://www.xilinx.com/products/boards-and-kits/ek-a7-ac701-g.html

[20] https://www.ftdichip.com/old2020/Products/ICs/FT600.html

[21] https://github.com/RHSResearchLLC/PicoEVB

[22] https://www.raptor-dma.com/

[23] https://shop.lambdaconcept.com/home/50-screamer-pcie-squirrel.html

[24] https://www.sonnetstore.com/collections/thunderbolt/products/echo-express-se2-thunderbolt3-upgrade-card

[25] https://twitter.com/0xiphorus

[26] https://thunderspy.io/assets/reports/breaking-thunderbolt-security-bjorn-ruytenberg-20200417.pdf

[27] https://thunderspy.io/

[28] https://en.wikipedia.org/wiki/I%C2%B2C

[29] https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface

[30] https://www.winbond.com/hq?__locale=en

[31] https://lab401.com/fr/products/hydrabus?variant=47814885383

[32] http://dangerousprototypes.com/docs/Bus_Pirate

[33] https://github.com/skelsec/pypykatz

[34] https://en.wikipedia.org/wiki/BitLocker

[35] https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-countermeasures

[36] https://patchwork.ozlabs.org/project/ubuntu-kernel/patch/1522240286-26312-19-git-send-email-anthony.wong@canonical.com/

[37] https://patchwork.kernel.org/project/linux-usb/patch/20210126155723.9388-3-mika.westerberg@linux.intel.com/#23928349

[38] https://pulsesecurity.co.nz/articles/TPM-sniffing



Article rédigé par

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous