par Laurent Bloch
Un article précédent de ce site, consacré à la rétroconception de composants électroniques, expliquait comment, en s’équipant d’un microscope électronique à balayage (grossissement de 1x60 000), d’un banc de prise de vue, de produits chimiques pour accéder aux couches successives du circuit, de logiciels d’assemblage et de vectorisation pour établir la cartographie du circuit, et, in fine, de logiciels de vérification des règles architecturales et électriques, qui permettent de traduire les images en liste d’interconnexions (netlist) acceptable par un compilateur VHDL ou VERILOG, il était possible de reconstituer l’architecture et le mode de fonctionnement d’un microprocesseur pas trop complexe.
Attaquer le maillon faible
L’excellent blog de Bruce Schneier signale un article, d’abord publié sur le site de l’université du Massachusetts à Amherst et désormais disponible sur celui de l’université de la Ruhr à Bochum, qui expose une méthode pour effectuer, en quelque sorte, l’opération inverse, modifier subrepticement le fonctionnement d’un microprocesseur aussi complexe que l’on veut : Stealthy Dopant-Level Hardware Trojans : Extended Version, par Georg T. Becker, Francesco Regazzoni, Christof Paar et Wayne P. Burleson. Le type d’attaque proposé est particulièrement dangereux, parce que pratiquement indétectable, et si le matériel est compromis, on ne peut plus se fier à aucun logiciel. Les cibles les plus prometteuses, selon les auteurs, seraient les générateurs de nombres pseudo-aléatoires utilisés par les opérations de calcul cryptographique (désormais incorporées à tous les processeurs modernes) pour réduire l’entropie du tirage et affaiblir le chiffrement ; ainsi, l’utilisateur croirait tirer un nombre au hasard parmi les nombres de 128 chiffres binaires, mais en réalité il tirerait dans un ensemble beaucoup plus petit, par exemple celui des nombres de 56 chiffres binaires ; ce dernier ensemble est suffisamment petit pour qu’un assaillant puisse se livrer à une attaque par force brute. Cette méthode de sabotage permet en outre, comme nous allons le voir, de s’attaquer à un des maillons les plus faibles de la chaîne de fabrication du processeur, ce qui est un autre avantage pour les pirates.
Rétroconception de composants électroniques ;
L’architecture x86 est-elle sûre ?
Étapes de conception d’un microprocesseur
Examinons en effet la suite des opérations préalables à la fabrication d’un microprocesseur, et quels sont les agents qui effectuent chacune, en ayant présentes à l’esprit les caractéristiques d’un processeur moderne : 2 ou 3 cm2, de l’ordre d’un milliard de transistors par cm2, un dessin au pas de 22 nanomètres.
La conception d’un microprocesseur est effectuée par les équipes d’ingénieurs de l’entreprise qui le diffusera sous son nom. Elle consiste à écrire la description du circuit dans un langage spécialisé, par exemple VERILOG ou VHDL (ce dernier est un logiciel libre). La compilation du programme VERILOG ou VHDL produit soit une description du circuit vérifiable par un simulateur (première étape), soit dans un second temps une description plus détaillée acceptable par les machines de fabrication des fonderies de silicium (bon, c’est très résumé, mais le principe est celui-là). Lorsque l’on parle de machines, il s’agit dans les fonderies de silicium essentiellement de steppers (désolé, pas de traduction française en vue), des objets à 22 millions d’euros pièce.
Les laboratoires où travaillent les ingénieurs qui conçoivent les processeurs sont situés le plus souvent en Californie ou en Israël. Dans le cas d’ARM, une entreprise britannique qui conçoit des architectures de processeurs, qui n’en fabrique pas, et qui vend les « plans [1] » à des industriels, une partie de la conception a lieu dans ses laboratoires de Cambridge (UK), et l’assemblage final du « plan », éventuellement avec d’autres composants, a lieu dans les laboratoires du client (Qualcomm, Texas Instruments, STMicroelectronics, Huaweï, Broadcom, Freescale, Samsung, LG, ZTE, etc.). Ces laboratoires sont étroitement surveillés, les ingénieurs sont passionnés et bien payés, introduire une falsification dans la description d’un circuit (la couche HDL, comme Hardware Description Language) risque d’être une entreprise difficile et peu reproductible.
À l’issue du processus de conception, on dispose donc d’un ensemble de données, une maquette au sens typographique du terme (layout), qu’il n’y a plus qu’à introduire dans les machines de fabrication (les steppers), et à appuyer sur le bouton de démarrage. Bon, c’est bien sûr un peu plus compliqué, mais l’idée générale est celle-là. Les perspectives de sabotage lors de l’étape de fabrication proprement dite sont plus prometteuses que lors de l’étape de conception.
Falsification sur la chaîne de fabrication du microprocesseur
Nous voici à l’étape du processus où le producteur de microprocesseurs dispose d’une maquette du processeur qu’il veut proposer à ses clients, sous la forme d’un programme exécutable, issu de la compilation d’un texte écrit dans un langage de de description (HDL), qui va permettre de piloter les machines de fabrication, steppers et autres équipements de photolithographie. L’industriel peut avoir conçu entièrement cette maquette, ou il peut y avoir incorporé des éléments dont la propriété intellectuelle lui a été concédée sous licence par une autre entreprise dont c’est la spécialité, comme ARM. Il faut maintenant fabriquer.
Certains industriels, comme Intel, IBM, Infineon (issu de Siemens), Renesas (qui regroupe les activités micro-électroniques de NEC, d’Hitachi et de Mitsubishi) ou Samsung, possèdent leurs propres usines. D’autres n’en ont jamais eu, tels Qualcomm, Broadcom, Nvidia, ou ont filialisé leur activité de fabrication, comme AMD ou Philips. D’autres encore fabriquent une partie de leur production et confient le reste à des fonderies de silicium, comme GlobalFoundries (issu de la fusion des activités de fabrication d’AMD avec le Singapourien Chartered Semiconductors) ou les Taïwanais TSMC (le leader mondial) et UMC. C’est entre l’envoi de la maquette du circuit à la fonderie et la sortie des pièces de la chaîne de fabrication que se présentent les meilleures occasions pour l’introduction d’une modification malveillante.
Une première piste à laquelle pourrait songer le pirate serait d’ajouter au composant un circuit supplémentaire de son cru, qui détournerait le fonctionnement nominal du composant selon ses plans, ou de modifier une partie du composant. Cela suppose bien sûr des failles de sécurité au cours de la fabrication, dans l’usine. Cette piste semble peu prometteuse, parce que les modifications effectuées seraient détectables, soit par un examen au microscope, soit parce que les composants modernes sont généralement pourvus de circuits d’auto-vérification (Built-In Self-Test, BIST) capables de détecter un comportement non conforme aux spécifications nominales.
Jouer sur le dopage des composants
Le dopage envisagé ici ne concerne pas le sport : comme le dit Wikipédia, « dans le domaine des semi-conducteurs, le dopage est l’action d’ajouter des impuretés en petites quantités à une substance pure afin de modifier ses propriétés de conductivité ».
La méthode proposée et expérimentée par les auteurs de notre article consiste à modifier le comportement d’un composant en modifiant le dopage (c’est-à-dire le taux d’impuretés) du matériau en certains points précis pour établir ou au contraire supprimer des contacts électriques, et ainsi modifier le comportement du circuit. « Les propriétés des semi-conducteurs sont en grande partie régies par la quantité de porteurs de charge qu’ils contiennent. Ces porteurs sont les électrons ou les trous. Le dopage d’un matériau consiste à introduire, dans sa matrice, des atomes d’un autre matériau. Ces atomes vont se substituer à certains atomes initiaux et ainsi introduire davantage d’électrons ou de trous. » (Wikipédia).
Ainsi, le silicium, comme la plupart des matériaux semi-conducteurs, a une valence de 4 (quatre électrons sur la couche la plus extérieure). L’introduction d’atomes de phosphore (valence 5) ajoute des électrons. L’introduction d’atomes de bore (valence 3) ajoute des trous.
Cette méthode innovante présente des avantages décisifs par rapport à celles évoquées ci-dessus : modification frauduleuse de la description du composant, ou insertion frauduleuse d’un circuit parasite, au niveau HDL ; ces deux types de sabotages sont en effet détectables, tant par examen au microscope électronique que par exécution des procédures de test algorithmique.
L’idée centrale de la méthode décrite par nos auteurs est la suivante : une porte logique [2] du schéma original est modifiée en certains points précis par introduction de porteurs de charges différents de ceux du schéma. Ces modifications altèrent le comportement de la porte d’une façon prévisible. Une telle modification est indétectable au microscope électronique, et les deux exemples de réalisation par les auteurs de l’article ont résisté aux procédures de vérification prévues par les industriels.
Exemple 1 : sabotage du générateur de nombres pseudo-aléatoires de l’architecture Ivy Bridge d’Intel
La conception d’un bon générateur de nombres pseudo-aléatoires a toujours été un art difficile et plein de pièges, et l’histoire de l’informatique est pleine d’échecs dans ce domaine. Cette question est particulièrement sensible aujourd’hui, parce que beaucoup de méthodes de chiffrement et de signature électronique reposent sur le générateur de nombres pseudo-aléatoires du système sous-jacent.
Un bon générateur de nombres pseudo-aléatoires, invoqué un grand nombre de fois, doit produire des nombres uniformément répartis sur un intervalle aussi large que possible. Le générateur de nombres pseudo-aléatoires de l’architecture Ivy Bridge d’Intel, dont il est question ici, produit des nombres de 128 chiffres binaires, soit compris entre 0 et 2128- 1, en d’autres termes entre 0 et 34 028 236 692 093 84 634 63 374 607 431 768 211 455 ; la taille de cet intervalle détermine ce que l’on nomme l’entropie du générateur. Moins le nombre est prédictible (plus il s’approche de l’aléatoire idéal), plus l’entropie est élevée (plus la quantité d’information qu’il fournit est grande).
Aussi étrange que cela puisse paraître, un bon générateur de nombres pseudo-aléatoires doit aussi être déterministe, c’est-à-dire que si on lui fournit deux fois de suite la même valeur initiale, il doit produire deux fois de suite la même suite de résultats. C’est pourquoi le fonctionnement d’un tel générateur est généralement initialisé à partir d’une source d’entropie externe, par exemple une valeur calculée à partir des déplacements erratiques de la souris, ou des turbulences engendrées par le système de refroidissement du processeur.
Deviner par force brute un nombre pseudo-aléatoire tiré dans cet intervalle consiste à essayer un par un tous les nombres consécutifs, jusqu’à tomber sur celui que l’on cherche... par hasard. Avec l’intervalle que nous venons de décrire et les processeurs actuels, le temps qui reste à exister au système solaire n’y suffirait pas. Réduire l’entropie d’un générateur est donc intéressant pour un attaquant qui cherche à casser un système de chiffrement.
Le générateur de nombres pseudo-aléatoires de l’architecture Ivy Bridge d’Intel [3] [4] est considéré comme très sûr, il est très bien documenté et doté de procédures de test et de vérification, internes et externes, conformes au meilleur état de l’art. Les procédures de vérification interne (BIST) sont effectuées à chaque démarrage du système.
L’article décrit le procédé par lequel, en modifiant le dopage d’une porte, à une échelle très petite, une variable du calcul est contrainte à une valeur constante, cependant que parmi les 128 chiffres d’une autre variable, n sont maintenus constants, n étant choisi au gré de l’attaquant. Le nombre pseudo-aléatoire obtenu possède toutes les qualités requises par la suite de tests imposées pat le National Institute of Standards (NIST SP800-90), simplement il est choisi dans un intervalle arbitrairement petit, tel que l’attaquant puisse le trouver par force brute. Les auteurs ont veillé à ce que le calcul consomme la même quantité d’énergie électrique que celle utilisée par le circuit non falsifié, ce qui fait obstacle à la surveillance sur les canaux auxiliaires [5] (cf. ci-dessous). Cette falsification est dont très difficile à détecter, les résultats du calcul effectué par le circuit falsifié présentent tous les caractères statistiques désirés et résistent à toutes les procédures de vérification, et l’attaque permet l’accès à la clé secrète de la cible.
Exemple 2. Attaque par canaux auxiliaires : créer (furtivement) le canal
Un algorithme, cryptographique ou autre, se comporte différemment selon la nature des données qui lui sont soumises : le nombre d’instructions exécutées diffère selon que la clé de chiffrement est bonne ou mauvaise, il en résulte que les temps d’exécution ne sont pas les mêmes, non plus que la consommation électrique, ni la chaleur dissipée. Ces phénomènes physiques sont nommés canaux auxiliaires (side-channels en anglais), et leur observation sur un grand nombre de cas peut, dans certains cas, donner accès à un secret, tel qu’une clé de déchiffrement. C’est une attaque par canal auxiliaire.
Pour se prémunir d’une attaque par canal auxiliaire, les auteurs de logiciels de chiffrement et de déchiffrement adaptent leurs algorithmes de sorte qu’ils exhibent le même comportement extérieur quel que soit le calcul effectué, par exemple, s’il s’agit de traiter le signal a, ils traitent toujours a et non a, ainsi le canal auxiliaire montre toujours la même chose, il est donc inutilisable.
Il est donc intéressant pour un attaquant d’ouvrir un canal auxiliaire là où il n’y en a pas. C’est ce qu’ont fait nos auteurs, en s’attaquant à un circuit de chiffrement AES conçu pour résister à de telles attaques, par les subterfuges suivants : toujours effectuer simultanément le calcul pour un signal a et pour son complémentaire non a, réinitialisation des portes logiques à chaque cycle d’horloge, randomisation de certains calculs. Ces méthodes de dissimulation reposent sur une combinaison assez complexe de portes logiques, pour la description de laquelle le lecteur peut se reporter à l’article original Stealthy Dopant-Level Hardware Trojans ?. Nos auteurs, dans le rôle de l’attaquant, ont « simplifié » le circuit en inhibant certaines zones des transistors concernés, toujours en modifiant le dopage de zones sensibles. Ils ont ainsi créé les conditions pour une consommation électrique dépendante des données, et prédictible. Ils ont simulé le circuit saboté, et comparé son comportement à celui du circuit normal. L’analyse du canal auxiliaire montre effectivement qu’il permet de récupérer la clé secrète calculée par le circuit, et qu’en outre le circuit est résistant aux attaques par canal auxiliaire triviales (c’est-à-dire celles des autres).
Ce travail spectaculaire et remarquable place très haut la barre à franchir pour se prémunir d’attaques contre le matériel, attaques qui réduisent à néant toute sécurité du logiciel. Heureusement, Messieurs Georg T. Becker, Francesco Regazzoni, Christof Paar et Wayne P. Burleson se proposent, au cours de leurs travaux à venir, de réfléchir à des moyens de détection de telles attaques. Espérons qu’ils trouveront rapidement !