Attaques matérielles contre les microcontrôleurs utilisant ChipWhisperer et méthodes de protection contre ceux-ci


Les attaques matérielles constituent une grande menace pour tous les appareils équipés de microcontrôleurs (ci-après - MK), car ils peuvent contourner divers mécanismes de sécurité. Il est difficile de se défendre contre de telles attaques à l'aide de logiciels ou de matériel. Par exemple, vous pouvez lire un article de STMicroelectronics sur divers types d'attaques matérielles et sur les méthodes de protection de MK.
Nous, l'équipe de Raccoon Security, nous intéressons à ce sujet, car l'un des domaines d'activité de notre entreprise est le développement de dispositifs embarqués, y compris ceux contenant des mécanismes de protection des informations. Pour la plupart, nous nous intéressons aux attaques glitch, car elles vous permettent de passer les instructions MK exécutables. Il s'agit d'une menace sérieuse pour les informations confidentielles contenues dans MK, et la conséquence la plus dangereuse de telles attaques est la lecture de micrologiciels fermés, contournant les mécanismes de sécurité fournis par les développeurs MK.


Lors de Hardwear.io 2018 à La Haye et EmbeddedWorld 2019 à Nuremberg, NewAE a présenté le dispositif ChipWhisperer, qui permet la mise en œuvre de cette partie des attaques matérielles non invasives qui ne nécessitent pas une connaissance approfondie de la nanoélectronique et la disponibilité d'équipements spécifiques. En utilisant cet appareil, nous avons étudié la sécurité des appareils embarqués et trouvé comment minimiser le résultat de telles attaques. Sous la coupe - ce que nous avons fait.


Chipwhisperer


Le kit ChipWhisperer est une boîte à outils open source pour analyser la sécurité des MK les plus populaires (STM, Xmega, Intel D2000, SAM, LPC, MSP, 78K et autres) et des FPGA. Le projet a démarré le 27 février 2015 sur Kickstarter . Pour le moment, il existe différentes versions de ChipWhisperer (toutes les options se trouvent dans le catalogue ). Ils ont un ensemble d'outils différent, mais sont généralement orientés vers les types d'attaques matérielles suivants:


• attaques par canal latéral (SCA);


• attaques glitch.


Pour une analyse plus approfondie, nous avons choisi ChipWhisperer-Pro (CW1200), qui est le plus ancien modèle ChipWhisperer à l'heure actuelle et qui possède de nombreuses fonctionnalités et un large package:



Kit ChipWhisperer (CW1200)


À bord, le CW1200 dispose d'un oscilloscope, qui se compose d'un amplificateur réglable et d'un ADC avec un échantillon de 105 MSPS. Cet ensemble d'outils vous permet d'enregistrer le niveau du signal en centièmes de millivolt et d'obtenir une bonne base de temps. Dans le CW1200, il y a également des ports pour organiser CLK-glitch et Vcc-glitch, des ports GPIO qui peuvent être attribués comme déclencheurs d'entrée pour suivre l'origine d'un événement (demande d'entrée de mot de passe, état de téléchargement, etc.). Le CW1200 se connecte à un PC via USB et dispose de deux protocoles de communication avec MK: UART et SPI.


Pour travailler avec ChipWhisperer, vous devez installer des pilotes, télécharger des bibliothèques Python et des exemples de travail depuis GitHub, ou télécharger l'image préparée d'une machine virtuelle sous Linux, dans laquelle toutes les bibliothèques et les exemples de travail sont préinstallés. Ces bibliothèques ouvertes contiennent:


• protocole de communication avec ChipWhisperer;


• algorithmes mathématiques pour le traitement des attaques contre les méthodes de chiffrement populaires;


• protocoles de communication avec les chargeurs de démarrage de MK populaires;


• firmware préparé pour la formation sur les cartes avec MK, inclus dans le kit.


Nous avons décidé de parcourir tous les tutoriels sur l'ancien site Web de NewAE. Maintenant, une autre ressource est en cours de développement, où des informations plus pertinentes sont présentées et il existe un forum .


Dans cet article, nous ne présenterons que quelques exemples de guides des développeurs ChipWhisperer et nous les implémentons non pas sur les cartes avec MK incluses dans le package, mais sur le STM32F103RBT6:



Board STM32F103RBT6


Nous avons également écrit du code identique à leurs exemples préparés, mais avec des bibliothèques HAL générées à partir de CubeMX. Toutes ces actions sont nécessaires pour confirmer que les attaques avec ChipWhisperer peuvent être implémentées sur tous les appareils aléatoires, et pas seulement sur les cartes présentes dans le kit.


Ensuite, nous fournissons un bref aperçu et des exemples d'attaques SCA et d'attaques par pépin.


Analyse SCA


La base des attaques SCA est le suivi des changements des facteurs externes de l'état du MC (consommation actuelle du MC, température, champ électromagnétique) au cours du développement de diverses instructions. ChipWhisperer met en œuvre des canaux pour surveiller la puissance à l'aide d'un ADC et un champ électromagnétique à l'aide d'une antenne.


L'analyse SCA est efficace pour détecter les mots de passe, les clés de chiffrement, etc. Le site Web de NewAE présente de nombreux
des lignes directrices utiles pour trouver des clés de chiffrement et pour les attaques SCA , mais nous ne donnerons qu'un seul exemple d'analyse SCA, car les attaques glitch nous intéressent le plus.


Exemples d'attaques SCA - Analyse des signatures de puissance


Ce guide présente un type d'attaque SCA: le suivi de l'entrée de mot de passe caractère par caractère en surveillant les signatures sur le canal d'alimentation. En répétant les signatures de puissance, il est possible d'identifier le développement de diverses instructions de programme à l'intérieur du MK. L'exemple ci-dessus montre le développement de l'entrée de mot de passe MK en suivant la signature de l'opération d' break .


Commençons la préparation. Tout d'abord, vous devez établir des connexions selon la figure:



Connexion MC pour l'analyse SCA


Le diagramme présente les composants qui n'ont pas besoin d'être connectés (contrairement à la connexion MK standard). Les flèches indiquent les points de connexion de ChipWhisperer et les signatures indiquent ses broches.


Préparez le firmware MK. La fonction suivante se trouve dans la boucle principale while while(1) :


 028 void password_check() { 029 char passwd[32]; 030 char correct_passwd[] = "Vulkan"; 031 HAL_Delay(10); 032 uart_send("WARNING: UNAUTHORIZED ACCESS WILL BE PUNISHED\n"); 033 led_off(); 034 035 //Get password 036 uart_send("Please enter password to continue: "); 037 uart_receive(passwd, 32); 038 039 uint8_t passbad = 0; 040 041 led_on(); 042 043 for(uint8_t i = 0; i < sizeof(correct_passwd); i++) 044 { 045 if (correct_passwd[i] != passwd[i]) 046 { 047 passbad = 1; 048 break; 049 } 050 } 051 052 if (passbad) 053 { 054 //Stop them fancy timing attacks 055 int wait = rand() % 100000; 056 for(volatile int i = 0; i < wait; i++) 057 { 058 ; 059 } 060 HAL_Delay(4); 061 uart_send("PASSWORD FAIL\n"); 062 } 063 else 064 { 065 uart_send("Access granted, Welcome!\n"); 066 } 067 while(1) 068 { 069 ; 070 } 071 } 

La ligne 030 définit le mot de passe d'entrée - Vulkan. Ensuite, la LED s'allume
led_on() et un message UART est envoyé à propos de la demande de mot de passe. La fonction led_on() active la broche GPIO du PA12 MK et signale un événement contre lequel ChipWhisperer commencera à accumuler des formes d'onde. C'est à cette broche que CW_TRIG doit être connecté. Tout cela est «synthétisé» pour plus de commodité, mais dans les cas réels, la différence sera insignifiante, car vous pouvez entrer un délai dans le nombre de cycles d'horloge CLOCK par rapport à tout événement auquel CW_TRIG est connecté. Par exemple, cela peut être le début du téléchargement MK, la transmission / réception des messages, la LED allumée, etc.


De plus, MK attend la saisie d'un mot de passe, qu'il vérifiera caractère par caractère. Si un caractère de la file d'attente ne correspond pas, par exemple, trois caractères sont corrects et le quatrième ne l'est pas, vous devez quitter la boucle for avec l'instruction break et signaler le mauvais mot de passe. Aux lignes 055 à 059, un générateur de retard aléatoire est implémenté. Cette conception est le plus souvent utilisée pour compliquer la conduite d'attaques temporaires (c'est-à-dire suivre les changements dans le temps de réponse de l'ensemble du système). Cette conception est incluse pour comprendre que nous n'avons pas sélectionné de mot de passe à l'aide de la méthode d'attaque temporaire.


Le code du didacticiel Jupyter Python est hébergé sur la ressource correspondante. La figure ci-dessous montre un exemple de saisie d'un mot de passe avec la sortie de la forme d'onde d'alimentation du MK avec chaque nouveau symbole correct. Notez qu'avec la saisie de caractères du mot de passe correct (le mot de passe que vous entrez est affiché en haut de la figure), la signature de l'opération de break est déplacée à la ligne 046 (surlignée en orange dans la figure ci-dessous). Il s'agit de la "faiblesse" de l'interruption par l'opération d' break lors de la vérification mot de passe par caractère du mot de passe.



Oscillogrammes de mot de passe


Suite à la familiarisation avec ce guide, nous avons découvert à quel point il est facile de contourner la protection par mot de passe avec cette approche de vérification à l'aide de l'analyse SCA. Il suffit de commenter l'opération d' break de la ligne 048 dans ce firmware et, en général, la vérification du mot de passe sera aussi réussie, mais le suivi du traitement de la signature deviendra plus compliqué. Par conséquent, pour réduire l'efficacité de telles attaques, vous devez éviter l'opération d'interruption immédiate des cycles d'analyse.


La complexité de cette analyse réside dans la recherche des signatures nécessaires. Par conséquent, la conduite de telles attaques peut compliquer considérablement l'introduction de constructions temporaires rand() au moment de la vérification du mot de passe, en ajoutant des calculs supplémentaires ou en ajoutant du bruit à d'autres composants.


Attaques par pépin


Les attaques glitch sont effectuées par une série d'impulsions à court terme à un moment précis dans le temps selon une certaine méthode d'influence. Les méthodes les plus populaires sont: l'horloge (CLK-glitch), l'alimentation (Vcc-glitch) et le champ électromagnétique. Le champ électromagnétique est généré par une étincelle haute tension près du MC. Pour cela, NewAE utilise l'équipement ChipSHOUTER . Nous ne l'avons pas acheté, nous n'avons donc effectué que les attaques CLK-glitch et Vcc-glitch.


Les attaques de glitch sont effectuées en ajoutant une impulsion de tension: pour CLK-glitch - au signal externe CLOCK du MK (à partir d'un quartz externe ou d'un générateur), pour Vcc-glitch - sous tension.


En général, les attaques glitch vous permettent de contourner toute instruction MK, par exemple, en entrant un mot de passe, une demande d'accès, un accord de licence, etc. Les attaques par pépin sont plus complexes, minutieuses et chronophages. De plus, il est nécessaire de répéter à plusieurs reprises l'attaque de glitch, car son succès est de nature probabiliste et dépend des paramètres de l'impulsion. Voici les options de glitch:


• scope.glitch.width - largeur d'impulsion en pourcentage par rapport à CLOCK;


• scope.glitch.offset - décalage d'impulsion en pourcentage par rapport à CLOCK;


• scope.glitch.repeat - le nombre de répétitions d'impulsions d'attaque;


• scope.glitch.ext_offset - le nombre de mesures manquées après le déclenchement de l'événement.


Les mappages de glitch pour CLK-glitch et Vcc-glitch sont présentés dans les chronogrammes:



Diagramme de temps pour CLK-glitch



Diagramme de temps pour Vcc-glitch


Tous les paramètres de l'impulsion de pépin sont sélectionnés de sorte que le noyau MK fonctionne dans un mode instable (en raison duquel les instructions sont ignorées).


Selon les résultats des attaques glitch, il a été révélé que si la valeur du paramètre scope.glitch.repeat est trop petite, le «glissement» des instructions ne se produit pas. Si vous définissez une grande valeur, vous pouvez ignorer non seulement les instructions nécessaires, mais également toutes les instructions suivantes. Dans la plupart des cas, la recherche de scope.glitch.repeat dans la région de 5 à 25 suffit. En ce qui concerne les autres paramètres, tout dépend du type d'attaque et des conditions de connexion.


CLK-glitch


Les attaques de glitch CLK sont effectuées en ajoutant des impulsions de durée plus courte au signal CLOCK MK. Par conséquent, CLOCK doit être déconnecté du MK et alimenté de ChipWhisperer déjà avec une attaque de glitch CLK.


Vous devez d'abord connecter ChipWhisperer à MK:



Schéma de raccordement pour CLK-glitch


Tout le code Python et une description détaillée du manuel sont présentés sur la ressource . Ensuite, dans STM32F103RBT6, «remplissez» le micrologiciel, où la fonction suivante est ajoutée à la while(1) principale while(1) :


 075 void glitch_password(void) 076 { 077 char inp[16]; 078 char c = 'A'; 079 unsigned char cnt = 0; 080 uart_send("Password:"); 081 082 while((c != '\n') & (cnt < 16)) 083 { 084 c = getch(); 085 inp[cnt] = c; 086 cnt++; 087 } 088 089 char passwd[] = "Vulkan"; 090 char passok = 1; 091 092 led_on(); 093 led_off(); 094 095 //Simple test - doesn't check for too-long password! 096 for(cnt = 0; cnt < 5; cnt++) 097 { 098 if (inp[cnt] != passwd[cnt]) 099 { 100 passok = 0; 101 } 102 } 103 if (!passok){ 104 uart_send("Denied\n"); 105 } 106 else 107 { 108 uart_send("Wow! Vulkan win!\n"); 109 } 110 } 

Notre objectif est de contourner l' if à la ligne 103 lors de la saisie du mauvais mot de passe et d'entrer dans le cas else à la ligne 106. La chose la plus importante dans cette attaque est de vérifier la variable passok à la ligne 103. Pour ce faire, sélectionnez le paramètre scope.glitch.ext_offset. Ceci est plus facile à faire en connectant l'oscilloscope à l'UART et en réglant le pépin à l'emplacement de l'interférence, car le pépin s'infiltre à travers l'ensemble du MK:



Emplacement de Glitch


Le code d'attaque et la méthodologie sont extraits de ce manuel (section Boucle d'attaque, blocs 9–10). La seule chose que nous avons modifiée dans le code était d'activer la sortie de tous print(response) messages d' print(response) sans filtrage, car les événements importants sont souvent ignorés en raison de filtres configurés comme:


 if need_response not in response: pass else: print ("!") 

Les figures ci-dessous montrent des exemples d'un journal de sortie de message qui apparaît lorsqu'une attaque CLK-glitch est proche du succès ou est loin d'être réussie. Lorsque vous approchez des paramètres de pépin corrects, des instabilités dans le fonctionnement du MK commencent à apparaître (les messages s'arrêtent, le MK redémarre). Cela peut être un indice lors de la recherche.



Sortie de message lors d'une attaque de pépin avec des paramètres qui sont loin d'être réussis (a) et proches du succès (b)



Le résultat d'une attaque réussie de glitch CLK


À la suite des attaques, il a été révélé que les paramètres de l'impulsion de glitch CLK peuvent «flotter» en fonction de la qualité de la connexion ChipWhisperer au CLOCK MK. Par exemple, lors du réglage de la sonde de l'oscilloscope sur la broche CLOCK, le paramètre scope.glitch.offset est devenu différent pour une attaque réussie, car la sonde a ses propres paramètres capacitifs inductifs qui corrigent le problème de haute fréquence. La connexion via un long câble non blindé peut donc surprendre. Sinon, les attaques CLK-glitch peuvent être qualifiées de stables, comme leurs paramètres ont légèrement changé pour diverses instructions (si, pour, tandis que ont été vérifiés).


La méthode de protection contre de telles attaques consiste à utiliser le signal interne CLOCK MK, mais il présente la pire stabilité de température et de temps. En outre, une méthode efficace peut être d'introduire un délai aléatoire avant et après des instructions importantes (vérification des mots de passe, données personnelles, etc.), ce qui peut compliquer le coup exact de l'impulsion de glitch CLK au bon moment.


Vcc-glitch


Vcc-glitch, comme CLK-glitch, introduit des interférences à haute fréquence dans le fonctionnement du MK, uniquement en court-circuitant l'alimentation du MK à la terre. Lors de la conduite d'attaques Vcc-glitch, il faut tenir compte du fait que les paramètres d'une impulsion réussie dépendent de nombreux facteurs, tels que:


• les caractéristiques de conception de la carte de circuit imprimé pour MK et la présence d'un cerclage diversifié;


• la longueur du câble coaxial pour connecter MK et le port de glitch de ChipWhisperer (plus le câble est long, moins la probabilité d'une attaque réussie, la longueur optimale est de 10-15 cm);


• série MK;


• instructions à sauter;


• Optimisation du compilateur MK;


• type de transistor MOSFET (en raison de la différence dans les composantes haute fréquence des paramètres S).


Par conséquent, lors de la conduite d'attaques, il est nécessaire de s'assurer que ces paramètres ne changent pas.


Vous devez d'abord connecter ChipWhisperer à MK:



Schéma de connexion pour les attaques Vcc-glitch


Ensuite, nous «flasher» le firmware dans MK, où dans la while(1) principale while(1) il y a la fonction suivante:


 115 void glitch_while() 116 { 117 volatile uint8_t infinity = 0; 118 uart_send(" Hello habr!"); 119 led_on(); 120 led_off(); 121 122 while(infinity != 2) 123 { 124 ; 125 } 126 uart_send("WOW!!! Vcc Glitch work!"); 127 while(1) 128 { 129 ; 130 } 131 } 

MK après l'envoi du message "Bonjour habr!" Entre dans une boucle sans fin sur la ligne 122. Notre tâche est de supprimer MK de cette boucle en utilisant Vcc-glitch. Dans cette boucle, la variable volatile uint8_t infinity est utilisée comme condition, qui ne sera jamais égale à deux lorsque le programme volatile uint8_t infinity normalement. Si nous mettons while(1) au lieu de while(infinity != 2) , le compilateur ignorerait le code ci-dessous, y compris notre message annonçant la sortie de la boucle infinie. En raison d'une variable de type volatile compilateur ne pourra pas le faire. La while(1) ligne 127 est ajoutée pour qu'après le WOW !!! Vcc Glitch fonctionne! nous ne sommes pas affichés à nouveau Bonjour habr!


Nous avons utilisé du code Python pour contrôler ChipWhisperer à partir de ce guide . Voici les messages de MK:



Le résultat d'une attaque Vcc-glitch réussie


Comme on peut le voir sur la figure, l'attaque Vcc-glitch a réussi.


La difficulté de mener une attaque Vcc-glitch réside dans la sélection des paramètres d'impulsion corrects. La mise en œuvre de cette attaque a pris le plus de temps par rapport aux autres, car la mise en œuvre réussie des attaques Vcc-glitch dépend des facteurs décrits ci-dessus.


La méthode de protection contre de telles attaques peut également être l'introduction d'un délai aléatoire avant les instructions importantes et après celles-ci (vérification des mots de passe, des données personnelles, etc.). Cela peut compliquer le coup exact de l'impulsion Vcc-glitch au bon moment. Une augmentation du couplage capacitif entre l'alimentation et la masse lors du câblage PCB peut également aider légèrement.


Conclusions


Les attaques menées vous permettent de contourner les instructions en MK. Un exemple d'analyse SCA a montré que même le type le plus simple d'une telle attaque peut menacer la sécurité de vos données (mots de passe, clés de chiffrement). Nous nous sommes assurés que les attaques glitch contournent les différentes instructions et méthodes de protection logicielle prévues dans les appareils. La méthode universelle de protection contre les attaques dans les manuels considérés peut être l'introduction de délais aléatoires lors de l'exécution d'instructions importantes dans le contrôleur de gestion.


Notre étude des attaques matérielles ne s'arrête pas là. À l'avenir, nous prévoyons d'explorer la possibilité de contourner la vérification de l'octet du firmware du firmware MK à l'aide d'attaques Vcc-glitch. L'accès au firmware MK peut ouvrir de grandes opportunités pour un attaquant: du clonage d'un appareil pour la revente à un accès complet à toutes les informations propriétaires et au contrôle de MK.


Dans nos expériences avec Vcc-glitch, nous avons essayé de contourner la protection du firmware, et nous avons réussi. Nous nous sommes assurés que cela soit possible. Nous présenterons des expériences démontrant la lecture du firmware MK caché dans le prochain article.



Raccoon Security est une équipe spéciale d'experts du Centre scientifique et technique Volcano dans le domaine de la sécurité des informations pratiques, de la cryptographie, des circuits, de la rétro-ingénierie et de la création de logiciels de bas niveau.

Source: https://habr.com/ru/post/fr480500/


All Articles