FR 3065553 A1 20181026 FR 1753434 A 20170420 1 Procédé d'exécution d'un programme destiné à être interprété par une machine virtuelle protégé contre des attaques par injection de faute DOMAINE DE L'INVENTION La présente invention concerne un procédé d'exécution d'un programme destiné à être interprété par une machine virtuelle. La présente application trouve avantageusement application dans des dispositifs électroniques tels que des cartes à puce. ETAT DE LA TECHNIQUE De façon connue, une attaque par injection de faute consiste à perturber l'environnement physique d'un dispositif électronique, de sorte à modifier des données mémorisées par le dispositif. De telles perturbations peuvent être produites de différentes manières : variation d'une tension d'alimentation, variation d'une fréquence d'horloge du dispositif, émission de rayonnement électromagnétique ou laser, etc. Ces données peuvent par exemple être des instructions de code d'un programme destiné à être exécuté par un processeur d'un tel dispositif électronique. Dans ce cas, l'injection de faute revient à injecter du code malicieux. Certains programmes sont plus particulièrement destinés à être interprétés par une machine virtuelle, qui est elle-même un programme exécuté par un processeur. Le processeur est apte à interpréter du code machine. De façon connue, une machine virtuelle a pour fonction d'interpréter à l'aide de code machine des instructions de code de plus haut niveau. On connaît du document US 20110258397 un procédé permettant de protéger des objets manipulés par une machine virtuelle contre des attaques par injection de faute. Toutefois, ce procédé ne permet pas d'empêcher l'interprétation par une machine virtuelle de code malicieux. Le document US 8,893,275 décrit par ailleurs un procédé dans lequel il est vérifié que des instructions de code peuvent être interprétées ou non en du code machine par une machine virtuelle. Pour cela, il est proposé de faire appel, dans un programme destiné à être interprété par une machine virtuelle, à des instructions spéciales comprenant des sécurités additionnelles. Par exemple, au lieu de faire appel à l'instruction invokespecial définie dans la norme Java Card, on fait appel en vertu de ce principe à une instruction 3065553 2 invokespecial bis qui met en oeuvre des tests de sécurité. Ce procédé a cependant pour inconvénient majeur de devoir modifier en profondeur le format des instructions de code du programme. 5 RESUME DE L'INVENTION Un but de l'invention est d'éviter qu'une machine virtuelle n'interprète du code malicieux, sans pour autant devoir modifier le format des instructions de code de programmes destinés à être interprétés par une telle machine virtuelle. Il est ainsi proposé, selon un premier aspect de l'invention, un procédé d'exécution 10 d'un programme destiné à être interprété par une machine virtuelle, le procédé comprenant des étapes de : - détermination d'une instruction de code de référence à interpréter au cours de l'exécution du programme, - lecture de données de droits d'interprétation indiquant une portion du programme 15 contenant des instructions de code interprétables par la machine virtuelle, - sur la base des données lues, contrôle de présence de l'instruction de code de référence dans la portion du programme, - interprétation, par la machine virtuelle, de l'instruction de code de référence à l'aide de code machine, seulement si l'instruction de code de référence est contenue dans 20 la portion du programme. Le procédé selon le premier aspect de l'invention peut en outre comprendre les caractéristiques suivantes prises seules ou en combinaison lorsque cela est techniquement possible. Dans un mode de réalisation, le contrôle de présence est mis en oeuvre pour chaque 25 instruction de code de référence déterminée comme étant à interpréter au cours de l'exécution du programme. Ceci a pour effet d'assurer un très haut niveau de sécurité. Dans un autre mode de réalisation, le procédé comprend la vérification d'au moins une condition susceptible d'être remplie ou non par l'instruction de code de référence ; le contrôle de présence est alors mis en oeuvre seulement si la condition est remplie. Ceci 30 permet de réduire la consommation additionnelle de ressources matérielles par la mise en oeuvre des étapes du procédé comparativement au mode de réalisation précédent. La condition peut notamment être remplie lorsque : 3065553 3 - l'instruction de code de référence est une instruction de saut depuis un premier bloc de base de programme vers un autre bloc de base de programme, telle qu'une instruction de branchement, une instruction d'invocation de méthode, ou une instruction de retour de méthode, ou 5 - l'instruction de code de référence est une instruction d'écriture dans une mémoire non volatile, ou - le programme étant exécuté dans un dispositif électronique, l'instruction de code de référence participe à une communication de données entre le dispositif électronique et un autre dispositif. 10 Ces types d'instruction de code sont particulièrement critiques en termes de sécurité. Il est donc particulièrement judicieux de limiter la mise en oeuvre du contrôle de présence à de telles instructions de code. L'étape de contrôle de présence peut être mise en oeuvre ou non en fonction d'un résultat d'un tirage aléatoire. Ceci permet de rendre imprévisible ce contrôle de présence ; 15 un attaquant a donc alors plus de difficultés à comprendre et contourner les mesures de sécurité procurées par le procédé selon le premier aspect de l'invention. Le procédé selon le premier aspect peut en outre comprendre des étapes de : - lecture, dans les données de droits d'interprétation, de données de localisation adaptées pour localiser la portion du programme, 20 - lecture, dans les données de droits d'interprétation, d'une donnée d'intégrité relative aux données de localisation, - contrôle d'intégrité des données de localisation sur la base de la donnée d'intégrité, l'instruction de code de référence étant interprétée seulement s'il est déterminé au cours du contrôle d'intégrité que les données de localisation sont intègres. 25 Ces étapes permettent de détecter une éventuelle corruption par un attaquant des données de droits d'interprétation elles-mêmes en vue de contourner les mesures de sécurité procurées par le procédé. Les données de droits d'interprétation peuvent faire partie intégrante du programme et peuvent comprendre des données de localisation adaptées pour localiser la portion du 30 programme au sein du programme. De la sorte, ces données de droits d'interprétation sont directement utilisables depuis plusieurs plateformes d'installation du programme. Le procédé peut comprendre un signalement d'une erreur lorsque l'instruction de code de référence n'est pas dans la portion du programme. 3065553 4 L'étape de contrôle de présence peut être mise en oeuvre par la machine virtuelle, la machine virtuelle étant elle-même exécutée par au moins un processeur. Alternativement, l'étape de contrôle de présence est mise en oeuvre par un circuit différent de ce processeur (ou chacun de ces processeurs lorsqu'il y en a plusieurs). Ainsi, une partie de la charge de 5 travail additionnelle requise par le procédé selon le premier aspect est déléguée à ce circuit ; par conséquent, le ou chaque processeur peut exécuter la machine virtuelle sans être ralenti de façon importante. Il est également proposé, selon un deuxième aspect de l'invention, une machine 10 virtuelle comprenant des instructions de code de programme pour l'exécution des étapes du procédé selon le premier aspect de l'invention, lorsque ce procédé est exécuté par au moins un processeur. Il est également proposé, selon un troisième aspect de l'invention, un dispositif électronique, tel qu'une carte à puce, comprenant : 15 - au moins un processeur configure pour exécuter une machine virtuelle selon le deuxième aspect de l'invention, - au moins un programme destiné à être interprété par la machine virtuelle. Il est également proposé, selon un quatrième aspect de l'invention, un procédé d'installation d'un programme destiné à être interprété par une machine virtuelle dans une 20 mémoire non volatile, le procédé comprenant des étapes de : - décomposition du programme en une première portion comprenant des instructions de code interprétable par la machine virtuelle et une portion restante, - lecture de données de droits d'interprétation indiquant à la machine virtuelle que seules des instructions de code contenues dans une zone prédéterminée de la 25 mémoire non volatile sont autorisées à être interprétées à l'aide de code machine par la machine virtuelle, - mémorisation de la première portion de programme dans la zone prédéterminée de la mémoire non volatile, - mémorisation de la portion restante du programme dans une zone différente de la 30 zone prédéterminée. Si une portion d'un autre programme contenant des instructions de code interprétables par la machine virtuelle, dite troisième portion de programme, est déjà présente dans la mémoire non volatile, alors la première portion de programme peut être mémorisée de 3065553 5 manière adjacente à la troisième portion de programme. Ceci permet de réduire la fragmentation de la mémoire non volatile. Il est également proposé, selon un cinquième aspect de l'invention, un installeur comprenant des instructions de code de programme pour l'exécution des étapes du procédé 5 selon le quatrième aspect de l'invention, lorsque ce procédé est exécuté par au moins un processeur. Il est également proposé, selon un sixième aspect de l'invention, un procédé de génération d'un programme destiné à être interprété par une machine virtuelle, comprenant des étapes de 10 - génération d'une portion de programme contenant des instructions de code interprétables par la machine virtuelle, - génération de données de droits d'interprétation configurées pour indiquer à la machine virtuelle que seules les instructions de code contenues dans la portion de programme sont autorisées à être interprétées par la machine virtuelle à l'aide de 15 code machine pour exécuter le programme. Il est également proposé, selon un septième aspect de l'invention, un produit programme d'ordinateur destiné à être interprété par une machine virtuelle, comprenant : - une portion de programme contenant des instructions de code interprétables par la machine virtuelle, 20 - des données de droits d'interprétation configurées pour indiquer à la machine virtuelle que seules les instructions de code contenues dans la portion du programme sont autorisées à être interprétées par la machine virtuelle à l'aide de code machine pour exécuter le programme. Les données de droits d'interprétation du programme selon le septième aspect de 25 l'invention peuvent comprendre des données de localisation adaptées pour localiser la portion du programme au sein du programme, et une donnée d'intégrité relative aux données de localisation de la portion de programme. En particulier, le produit programme d'ordinateur selon le septième aspect de l'invention peut être une applet Java Card. Dans ce cas, la portion du programme indiquée 30 dans les données de droits d'interprétation peut être un composant de l'applet de type - method_component ». En outre, les données de droits d'interprétation utilisées dans l'un ou l'autre des différents aspects de l'invention peut comprendre des données de localisation adaptées pour 3065553 6 localiser la portion du programme au sein du programme, et les données de localisation de la portion comprendre une adresse de début de la portion de programme et/ou une adresse de fin de la portion de programme. 5 DESCRIPTION DES FIGURES ANNEXEES D'autres caractéristiques, buts et avantages de l'invention ressortiront de la description qui suit, qui est purement illustrative et non limitative, et qui doit être lue en regard des dessins annexés sur lesquels : - La figure 1 représente schématiquement un dispositif électronique selon un mode de 10 réalisation de l'invention. - La figure 2, représente schématiquement une mémoire du dispositif schématiquement représenté en figure 1 contenant plusieurs programmes. - La figure 3 est un organigramme d'étapes du procédé d'exécution d'un programme selon un mode de réalisation de l'invention. 15 - Les figures 4, 5 et 6 représentent le contenu d'une mémoire du dispositif à des instants différents, au cours de la mise en oeuvre d'un procédé d'installation d'un programme dans cette mémoire. Sur l'ensemble des figures, les éléments similaires portent des références identiques. 20 DESCRIPTION DETAILLEE DE L'INVENTION Dispositif électronique protégé contre des attaques par injection de faute En référence à la figure 1, un dispositif électronique 1 comprend au moins un processeur 2 et au moins une mémoire 4. Le ou chaque processeur 2 est adapté pour interpréter directement des instructions de 25 code de programme appartenant à un jeu d'instructions de code prédéterminées. La mémoire 4 comprend au moins une mémoire volatile 6, par exemple de type RAM. La mémoire volatile 6 a pour fonction de mémoriser temporairement des données, par exemple des données calculées par le processeur 2. Le contenu de la mémoire volatile 6 est effacé lors d'une mise hors tension du dispositif électronique I. 30 La mémoire 4 comprend en outre au moins une mémoire non volatile 8 (NVM en anglais), par exemple de type disque dur, SSD, flash, EEPROM, etc. La mémoire non volatile 8 a pour fonction de mémoriser des données de manière persistante, au sens où une mise hors tension du dispositif électronique 1 n'efface pas le contenu de la mémoire non volatile 8. 3065553 7 Le dispositif électronique 1 comprend par ailleurs une interface de communication 10 avec un dispositif tiers, extérieur au dispositif électronique 1. Cette interface de communication 10 peut comprendre un circuit de communication sans fil, par exemple une puce NEC, de sorte à établir un canal de communication radio entre le dispositif électronique 5 et le dispositif tiers, et/ou comprendre au moins un port destiné à être mis en contact physique avec au moins un port du dispositif tiers, de sorte que des signaux électriques porteurs de données puissent être transférés entre les ports mis en contact physique. Le dispositif électronique peut également comprendre un circuit de contrôle 12 distinct du processeur, et dont la fonction sera décrite plus loin. 10 Le dispositif électronique 1 est par exemple une carte à puce, telle qu'une carte SIM. Le dispositif tiers peut être par exemple un terminal utilisateur, tel qu'un smartphone. En référence à la figure 2, est mémorisée dans la mémoire non volatile 8 une machine virtuelle M. La machine virtuelle M est un programme codé à l'aide de code machine, et donc 15 susceptible d'être exécuté par au moins un processeur 2. La machine virtuelle M a comme fonction d'interpréter à l'aide de code machine des instructions de code de haut niveau appartenant à un jeu d'instructions différent du jeu d'instructions de code machine. Dans la suite du présent document, le terme - instruction de code » désigne 20 implicitement une instruction de code de haut niveau destinée à être interprétée par la machine virtuelle M, tandis que - code machine » désigne une ou plusieurs instructions de code directement interprétables par le ou chaque processeur. On verra dans la suite que la mémoire non volatile 8 est également apte à mémoriser au moins un programme P, dit programme cible P, destiné à être interprété par la machine 25 virtuelle M. Dans la suite, on prendra l'exemple non limitatif d'une machine virtuelle M Java Card. Elle est alors configurée pour interpréter du - bytecode » d'une applet ayant été préalablement générée à partir d'un code source dans le langage de programmation Java, qui est un langage de programmation orienté objet. 30 Est par ailleurs mémorisé dans la mémoire non volatile 8 un installeur IN de programmes interprétables par la machine virtuelle M. L'installeur IN est lui-même un programme susceptible d'être exécuté par au moins un processeur 2. 3065553 8 Génération d'un programme cible P destiné à être interprété par une machine virtuelle M Un programme cible P destiné à être interprété par la machine virtuelle M peut être 5 généré à partir de code source au moyen des étapes suivantes. Le code source est écrit dans le langage de programmation Java, qui est un langage de programmation orienté objet. Le code source comprend au moins un fichier source suffixé en - .java ». Un compilateur Java connu en lui-même génère sur la base de chaque fichier source un 10 fichier de classe correspondant, suffixé en - .class ». Un convertisseur également connu en lui-même génère sur la base des fichiers de classes au moins une applet P interprétable par la machine virtuelle M. L'applet P comprend un fichier d'applet suffixé en - .cap » (ce suffixe signifiant - converted applet ») dont le contenu est conforme à au chapitre 6 de la spécification - Java 15 Card 2.1.1 Virtual Machine Specification ». Est généré par le convertisseur dans le fichier d'applet une première portion P1 de programme comprenant des instructions de code interprétables par la machine virtuelle M. La première portion P1 de programme est typiquement contenue dans une structure method component détaillée dans la partie 6.9 de ladite spécification. La première portion 20 P1 de programme peut être cette structure ou bien la table methods [ ] contenue dans cette structure. La première portion P1 comprend au moins un ensemble d'instructions de codes définissant une méthode du programme, typiquement plusieurs ensembles d'instructions de code définissant des méthode respectives du programme. 25 Une méthode peut elle-même comprendre un ou plusieurs blocs de base (- basic block » en anglais). Un bloc de base est constitué d'une suite d'instructions de codes d'un seul tenant, destinées à être exécutées consécutivement. Par ailleurs, le convertisseur génère dans le fichier d'applet au moins une deuxième portion de programme P2 ne comprenant pas d'instruction de code interprétable par la 30 machine virtuelle M, mais d'autres types de données, par exemple des constantes destinées à être lues la machine virtuelle M au cours de l'exécution de l'applet. De façon non conventionnelle, le convertisseur génère par ailleurs des données de droits d'interprétation DR. Ces données de droits d'interprétation sont configurées pour indiquer à 3065553 9 la machine virtuelle M que seules des instructions de code contenues dans la première portion P1 de programme sont autorisées à être interprétées par la machine virtuelle M à l'aide de code machine pour exécuter le programme. Les données de droits d'interprétation comprennent des données de localisation 5 adaptées pour localiser la première portion P1 au sein du programme. Ces données de localisation comprennent par exemple une adresse de début de la première portion P1 du programme, ainsi qu'une adresse de fin de la première portion P1 du programme (cette adresse de fin pouvant être remplacée par une taille de la première portion P1 du programme). 10 L'adresse de fin peut être l'adresse de la dernière instruction de code se trouvant dans la première portion P1 du programme ou bien être l'adresse qui suit immédiatement l'adresse de cette dernière instruction de code. Dans la suite, on supposera que l'adresse de fin est l'adresse de la dernière instruction de code se trouvant dans la première portion Pl. Les adresses de début et de fin peuvent être des adresses relatives à une adresse de 15 référence du programme. Autrement dit, elles sont représentatives d'un écart entre cette adresse de référence et le début ou la fin de la première portion P1 au sein du programme. Alternativement, les adresses de début et de fin peuvent être des adresses absolues dans la mémoire non volatile 8. Les données de droits d'interprétation DR comprennent par ailleurs une donnée 20 d'intégrité relative aux données de localisation. Pour générer cette donnée d'intégrité, le convertisseur applique une fonction d'intégrité F prédéterminée aux données de localisation, telle qu'une fonction de hachage, une fonction générant un code de redondance longitudinal (- longitudinal redundancy check » ou LRC en anglais), une fonction générant un code de redondance cyclique (- cyclic 25 redundancy check » ou CRC en anglais), etc. Les données de droits d'interprétation DR sont mémorisées au sein du programme P à un emplacement localisable par l'installeur IN ou à la machine virtuelle M. Les données de droits d'interprétation DR sont par exemple incluses dans un fichier d'applet et comprennent un identifiant propre à ces données permettant à la machine 30 virtuelle M ou l'installeur IN de distinguer ces données de droits d'interprétation des autres données contenu dans le fichier d'applet. En variante, les données de droits d'interprétation sont mémorisées dans un fichier dédié. 3065553 10 La génération du programme cible P est typiquement mis en oeuvre par un dispositif différent du dispositif électronique, par exemple un ordinateur de bureau ou un serveur. Le tableau 1 ci-dessus illustre un exemple de méthode d'un programme cible P. Code source Java Mnémonique Byte code Static short foo ( LO: sload 0 // 0m8000: 1C short x ) m-Localvar #0 0m8001: 61 05 { ifne Li 0m8003: 11 64 if( m==0 ) sspush 100 0m8005: 78 return 100; sreturn 0m8006: 1C else Li: sload 0 0m8007: 04 return foo( K-1 ) + sconst 1 0m8008: 43 20; ssub 0m8009: 8B 80 00 } invokevirtual 0m800C: 11 14 sspush 20 0m800E: 41 sadd sreturn 0m800F: 78 5 Tableau 1 - Exemple de méthode Java La colonne de gauche du tableau 1 montre le code source d'une méthode foo en langage Java. Les instructions de code correspondantes générées par le compilateur et le convertisseur que l'on retrouve dans un fichier d'applet sont représentées (en hexadécimal) 10 avec leurs adresses respectives dans la colonne de droite du tableau 1. Chaque instruction de code Java Card est appelée - opcode » dont la valeur et la taille en nombre de bits sont spécifiées dans la spécification Java Card susmentionnée. La colonne du milieu du tableau 1 montre les mnémoniques correspondant à ces instructions de code. Par exemple, la première instruction de code définissant la méthode foo a un opcode 15 de valeur hexadécimale égale à 1C (dans cet exemple, cette instruction se trouvant à l'adresse absolue 0x8000). Cet opcode est appelé - sload 0 » et charge, lors de son interprétation par la machine virtuelle M, le contenu d'une première variable locale au sommet d'une pile d'exécution gérée par la machine virtuelle M (dans cet exemple, cette variable est le paramètre x de la méthode foo). 3065553 11 Dans la suite on supposera de manière fictive et par souci de simplicité que la première portion P1 du programme ne contient que les instructions de code de la méthode foo. Les données de droits d'interprétation comprennent donc une adresse de début égale à 0x8000, une adresse de fin égale à Ox800F (adresse de la dernière instruction de code sreturn ayant 5 pour valeur hexadécimale 78). Installation d'un programme cible P destiné à être interprété par une machine virtuelle M dans une mémoire d'un dispositif électronique Le dispositif 1 reçoit, via son interface de communication 10, le programme cible P 10 destiné à être installé. Le programme cible P est par exemple téléchargé depuis un serveur d'applications par le dispositif tiers et transféré au dispositif électronique 1 via cette interface de communication 10. Le programme cible P est mémorisé de façon temporaire dans la mémoire volatile 6 du dispositif électronique 1. 15 Le programme est ensuite mémorisé dans la mémoire non volatile 8 du dispositif électronique 1 de manière conventionnelle. Le programme cible P est alors prêt à être exécuté dans le dispositif électronique 1. Les données de droits d'interprétation peuvent être générées par l'installeur IN et non le compilateur ou le convertisseur. Pour cela, l'installeur IN utilise sa connaissance du format 20 .cap pour détecter au sein du programme reçu via l'interface de communication la première portion P1 de programme (le composant method component). L'installeur IN détermine l'adresse de début et l'adresse de fin de cette première portion P1 et calcule le cas échéant la donnée d'intégrité relative à ces adresses. 25 Exécution de programme cible au moyen de la machine virtuelle Le processeur 2 démarre l'exécution de la machine virtuelle M, par exemple lors d'une mise sous tension du dispositif électronique I. Ultérieurement, la machine virtuelle M reçoit un ordre de lancement du programme cible P (étape 100). Dans le présent texte, on considère que l'exécution du programme cible 30 P débute lorsqu'un ordre d'exécution de ce programme est reçu au sein du dispositif électronique I. 3065553 12 La machine virtuelle M ouvre un fichier d'applet du programme cible P et y localiser la première portion P1 de programme contenant les instructions de code du programme à interpréter. La machine virtuelle M dispose d'un pointeur de code (- Program Counter » en anglais, 5 ou PC) qui va indexer le bytecode et d'une pile (- stack » en anglais). Cette pile est adressée au travers d'un pointeur de pile (- Stack Pointer » en anglais ou SP). Pour exécuter une méthode, la machine virtuelle M alloue une zone de la mémoire volatile 6 réservée à la méthode, cette zone étant appelée trame (- frame » en anglais). La trame à une taille correspondant au nombre de mots utiles au stockage d'informations de 10 contexte, des arguments de la méthode et ainsi que le nombre d'emplacement de la pile nécessaire à l'exécution de toutes les instructions de code (opcodes) faisant partie de la méthode. Ensuite, pour chaque opcode de la méthode, la machine virtuelle M dépile les éléments nécessaires à l'exécution de cet opcode en s'appuyant sur ses arguments et empiler le 15 résultat correspondant dans la pile. La machine virtuelle M met ensuite à jour le PC, avant de passer à l'interprétation de l'instruction suivante. Au cours de l'exécution du programme cible P, la machine virtuelle M détermine une instruction de code de référence à interpréter à l'aide de code machine (étape 102). Cette détermination 102 comprend une lecture d'une adresse dans le pointeur de code 20 PC : à cette adresse se trouve l'instruction de code de référence à interpréter. La machine virtuelle M localise par ailleurs les données de droits d'interprétation DR du programme cible Pet lit leur contenu (étape 106). La machine virtuelle M lit en particulier les données de localisation. Sur la base des données de droits d'interprétation DR lues, la machine virtuelle M 25 contrôle la présence ou non de l'instruction de code de référence dans la première portion P1 du programme cible P (étape 110). Le contrôle de présence comprend d'une part une comparaison entre le pointeur de code (c'est-à-dire l'adresse de l'instruction de code de référence se trouvant dans le pointeur de code) et l'adresse de début lue dans les données de localisation. Le contrôle de 30 présence comprend d'autre part une comparaison entre le pointeur de code et l'adresse de fin lue dans les données de localisation. L'instruction de code est présente dans la première portion P1 du programme cible P lorsque : 3065553 13 - l'adresse de l'instruction de code de référence est supérieure ou égale à l'adresse de début, et - l'adresse de l'instruction de code de référence est inférieure ou égale à l'adresse de fin (ou strictement inférieure à l'adresse de fin dans le cas où l'adresse de fin est 5 l'adresse qui suit immédiatement l'adresse de la dernière instruction de code de la première portion P1). Dans un premier cas, il est déterminé au cours du contrôle de présence que l'instruction de code de référence n'est pas présente dans la première portion P1 du programme. Dans ce premier cas, l'instruction de code de référence n'est pas interprétée par la machine virtuelle 10 M à l'aide de code machine ; la machine virtuelle M signale plutôt une erreur (étape 114). Ce signalement comprend typiquement la levée d'une exception de sécurité par la machine virtuelle M. Par ailleurs, dans ce premier cas, la machine virtuelle M stoppe préférentiellement l'exécution du programme. 15 Dans un deuxième cas, il est déterminé au cours du contrôle de présence 110 que l'instruction de code est bien présente dans la première portion P1 du programme. Dans ce deuxième cas, l'instruction de code de référence est interprétée par la machine virtuelle M à l'aide de code machine (étape 112). Cette étape 112 d'interprétation est connue de l'homme du métier. Pour une instruction de code lue dans un fichier d'applet, une ou 20 plusieurs instructions de code machine correspondantes sont exécutées par le processeur 2. Toujours dans le deuxième cas, la machine virtuelle M met ensuite à jour le pointeur de code PC et détermine une instruction de code suivante à exécuter, en répétant l'étape 102. L'étape de contrôle de présence 110 peut être pour plusieurs instructions de code 25 déterminées comme étant à interpréter au cours de l'exécution du programme par la machine virtuelle M. La manière dont cette étape de contrôle de présence 110 est répétée peut faire l'objet de plusieurs variantes. Dans une première variante, l'étape 110 de contrôle de présence est répétée pour chaque instruction de code déterminée comme étant à interpréter au cours d'une mise en 30 oeuvre de l'étape 102, c'est-à-dire sur la base de chaque nouvelle adresse chargée dans le pointeur de code au cours de cette exécution. La méthode foc détaillée dans le tableau 1 est interprétée de la manière suivante par la machine virtuelle M dans cette première variante (les lignes en gras sont les traitements 3065553 14 non conventionnels mis en oeuvre par la machine virtuelle M, tandis que les autres lignes sont des traitements classiques) : 1. La machine virtuelle M crée une trame pour la méthode foc. 2. La machine virtuelle M charge l'adresse 0x8000 dans le pc. 5 3. La machine virtuelle M vérifie que le PC est compris entre 0x8000 et Ox800F ; si oui, elle poursuit l'interprétation ; sinon, la machine virtuelle M lève une exception de sécurité 4. La machine virtuelle M exécute l'opcode sload 0 qui charge le contenu de la première variable locale au sommet de la pile, ici il s'agit du paramètre X de la 10 méthode foc. 5. La machine virtuelle M incrémente le PC de 1, lequel prend alors la valeur 0x8001. 6. La machine virtuelle M vérifie que le PC est compris entre 0x8000 et Ox800F ; si oui, elle poursuit l'interprétation ; sinon, la machine virtuelle M lève une exception de sécurité 15 7. La machine virtuelle M exécute l'opcode ifne qui teste si la valeur se trouvant au sommet de la pile est égale à 0 8. Si oui, la machine virtuelle M incrémente le PC de 2 et 9. Si non, la machine virtuelle M ajoute au PC la valeur de l'argument de l'opcode if ne, ici 0)(05, pour passer à 0x8006. 20 10. La machine virtuelle M vérifie que le PC est compris entre 0x8000 et Ox800F ; si oui, elle poursuit l'interprétation ; sinon, la machine virtuelle M lève une exception de sécurité 11. Cette opération se répète jusqu'à rencontrer un des opcode sreturn de la méthode. 12. La machine virtuelle M retourne ensuite à la méthode qui a appelé foc. 25 13. Etc. Dans une deuxième variante, l'étape 110 de contrôle de présence n'est mise en oeuvre pour une instruction de référence que si cette instruction de référence remplit au moins une condition prédéterminée (cette condition étant vérifiée au cours d'une étape 104). Ceci 30 permet de réduire la charge de calcul additionnelle consommée par l'étape de contrôle de présence. 3065553 15 Cette condition peut être le résultat d'un tirage aléatoire mis en oeuvre pour l'instruction de code de référence. Autrement dit, l'étape de contrôle de présence est mise en oeuvre ou non, de manière aléatoire. Alternativement, ou à titre complémentaire, le contrôle de présence peut être mise en 5 oeuvre lorsqu'au moins une des conditions suivantes est remplie : - l'instruction de code de référence est une instruction de saut depuis un premier bloc de base de programme vers un autre bloc de base de programme, telle qu'une instruction de branchement, une instruction d'invocation de méthode, ou une instruction de retour de méthode, ou 10 - l'instruction de code de référence est une instruction d'écriture dans une mémoire non volatile 8, ou - le programme étant exécuté dans un dispositif électronique, l'instruction de code de référence participe à une communication de données avec un dispositif différent du dispositif électronique. 15 Ces types d'instruction de code sont particulièrement critiques en termes de sécurité. Il est donc particulièrement avantageux de limiter l'étape de contrôle à ces types d'instruction de code. L'étape de contrôle de présence 110 peut être mise en oeuvre par la machine virtuelle M. Toutefois, une telle étape de contrôle de présence consomme des ressources processeur 20 2, et ce de façon particulièrement importante lorsque le contrôle de présence 110 est mis en oeuvre pour chaque instruction de code de référence déterminée comme étant à interpréter par la machine virtuelle M, conformément à la première variante proposée ci-dessus. Pour décharger le processeur 2, l'étape de contrôle de présence 110 est avantageusement déléguée au circuit de contrôle 12. Par exemple, la machine virtuelle M lit 25 une seule fois les données de localisation de la première portion P1 depuis la mémoire non volatile 8 et transmet les adresses de début et de fin au circuit de contrôle 12 au lancement du programme cible P, avant la mise en oeuvre de l'étape de contrôle de présence 17. Plus tard, le circuit de contrôle 12 met en oeuvre le contrôle de présence 110 en compare le pointeur de code avec les adresses que la machine virtuelle M lui a fournies au lancement du 30 programme cible P. Par ailleurs, si les données de droits d'interprétation DR comprennent une donnée d'intégrité relative à ces données de localisation, cette donnée d'intégrité est également 3065553 16 lue par la machine virtuelle M au cours de l'étape 106. La machine virtuelle M contrôle alors l'intégrité des données de localisation à l'aide de la donnée d'intégrité (étape 108). Le contrôle d'intégrité 108 comprend l'application de la fonction F prédéterminée aux données de localisation lues, de sorte à générer une deuxième donnée d'intégrité, puis une 5 comparaison entre la donnée d'intégrité lue et la deuxième donnée d'intégrité générée. Si les deux données d'intégrité comparées sont différentes, alors les données de localisation sont considérées non intègres. Il est possible en particulier que le dispositif électronique 1 ait subi une attaque ayant eu pour effet de corrompre les données de localisation mémorisées dans le dispositif électronique. Dans ce cas l'étape 110 est mise en oeuvre. Si les deux 10 données d'intégrité comparées sont égales, alors les données de localisation sont intègres. Le procédé passe alors à l'étape 110. L'étape 108 de contrôle d'intégrité peut être mis en oeuvre avant l'interprétation 112 de chaque instruction de code de référence déterminée comme étant à interpréter au cours de l'étape 102. En variante, l'étape de contrôle d'intégrité108 est mise en oeuvre seulement 15 lorsque l'étape de contrôle de présence 110 est mise en oeuvre pour une instruction de code de référence. Autres modes de réalisation Dans le mode de réalisation décrit précédemment, le programme cible P installé dans 20 le dispositif électronique dispose de données de droits d'interprétation DR qui lui sont propres, et pouvant même en faire partie intégrante. Si plusieurs programmes cibles sont installés dans le dispositif 1, chaque programme cible installé dispose de ses propres données DR. Dans un deuxième mode de réalisation, qui va être à présent décrit, les données de 25 droits d'interprétation DR ne font pas partie intégrante d'un programme cible P mais sont plutôt partagées entre plusieurs programmes cibles installés dans le dispositif électronique 1. Ceci permet de limiter la mémoire additionnelle consommée par les données de droit d'interprétation DR. En référence à la figure 4 relative à ce deuxième mode de réalisation, les données de 30 droits d'interprétation DR indiquent à la machine virtuelle M que seules des instructions de code contenues dans une zone prédéterminée Z de la mémoire non volatile 8 sont autorisées à être interprétées à l'aide de code machine par la machine virtuelle M. 3065553 17 Les données de droits d'interprétation comprennent des données de localisation adaptées pour localiser la zone prédéterminée Z dans la mémoire non volatile 8. Ces données de localisation comprennent par exemple une adresse de début A de la zone prédéterminée Z dans la mémoire non volatile 8, ainsi qu'une adresse de fin B de cette 5 zone prédéterminée Z (cette adresse de fin pouvant être remplacée par une taille de la zone prédéterminée). Les données de droits d'interprétation DR peuvent également comprendre une donnée d'intégrité relative aux à la zone prédéterminée de la mémoire non volatile 8, calculée d'une manière similaire au premier mode de réalisation. 10 Les données de droits d'interprétation DR sont mémorisées dans la mémoire non volatile 8 avant l'installation d'un quelconque programme cible P. On suppose dans un premier temps que la zone prédéterminée de la mémoire non volatile 8 est vide, comme cela est représenté sur la figure 4, et qu'aucun programme cible P n'a encore été installé dans le dispositif électronique. 15 L'installeur IN décompose le programme cible P en sa première portion P1 et la portion restante P2. L'installeur IN lit les données de droits d'interprétation depuis la mémoire volatile 6 pour déterminer où se trouve dans la zone prédéterminée Z. En référence à la figure 5, l'installeur IN commande la mémorisation de la première 20 portion P1 de programme dans la zone prédéterminée Z de la mémoire non volatile 8. L'installeur IN commande par ailleurs la mémorisation de la portion restante du programme dans une zone de la mémoire non-volatile différente de la zone prédéterminée. Ensuite, l'installeur IN met à jour les données de droits d'interprétation. Cette mise à jour comprend une mise à jour de la valeur d'intégrité relative à la zone. 25 Si la première portion P1 du programme cible P n'est pas totalement incluse dans la zone prédéterminée (par exemple par ce que sa taille est plus grande que la taille de la zone prédéterminée), la zone indiquée dans les données de localisation est étendue de sorte à couvrir la première portion Pl. Cette extension se traduit typiquement par une augmentation de la valeur de l'adresse de fin des données de localisation. 30 Ultérieurement, le dispositif électronique reçoit via son interface de communication un deuxième programme cible P à installer, le deuxième programme cible P' étant également destiné à être interprété par la machine virtuelle M. 3065553 18 Les étapes de décomposition et de mémorisation sont répétées : une première portion PI' contenant des instructions de code du deuxième programme cible P' est mémorisée dans la zone prédéterminée Z, et une portion restante P2 du deuxième programme est mémorisée ailleurs dans la mémoire virtuelle. 5 La première portion PI de référence est mémorisée de façon adjacente à la première portion PI du premier programme cible P déjà présente dans la zone prédéterminée de la mémoire non volatile 8. Ceci permet de limiter la fragmentation de la mémoire. Si la première portion PI du programme cible P n'est pas totalement incluse dans la zone prédéterminée (parce que la taille cumulée de la première portion PI du premier 10 programme cible P et de la première portion PI du deuxième programme cible P est plus grande que la taille de la zone prédéterminée), la zone Z indiquée dans les données de localisation est étendue de sorte à couvrir les deux premières portions PI et PI'. Cette extension se traduit typiquement par une augmentation de la valeur de l'adresse de fin B des données de localisation. 15 Les étapes du procédé d'exécution sont similaires à celles du premier mode de réalisation, à ceci près que les données de droits de localisation ne sont pas lues par la machine virtuelle M depuis un fichier .cap. REVENDICATIONS1. Procédé d'exécution d'un programme (P) destiné à être interprété par une machine virtuelle (M), le procédé comprenant des étapes de : - détermination (102) d'une instruction de code de référence à interpréter au cours de l'exécution du programme, - interprétation (112), par la machine virtuelle, de l'instruction de code de référence à l'aide de code machine, le procédé étant caractérisé en ce qu'il comprend des étapes de - lecture (106) de données de droits d'interprétation (DR) indiquant une portion du programme (P1) contenant des instructions de code interprétables par la machine virtuelle, - sur la base des données lues, contrôle de présence (110) de l'instruction de code de référence dans la portion (P1) du programme (P), l'interprétation de l'instruction de code de référence étant mise en oeuvre par la machine virtuelle (M) seulement si l'instruction de code de référence est contenue dans la portion (P1) du programme (P). 2. Procédé selon la revendication 1, dans lequel le contrôle de présence (110) est mis en oeuvre pour chaque instruction de code de référence déterminée (102) comme étant à interpréter au cours de l'exécution du programme. 3. Procédé selon la revendication 1, comprenant une vérification (104) d'au moins une condition susceptible d'être remplie ou non par l'instruction de code de référence, dans lequel le contrôle de présence (110) est mis en oeuvre seulement si la condition est remplie. 4. Procédé selon la revendication 3, dans lequel la condition est remplie lorsque : - l'instruction de code de référence est une instruction de saut depuis un premier bloc de base de programme vers un autre bloc de base de programme, telle qu'une instruction de branchement, une instruction d'invocation de méthode, ou une instruction de retour de méthode, ou - l'instruction de code de référence est une instruction d'écriture dans une mémoire non volatile (8), ou 3065553 20 - le programme étant exécuté dans un dispositif électronique (1), l'instruction de code de référence participe à une communication de données entre le dispositif électronique (1) et un autre dispositif. 5 5. Procédé selon la revendication 1, dans lequel l'étape de contrôle de présence (110) est mise en oeuvre ou non en fonction d'un résultat d'un tirage aléatoire. 6. Procédé selon l'une des revendications précédentes, comprenant des étapes de : - lecture, dans les données de droits d'interprétation (DR), de données de localisation 10 adaptées pour localiser la portion du programme, - lecture, dans les données de droits d'interprétation (DR), d'une donnée d'intégrité relative aux données de localisation, - contrôle d'intégrité (108) des données de localisation sur la base de la donnée d'intégrité, l'instruction de code de référence étant interprétée (112) seulement s'il 15 est déterminé au cours du contrôle d'intégrité que les données de localisation sont intègres. 7. Procédé selon l'une des revendications 1 à 6, dans lequel la machine virtuelle (M) est exécutée par au moins un processeur (2), et dans lequel l'étape de contrôle de présence 20 (110) est mise en oeuvre par un circuit (12) différent de chaque processeur (2). 8. Machine virtuelle (M) comprenant des instructions de code de programme pour l'exécution des étapes du procédé selon l'une des revendications 1 à 7, lorsque ce procédé est exécuté par au moins un processeur (2). 9. Dispositif électronique (1), tel qu'une carte à puce, comprenant : - au moins un processeur (2) configure pour exécuter une machine virtuelle (M) selon la revendication précédente, - au moins un programme (P) destiné à être interprété par la machine virtuelle (M). 25 30 10. Procédé d'installation d'un programme (P) destiné à être interprété par une machine virtuelle (M) dans une mémoire non volatile (8), le procédé comprenant des étapes de : 3065553 21 - décomposition du programme (P) en une première portion (P1) comprenant des instructions de code interprétable par la machine virtuelle et une portion restante (P2), - lecture de données de droits d'interprétation (DR) indiquant à la machine virtuelle 5 que seules des instructions de code contenues dans une zone prédéterminée (Z) de la mémoire non volatile (8) sont autorisées à être interprétées à l'aide de code machine par la machine virtuelle (M), - mémorisation de la première portion (P1) de programme dans la zone prédéterminée (Z) de la mémoire non volatile (8), 10 - mémorisation de la portion restante (P2) du programme dans une zone différente de la zone prédéterminée (Z). 11. Installeur (IN) comprenant des instructions de code de programme pour l'exécution des étapes du procédé selon la revendication 10, lorsque ce procédé est exécuté par au moins 15 un processeur (2). 12. Procédé de génération d'un programme (P) destiné à être interprété par une machine virtuelle (M), comprenant des étapes de - génération d'une portion (P1) de programme contenant des instructions de code 20 interprétables par la machine virtuelle (M), - génération de données de droits d'interprétation configurées pour indiquer à la machine virtuelle (M) que seules les instructions de code contenues dans la portion (P1) de programme sont autorisées à être interprétées par la machine virtuelle à l'aide de code machine pour exécuter le programme (P). 25 13. Produit programme d'ordinateur (P) destiné à être interprété par une machine virtuelle (M), comprenant : - une portion (P1) de programme contenant des instructions de code interprétables par la machine virtuelle (M), 30 - des données de droits d'interprétation (DR) configurées pour indiquer à la machine virtuelle (M) que seules les instructions de code contenues dans la portion (P1) du programme sont autorisées à être interprétées par la machine virtuelle (M) à l'aide de code machine pour exécuter le programme (P). 3065553 22 14. Produit programme d'ordinateur (P) selon la revendication 13, dans lequel les données de droits d'interprétation (DR) comprennent : - des données de localisation adaptées pour localiser la portion du programme au sein 5 du programme, et - une donnée d'intégrité relative aux données de localisation de la portion de programme. 15. Produit programme d'ordinateur (P) selon l'une des revendications 13 à 14, de type 10 applet Java Card, dans lequel la portion du programme est un composant de l'applet qui est de type - method_component ».