Écrire du code sécurisé sans bug ni vulnérabilité n’est pas suffisant pour protéger un système contre des attaques matérielles. Les circuits sécurisés, ou Secure Elements, sont de vraies forteresses numériques capables de résister à des attaques évoluées, qui requièrent parfois des moyens colossaux. Que se cache-t-il derrière ces petites puces ?
Assurant la sécurité de votre ordinateur au travers du démarrage sécurisé, protégeant l’utilisation de votre carte bancaire en cas de vol, ou permettant l’authentification d’un nœud IoT, les Secure Elements sont présents aujourd’hui dans beaucoup de dispositifs électroniques. On les retrouve même dans des applications insoupçonnées : pour verrouiller les fonctionnalités d’appareils ou de logiciels par un contrôle de licences, limiter la contrefaçon et verrouiller les produits à un fabricant, comme sur les cartouches d’imprimante, ou attester de la production d’énergie d’éoliennes ! Ces circuits n’ont pas seulement vocation à protéger vos données personnelles, elles sécurisent aussi de nombreuses industries. Cet article introduit les différentes méthodes d’attaques physiques, et explique comment les Secure Elements se défendent.
1. La puce microélectronique en bref
Le cœur d’un circuit est un fragment de cristal de silicium, le substrat, de quelques millimètres carrés, sur lequel sont gravés des millions de transistors. Ces transistors sont interconnectés par des pistes métalliques microscopiques pour constituer des portes logiques. D’autres couches d’interconnexion s’y superposent à plus haut niveau pour agréger les portes logiques afin de former des fonctions plus complexes : processeurs, mémoires, coprocesseurs cryptographiques, périphériques d’entrées sorties… sans oublier une partie analogique pour la régulation de l’énergie et la génération de l’horloge CPU.
Ces fragments de silicium sont le plus souvent enrobés dans une résine, et des fils établissent la conduction électrique des pattes extérieures du boîtier, soudées sur la carte électronique, aux entrées et sorties de la puce de silicium. Au final, rien de réellement très sorcier, toute la magie réside en notre capacité à miniaturiser cette technologie, permettant alors de graver de plus en plus de transistors afin de réaliser des circuits toujours plus complexes et performants.
Les circuits ont beau être microscopiques, il ne demeure pas moins possible d’en étudier le fonctionnement, de les décortiquer et même d’aller les chatouiller pendant leur fonctionnement, parfois chirurgicalement, pour en extraire des secrets ou détourner leurs fonctionnalités en immisçant un grain de sable dans leurs micro-rouages.
2. Vulnérabilités physiques
Lorsqu’un circuit protège un secret, un attaquant peut tenter de le compromettre pour en retirer un bénéfice. Les attaques de circuits peuvent aussi bien impacter des utilisateurs (récupération du code PIN de cartes de paiement), des sociétés de service telles que la télévision à péage (contrefaçon de cartes d’accès), mais aussi des industriels (récupération du savoir-faire embarqué pour pillage technologique). Ces quelques exemples non exhaustifs illustrent qu’un piratage de circuit peut avoir des conséquences économiques catastrophiques. Aussi, on imagine que le gain tout aussi grand que ces méfaits peuvent engendrer puisse justifier de la mise en œuvre d’attaques très coûteuses et requérant une forte expertise. Si certaines vulnérabilités s’avèrent complexes et coûteuses à débusquer, une fois identifiées, elles peuvent ensuite être reproduites et exploitées à moindre coût.
De nombreuses techniques d’attaque ont été mises au point au fil du temps. Les constructeurs et les attaquants jouant perpétuellement au chat et à la souris, c’est tout un secteur industriel qui s’est développé pour sécuriser les circuits microélectroniques, comme en témoignent les organismes et schémas de certifications, les laboratoires d’évaluations et toute la recherche mise en œuvre pour continuellement inventer de nouvelles contre-mesures logicielles et matérielles. Les techniques d’attaque physique ne sont plus réservées à quelques élites marginalisées : elles sont bien connues, largement documentées dans la littérature scientifique et académique, et enfin sérieusement prises en compte par les industriels du semi-conducteur. Le coût de certaines attaques a par ailleurs drastiquement baissé ces dernières années, les rendant tout à fait accessibles à des particuliers.
Beaucoup de techniques mises en œuvre pour compromettre les circuits sont des détournements d’outils et méthodes nés du domaine de l’analyse de défaillance. Par exemple, les industriels dans l’avionique et le spatial injectent des fautes dans leurs circuits à l’aide de lasers ou autres sources ionisantes, pour tester leur résistance au rayonnement cosmique. L’édition de circuits microélectroniques, décrite un peu plus loin, est utilisée par les fondeurs pour corriger des défauts de conception ou aider au débogage de circuits prototypes. Les techniques de préparation (décapsulation de boîtiers, polissage, retrait des couches technologiques d’une puce) et d’imagerie (thermique, rayons X, microscopie par balayage électronique) font également partie des méthodes d’inspection pour la recherche des défauts dans les puces [1].
Parmi les attaques physiques, on peut distinguer trois catégories. La première concerne les attaques par canaux auxiliaires, dont le but est l’analyse de propriétés physiques du circuit telles que sa consommation électrique, son rayonnement électromagnétique, son temps de calcul, ou tout autre biais physique mesurable et corrélé à un secret traité que l’attaquant cherche à récupérer. Ces attaques sont dites non invasives, car l'attaquant ne fait qu’observer le circuit pendant son fonctionnement, par exemple en approchant une antenne au plus près de la puce. Lorsque suffisamment de mesures ont été collectées, des outils statistiques permettent de reconstruire les secrets manipulés. En général, ce sont des clés cryptographiques qui sont visées.
Une seconde catégorie concerne des attaques plus invasives, où le circuit subit des altérations physiques. Ce sont les attaques en fautes, dont le principe est l’introduction d’erreurs de calcul lors de l’exécution d’un circuit, dans le but d'altérer son fonctionnement nominal afin d’accéder à des secrets ou autoriser une opération normalement interdite. L’injection de fautes est aux circuits ce que le crochetage est aux serrures. Différentes techniques d’injection existent, chacune ayant ses avantages et ses inconvénients :
- Arrachement : facile à implémenter, cette attaque consiste à couper l’alimentation du circuit pour interrompre son traitement. Par exemple, lorsqu’une écriture en mémoire non volatile est réalisée (mise à jour de fichier), stopper le processus d’écriture en mémoire Flash peut corrompre les données inscrites, provoquer des erreurs lors de la prochaine mise sous tension et rendre le composant vulnérable à une attaque logique.
- Injection de glitchs en tension : un bref instant, la tension d’alimentation du circuit est modifiée pour introduire des erreurs. C’est une des techniques les moins onéreuses, un transistor et un générateur d’impulsions sont suffisants. C’est heureusement aussi très facile à parer [2].
- Injection de glitchs sur l’horloge : modifier un bref instant l’horloge du processeur (overclocking) peut provoquer des erreurs de calcul. Tout aussi facile que les glitchs en tension, et également aisément contré.
- Perturbation électromagnétique : à l’aide d’une antenne placée au plus près de la puce, l’attaquant émet une puissante impulsion électromagnétique qui induit des courants dans les pistes du circuit et modifie transitoirement les valeurs des signaux logiques internes. Cette technique est relativement facile à mettre en œuvre et peu coûteuse, mais elle est en revanche peu chirurgicale, car les dimensions des antennes d’injection sont grandes (de l’ordre du millimètre). Aussi, il y a un risque de « griller » la puce si les impulsions sont trop énergétiques [3].
- Injection de fautes par laser : en éclairant la puce de silicium à l’aide d’un puissant laser focalisé, des courants indésirables sont induits dans les transistors par effet photoélectrique. Cette technique requiert en général une colonne microscopique et une source laser spécialisée. L’ouverture du boîtier du circuit est également nécessaire pour pouvoir accéder à la puce de silicium, c’est une opération délicate et risquée. Technique complexe et onéreuse, l’injection laser a l'avantage d’être très chirurgicale puisqu’elle permet de cibler un faible nombre de transistors, en fonction de la résolution du faisceau laser (de l’ordre du micromètre pour les plus précis). C’est à ce jour la méthode la mieux maîtrisée et qui donne les meilleurs résultats. C’est pourquoi il est impératif pour les circuits sécurisés de s’en protéger [4].
Les effets des fautes peuvent être multiples : corruption de données lues dans les mémoires (instructions et/ou données), basculement de bits dans un registre, erreur arithmétique… Pour injecter une faute, l’attaquant doit étudier le fonctionnement du circuit afin de déterminer à quel instant précis lors de son exécution le programme est vulnérable à une erreur. Si le code programme embarqué est inconnu, l’observation de la consommation électrique du circuit, qui trahit l’activité du processeur, peut permettre d’identifier les moments opportuns. Par exemple, un motif répétitif observé dans la consommation reflète l’exécution d’une boucle.
Une troisième catégorie concerne les attaques très invasives. Après avoir mis à nu la puce de silicium, il est possible d’aller sonder directement des signaux internes du circuit à l’aide de fines aiguilles. L’enregistrement des signaux transitant sur un bus de données permet par exemple de récupérer les secrets manipulés par le processeur. Pour aller encore plus loin, un attaquant peut même modifier le circuit lui-même en ajoutant des pistes ou en supprimant des connexions. Ce travail de microchirurgie se réalise à l’aide d’un FIB (Focused Ion Beam), qui combine l’action d’un faisceau ionique et de gaz pour faire de la gravure sélective de matériaux, ou le dépôt d’isolant et de métal pour créer de nouvelles connexions. Le prix d’un tel équipement avoisine le million d’euros. Les attaquants ne disposant pas en général des plans des puces, un très long travail de préparation, d’imagerie et de rétroconception est nécessaire, plusieurs mois, afin de comprendre en détail le fonctionnement du circuit et identifier quels transistors ou pistes il faut modifier. C’est une tâche colossale à la portée de peu d’acteurs, mais les possibilités sont redoutables.
3. Contre-mesures
Les techniques d’attaque sont nombreuses, mais les concepteurs de circuits ont également mis au point plusieurs dispositifs destinés à renforcer la sécurité et à parer les agressions.
Pour se prémunir des glitchs en tension, la puce surveille son alimentation électrique et réagit en cas de surtension ou sous-tension. Les circuits sécurisés génèrent leur horloge processeur en interne pour éviter toute manipulation malveillante par un attaquant.
3.1 Durcissement logiciel
Contre l’arrachement ou l’injection de faute, le premier bon réflexe est d’écrire du logiciel robuste prenant en compte ces vecteurs. Par exemple, toute écriture en mémoire non volatile doit être vérifiée et complète pour être validée : ces opérations sur les données doivent être atomiques. Contre les attaques par canaux auxiliaires, les opérations cryptographiques doivent être en temps constant et être implémentées avec des méthodes de masquage pour rendre plus difficile la déduction des secrets manipulés. Contre les fautes, il est important de dupliquer les tests sensibles.
Prenons l’exemple suivant d’une routine de vérification de code PIN :
Cette implémentation naïve présente plusieurs faiblesses :
- De toute évidence, la vérification n’est pas effectuée en temps constant. La mesure du temps de réponse peut indiquer le nombre de chiffres corrects saisis par l’utilisateur.
- La décrémentation du compteur d’essais est réalisée après le résultat de la comparaison : un arrachement de l’alimentation du circuit juste avant permet d’éviter de brûler un essai, et une observation de la consommation électrique du circuit peut permettre de déterminer l’issue de la routine verify_pin. Cette implémentation peut donc être brute-forcée par un attaquant.
- Le test sur la valeur du compteur avant la vérification peut être inhibé à l’aide d’une injection de faute, permettant un brute-force.
- La boucle de comparaison peut être fautée pour n’exécuter aucun tour.
- La valeur de retour de la fonction verify_pin peut être corrompue avec une faute : il suffit d’élever à 1 n’importe quel bit du résultat.
Une implémentation plus résistante aux fautes peut ressembler au code suivant :
Cet exemple de code est moins lisible et plus volumineux, mais devrait résister à la plupart des attaques en faute. Aussi, un attaquant expérimenté peut injecter plusieurs erreurs lors d’une même exécution, renforcer le logiciel par des doubles vérifications n’est pas une contre-mesure absolue. À noter, le compilateur peut décider d’optimiser du code lui paraissant redondant et inutile, et par effet de bord supprimer les contre-mesures mises en place. Il faut veiller à ce que cela ne se produise pas, et vérifier le code assembleur généré.
3.2 Protections mémoire
Pour se protéger des fautes, les mémoires RAM et Flash des Secure Elements intègrent des mécanismes de détection d’erreur : un ou plusieurs bits de redondance. Toute erreur de lecture mémoire est signalée à l’OS pour l’avertir de l’attaque. Les mémoires sont aussi chiffrées, et leur structure peut être brouillée de telle sorte qu’il ne soit pas possible de prédire la position physique d’un bit dans le plan mémoire. Ce n’est pas le cas pour les microcontrôleurs classiques, où un attaquant peut physiquement cibler un octet choisi en connaissant son adresse.
3.3 Brouillage du courant électrique
Pour rendre l’analyse de la consommation électrique plus difficile, et entraver les attaques par canaux auxiliaires, un circuit sécurisé peut brouiller les pistes par deux moyens principaux :
- l’ajout de bruit superposé à la consommation électrique (peu séduisant pour des applications faible-énergie)
- l’ajout de bruit dans le temps d’exécution du programme, en variant aléatoirement la fréquence du processeur, et en introduisant des pauses aléatoires au cours de l’exécution (au détriment des performances cette fois-ci).
3.4 Bouclier métallique
Les circuits sécurisés intègrent un bouclier (Shield) sur leur dernier niveau métallique, dont le but est de bloquer l’accès au circuit. L’injection laser par la face avant n’est dès lors plus possible, car les photons sont masqués par ce bouclier avant de pouvoir atteindre les transistors (l’injection par la face arrière reste hélas possible). Surtout, il n’est plus directement envisageable d’aller sonder les signaux internes du circuit à l’aide d’aiguilles.
Ce bouclier est un maillage d’une ou plusieurs pistes de métal couvrant toute la surface de la puce. Si un attaquant tente de le percer, la rupture de ces pistes sera détectée par le circuit lors de sa prochaine mise sous tension, et la puce sera alors définitivement inutilisable. Quelques attaquants sont cependant capables de contourner ces boucliers en rétablissant les connexions coupées à l’aide d’un FIB [5].
3.5 Détecteurs de lumière
Nous avons évoqué l’utilisation de lasers comme moyen pour injecter des fautes. C’est un des outils d’attaque les plus redoutables. Pour se protéger, les circuits sécurisés intègrent de nombreux phototransistors, qui détectent les attaques laser dès qu’ils sont éclairés. Ces détecteurs de lumière, dont la taille est similaire à une porte logique, sont implantés sur toute la surface de la puce pour couvrir et protéger l’intégralité de la logique et des mémoires. Leur haute sensibilité permet de réagir à des flux lumineux très inférieurs à ce qui est nécessaire pour obtenir des fautes. Face à cette contre-mesure, un attaquant doit en général se replier sur un autre moyen d’injection de fautes, probablement moins efficace.
3.6 Réaction aux agressions
La panoplie de capteurs embarqués permet à un circuit sécurisé de détecter une agression. En cas d’attaque, une alarme avertit l’OS, au travers d’une interruption le plus souvent, qui décide ensuite du comportement à adopter pour parer l’attaque.
Dans certains cas, il peut s’agir de faux positifs : glitchs en tension par faux contacts lors de l’insertion d’une carte dans un terminal de paiement, ou arrachement prématuré pendant la signature d’une transaction. Un simple reset est la réaction la plus appropriée.
Dans d’autres cas, et lorsque l’attaque semble sans ambiguïté, l’OS peut adopter des mesures plus fortes, telles que son blocage définitif ou son auto-destruction par effacement complet de sa mémoire (« killchip »). Un compteur de fautes peut éventuellement être présent pour rendre le circuit un peu plus tolérant, mais le but principal est de limiter le nombre de tentatives dont dispose l’attaquant, pour lui faire perdre du temps, des échantillons, et au final le décourager. C’est particulièrement efficace lorsque les échantillons sont limités ou leur acquisition onéreuse.
4. Considérations économiques
Intégrer dans un circuit microélectronique les contre-mesures énumérées est très coûteux. Comme expliqué en introduction, des coûts importants sont engendrés par la R&D, les processus de qualification et de certification, les politiques de brevets sur les contre-mesures, la sécurisation des sites de production pour ces circuits de sécurité sensibles, etc. Mais alors, pour un même fabricant, pourquoi ne pas réutiliser ce savoir-faire et ces technologies dans des microcontrôleurs « classiques » ?
Les détecteurs ainsi que la logique de gestion des alarmes occupent un espace considérable au sein d’une puce, et le coût de fabrication du circuit augmente directement en fonction de sa superficie. Un shield requiert à lui seul un niveau métallique supplémentaire ! Le circuit Infineon SLE78 va jusqu’à doubler son processeur : deux cœurs exécutent le même code sur les mêmes données, et chaque cœur vérifie en permanence l’intégrité de l’autre. Un attaquant devrait sur ce produit être capable d’injecter la même faute sur les deux cœurs, au même instant, ce qui est extrêmement difficile. Si cette contre-mesure renforce considérablement la sécurité de ce circuit, elle en double en revanche le coût.
Toute contre-mesure logicielle a également le même impact sur le coût de fabrication : plus de fonctionnalités requiert davantage de mémoire programme, et augmente alors la taille de la puce. Sur certains segments de marché, il est commercialement préférable de vendre un processeur avec plus de mémoire et sans sécurité renforcée, lorsque le premier souci du client n’est pas de sécuriser son applicatif. Tout est une question de compromis, et les fabricants sont très pragmatiques.
5. Comment développer sur Secure Element ?
Si vous aimez l’aventure et souhaitez développer sur Secure Element, sachez que l’accès à ces circuits est fermé et requiert de signer des accords de confidentialité avec leurs fabricants. Ces derniers n’ouvrent pas leurs portes à moins d’acheter quelques millions de pièces. Il est malheureusement impossible pour un hobbyiste de développer directement sur ces circuits. Les fabricants préfèrent garder secrets les détails de fonctionnement internes de leurs contre-mesures. Si la sécurité par l’obscurité est une pratique discutable et d’un autre temps, il est vrai qu’une personne malveillante aura plus de difficulté à pirater un circuit en approche boîte noire.
Certains Secure Elements embarquent une machine virtuelle Java Card, qui permet d'installer et exécuter des applets dont le développement ne nécessite pas de connaître le fonctionnement interne de la puce. La gestion de la sécurité est gérée par le système d’exploitation de la carte, et l’API Java Card standardisée implémente des mécanismes de bases sécurisés, tels que la gestion de compteurs d’essais pour codes PIN, l’écriture atomique de données, ou encore des fonctions cryptographiques résistantes aux attaques par canaux auxiliaires. Certains de ces circuits peuvent être achetés librement à l’unité, sous forme de carte à puce (par exemple les cartes SmartCafe).
Conclusion
Les attaques et contre-mesures présentées dans cet article ne sont pas exhaustives ! De nouvelles attaques émergent, et il en va de même pour les contre-mesures.
Chaque contre-mesure, logicielle ou matérielle, n’est pas suffisante seule, et c’est la multiplicité des protections qui permet d’obtenir une bonne résistance face aux attaquants. Les Secure Elements en embarquent de nombreuses et sont de très loin beaucoup plus résistants aux attaques physiques que les microcontrôleurs. Dès lors qu’un accès physique est possible, on ne saurait prétendre qu’un système sans Secure Element puisse réellement protéger de façon sûre un secret. Il n’existe pas de circuit inviolable, mais attaquer un Secure Element requiert des moyens très importants, beaucoup d’expérience et de travail.
Références
[1] « Se protéger de la rétro-ingénierie matérielle », Hackable n°33, page 68 :
https://connect.ed-diamond.com/Hackable/HK-033/Se-proteger-de-la-retro-ingenierie-materielle
[2] C. O’Flynn, « Fault Injection using Crowbars on Embedded Systems », IACR Cryptology ePrint Archive, 2016.
[3] C. O’Flynn, « Electromagnetic Fault Injection », Circuit Cellar,
https://circuitcellar.com/research-design-hub/electromagnetic-fault-injection/.
[4] S. Skorobogatov, « Optical Fault Induction Attacks », Springer, 2003.
[5] J. Walker, « IC Surgery: getting to the heart of the problem with the smallest scalpel », hardwear.io 2019,
https://media.hardwear.io/integrated-circuit-surgery-getting-to-the-heart-of-the-problem-with-the-smallest-scalpel/