Brevet FR2814557A1 — publié le 20020329

Protection contre l'exploitation abusive d'une instruction dans une mémoire La présente invention concerne d'une manière générale la protection contre l'exploitation abusive, c'est-à-dire non autorisée, d'une instruction sensible enregistrée dans une mémoire. Plus particulièrement, elle concerne la protection contre une écriture, une lecture ou une modification d'une donnée secrète dans la mémoire morte ROM d'un microcontrôleur par exemple implanté dans une carte à puce (smart card), dite également carte à microcontrôleur, ou tout autre objet électronique portable. De nombreuses cartes à puce peuvent contenir des données ou programmes sensibles dont la connaissance conduit à découvrir le savoir-faire industriel de fabricant et des techniques ou outils de programmation, tels que des API (Application Programming Interface). Bien souvent, une carte à puce se réfère à une matrice de sécurité selon laquelle tout accès en lecture particulièrement à des données dans la mémoire ROM est interdit par des instructions qui sont localisées dans la mémoire non volatile EEPROM ou la mémoire RAM du microcontrôleur de la carte, ou dans toute autre mémoire RAM à laquelle le microcontrôleur est relié, par exemple une mémoire RAM externe à la carte et incluse dans le terminal d'accueil de la carte. Dans ces conditions, la lecture de données dans la mémoire ROM n'est apparemment possible qu'au moyen d'instructions écrites dans la mémoire ROM elle-même. Toutefois un attaquant ayant eu connaissance de l'adresse d'une instruction qui donne accès à ou modifie une donnée secrète, est capable de récupérer la donnée secrète. Afin d'illustrer cette possibilité, la figure 1 montre un exemple de contenus partiels de la mémoire EEPROM et de la mémoire ROM dans un microcontrôleur selon la technique antérieure contenant un microprocesseur 80C51 d'INTEL (marque déposée). Le compte du compteur de programme du microcontrôleur varie par exemple de AdrO=O à AdrM=1000 pour des adresses de cases contenues dans la mémoire ROM et de Adr (M+l) =1001 à AdrP=2000 pour des adresses de cases contenues dans la mémoire EEPROM, avec M P. La valeur d'un pointeur de donnée DPTR dans les mémoires peut ainsi varier entre 0 et P. Il est supposé que dans la mémoire ROM une instruction"dangereuse" [MOVC A, @A+DPTR] positionnée à l'adresse Adrm=100 correspond au déplacement d'une donnée"publique", tel qu'un octet de code CB (Code Byte), pointée dans la mémoire EEPROM par la valeur courante du pointeur DPTR, pour transférer la donnée vers l'accumulateur A dans l'unité de traitement central (CPU) du microcontrôleur. La donnée CB est inscrite à l'adresse Adrp, avec M+lpP. Une instruction de retour RET est positionnée à l'adresse Adr (m+l) dans la mémoire ROM et suit ainsi immédiatement l'instruction de déplacement MOVC. En l'absence normale de toute séquence d'attaquant COM dans la mémoire EEPROM, le pointeur DPTR a reçu la valeur p à la suite du déroulement d'une première partie de programme (non représentée) écrite dans les mémoires, notamment à des adresses de la mémoire ROM précédant l'adresse Adrm. L'instruction opérationnelle MOVC à l'adresse Adrm est exécutée pour lire et transférer dans l'accumulateur A la donnée CB qui est utilisée au cours d'une deuxième partie de programme succédant à l'instruction de retour RET. Un attaquant qui tente de prendre connaissance d'une donnée secrète DS positionnée à l'adresse Adrn de la mémoire ROM, par exemple avec m+l La première instruction [CLR A] met à zéro le contenu de l'accumulateur A. La deuxième instruction [MOV DPTR, n] met le pointeur de données DPTR à la valeur n correspondant à l'adresse Adrn. La troisième instruction [CALL m] invoque un appel de procédure pour exécuter directement l'instruction MOVC à l'adresse Adrm dans la mémoire ROM. Le pointeur DPTR avec la valeur n ayant pointé la donnée DS à l'adresse Adrn lors de l'exécution de l'instruction"dangereuse"appelée, la donnée secrète recherchée DS est transférée dans l'accumulateur A et facilement récupérable par l'attaquant. Après l'instruction de retour RET, l'exécution de toute instruction, par exemple [MOVX @Ri, A], succédant à l'instruction d'appel [CALL m] et écrite dans la mémoire EEPROM par l'attaquant lui permet d'obtenir la donnée secrète DS lue en mémoire ROM en vidant le contenu de l'accumulateur, par exemple dans une mémoire externe RAM, hors du microcontrôleur. La présente invention vise à inhiber ce type de menace sans interdire l'écriture d'instructions "dangereuses"dans la mémoire ROM, afin d'éviter l'exploitation abusive du résultat d'une telle instruction dangereuse. A cette fin, un procédé pour protéger une instruction opérationnelle comprise dans une séquence d'instructions écrite dans un moyen de mémoire contre une commande d'exécution depuis un moyen de commande pour accéder au résultat de l'instruction opérationnelle exécutée, en réponse à une instruction de fin de la séquence, est caractérisé en ce que la séquence comprend un test immédiatement exécuté à la suite de l'instruction opérationnelle sur une condition liée à au moins un opérande de ladite instruction opérationnelle, un transfert du résultat de l'instruction opérationnelle exécutée depuis le moyen de mémoire vers le moyen de commande lorsque la condition est satisfaite, et une inexécution de l'instruction de fin de séquence lorsque la condition est insatisfaite. Selon une première réalisation, le test comprend un calcul, tel que différence, dépendant de l'opérande et d'une valeur prédéterminée, la condition étant une comparaison du résultat du calcul à au moins un seuil prédéterminé, tel que la valeur nulle. Le résultat de l'instruction opérationnelle est alors transféré vers le moyen de commande lorsque le résultat du calcul est compris dans un premier intervalle ayant le seuil comme l'une de limites inférieure et supérieure, et l'instruction de fin n'est pas exécutée lorsque le résultat de calcul est compris dans un deuxième intervalle ayant le seuil comme l'autre des limites inférieure et supérieure de ce deuxième intervalle. L'instruction opérationnelle peut être une lecture, une écriture ou une modification d'une donnée dans le moyen de mémoire, et l'opérande peut être un pointeur d'adresse de donnée. L'inexécution de l'instruction de fin peut résulter d'un saut d'une instruction vers elle-même exécutée à la suite de l'insatisfaction de la condition, ou bien classiquement un message d'erreur ou un rejet de carte. Selon une deuxième réalisation, l'instruction opérationnelle est une transaction, et la condition du test est une autorisation de la transaction. De préférence, l'instruction opérationnelle est la modification d'un solde succédant à une lecture de celui-ci dans le moyen de commande, la condition est appliquée sur le solde ou un incrément de solde, et le transfert comprend une écriture du solde modifié depuis le moyen de mémoire dans le moyen de commande. L'invention concerne également un objet électronique portable comportant un microcontrôleur dont la mémoire non réinscriptible d'une part et la mémoire non volatile programmable et/ou la mémoire à accès aléatoire d'autre part sont incluses respectivement dans le moyen de mémoire et le moyen de commande pour la mise en oeuvre du procédé conforme à l'invention. En particulier, au moins l'une des instructions opérationnelles écrites dans la mémoire non réinscriptible pour lire, écrire ou modifier une donnée dans la mémoire non volatile et/ou la mémoire à accès aléatoire est suivie immédiatement d'un test écrit dans la mémoire non réinscriptible, sur une condition liée à au moins un opérande de ladite instruction opérationnelle, afin d'invalider l'objet lorsque la condition est insatisfaite. D'autres caractéristiques et avantages de la présente invention apparaîtront plus clairement à la lecture de la description suivante de plusieurs réalisations préférées de l'invention en référence aux dessins annexés correspondants dans lesquels : - la figure 1 montre une attaque écrite dans une mémoire EEPROM, d'une séquence écrite dans une mémoire ROM illustrant la technique antérieure déjà commentée ; - la figure 2 est un bloc-diagramme d'une carte à puce dans laquelle la séquence attaquée écrite en mémoire ROM est modifiée selon le procédé de protection de l'invention pour une première réalisation ; la figure 3 montre les instructions d'une séquence"dangereuse"écrite en mémoire ROM selon une deuxième réalisation connue ; et - la figure 4 montre la séquence"dangereuse" modifiée selon le procédé de protection de l'invention relativement à la deuxième réalisation. En référence à la figure 2, il est supposé, comme pour la figure 1, qu'un microcontrôleur notamment d'une carte à puce CP, ou de tout autre objet électronique portable, contient une unité de traitement CPU constituée en pratique par un microprocesseur du type précité 80C51. L'unité CPU inclut en particulier une unité arithmétique et logique UAL avec notamment un accumulateur A, un compteur d'adresse d'instruction CP et un registre d'instruction courante RI. Le microcontrôleur comprend également classiquement une mémoire ME non réinscriptible de type ROM, une mémoire MC de type non volatile programmable EEPROM, et une mémoire MA de type à accès aléatoire RAM pour échanger des données avec le monde extérieur au microcontrôleur, tel qu'un terminal d'accueil de la carte à puce CP. Les mémoires interagissent avec le processeur CPU au cours du déroulement d'un programme ou application écrit au moins pour partie en mémoire ROM et pour partie en mémoire EEPROM, au moyen de requêtes et réponses, contenant des"résultats" d'instructions exécutées, à travers un bus BU. Selon la première réalisation illustrée à la figure 2, on retrouve la séquence de commande d'exécution COM à trois instructions écrites par un attaquant dans la mémoire EEPROM MC qui constitue selon l'invention un moyen de commande qui est susceptible d'accéder au résultat d'une instruction opérationnelle"dangereuse"appelée dans la mémoire ME. Les trois instructions sont ainsi relatives à l'effacement du contenu de l'accumulateur A, à la mise du pointeur de mémoire DPTR à la valeur n de l'adresse Adrn visant la donnée secrète DS dans la mémoire ME, et à l'appel de l'instruction réputée "dangereuse"écrite dans la case m à l'adresse Adrm de la mémoire ROM. Comparativement au contenu de la mémoire ROM à la figure 1, la séquence d'instruction SQ dans la mémoire ME a été complétée afin que l'exécution de l'instruction de fin RET de la séquence SEQ pour à nouveau exécuter des instructions dans la mémoire MC soit conditionnée par un test sur une condition appliquée sur un opérande de l'instruction précédente dangereuse pointée à l'adresse Adrm. Ce complément de séquence comprend essentiellement les deux instructions suivantes : SUBB DPTR, #M JC $ écrites dans la mémoire ME aux adresses successives Adr (m+l) et Adr (m+2) immédiatement après l'instruction"dangereuse" [MOVC A, @A+DPTR] et avant l'instruction RET maintenant écrite à l'adresse Adr (m+3). La première instruction supplémentaire SUBB soustrait la valeur M de l'adresse la plus élevée AdrM de la mémoire ME, à la dernière valeur du pointeur DPTR, en l'occurrence celle utilisée normalement pour pointer la donnée CB lue dans la mémoire MC lors de l'exécution de l'instruction opérationnelle précédente MOVC. La deuxième instruction supplémentaire JC est une instruction conditionnelle"SI" (IF) avec retenue (carry) effectuant un saut d'adresse en fonction du résultat de la soustraction précédente DPTR=DPTR-M. Si la différence DPTR-M est négative, notamment en réponse à l'instruction d'appel [CALL m] de l'attaquant qui a mis la valeur du pointeur DPTR à une valeur n inférieure à M, l'instruction JC à l'adresse Adr (m+2) saute sur elle-même et impose une boucle infinie dans la mémoire ROM, comme indiqué en trait pointillé. Cette boucle réitérée infiniment empêche l'inexécution de l'instruction de fin suivante RET et par conséquent inhibe la récupération de la donnée DS depuis l'accumulateur par l'attaquant. Par contre si la dernière valeur du pointeur DPTR est supérieure à la valeur maximale M des adresses de la mémoire ME, c'est-à-dire égale à une valeur telle que M+l l'instruction de fin RET d'adresse Adr (m+3) de manière à poursuivre le programme en cours. En variante, au lieu que l'instruction opérationnelle"dangereuse"dans la case d'adresse Adrn exécute une lecture de donnée, elle exécute une écriture de donnée, voire toute modification de donnée. Selon encore d'autres variantes, les instructions supplémentaires dans les cases d'adresse Adr (m+l) et Adr (m+2) sont remplacées par une comparaison du pointeur DPTR à deux valeurs MIN et MAX des deux adresses de la mémoire ME désignant des cases entre lesquelles un espace de mémoire contient des données confidentielles à protéger. Toute valeur de pointeur comprise entre MIN et MAX, tentée par un attaquant, conduit au bouclage infini JC. Dans la description ci-dessus, il sera compris que la carte à puce CP recouvre tous les types connus de carte à puce, dites également cartes à microcontrôleur, comme les cartes à contact ou sans contact énoncées ci-après à titre d'exemple non limitatif : cartes de crédit, cartes de paiement, cartes prépayées, cartes téléphoniques, cartes SIM, cartes"additionnelles", cartes de centrale d'achat, cartes de jeu, etc. Plus généralement, l'invention concerne non seulement des cartes à puce mais également d'autres objets électroniques portables désignés indifféremment par moyens de traitement de données électroniques, tels que assistants ou organiseurs électroniques, porte-monnaie électroniques, jetons, calculettes, etc. Selon une deuxième réalisation connue montrée à la figure 3, la mémoire ROM contient dans quatre cases d'adresses successives Adr (m-1), Adrm, Adr (m+l) et Adr (m+2), des instructions d'une séquence de transaction concernant la lecture d'un solde SO depuis la mémoire EEPROM vers la mémoire ROM, l'incrémentation du solde avec un incrément sélectionné ASO, l'écriture du solde incrémenté SO=SO+ASO depuis la mémoire ROM dans la mémoire EEPROM, et finalement l'instruction de fin de séquence Retour généralement suivie par le retrait de la carte à puce du terminal d'accueil. Les mémoires ROM et EEPROM sont incluses dans une carte à puce servant de porte-monnaie électronique pour cette deuxième réalisation. Selon la technique antérieure, la séquence d'incrémentation de solde est précédée à l'adresse de case Adr (m-2) par un test pour autoriser l'opération de crédit consistant en une condition liée à au moins l'opérande solde SO et/ou l'opérande incrément ASO compris dans l'opération de crédit, essentiellement l'instruction opérationnelle d'incrémentation SO=SO+ASO. Le test vérifie que le porte-monnaie est dans un contexte normal ou anormal de fonctionnement. Par exemple, la condition peut être une supériorité du solde du compte en banque du possesseur du portemonnaie électronique à l'incrément ASO, ou bien peut être une infériorité de l'incrément ASO à une limite supérieure, et/ou une infériorité de la somme de telles incrémentations pendant une période prédéterminée à un crédit maximal autorisé. La vérification de la condition peut être précédée par une identification de l'usager et/ou une authentification du porte-monnaie électronique à travers un dialogue avec le terminal d'accueil point de vente d'un commerçant, et/ou un serveur de banque. Si un attaquant connaît l'adresse Adr (m-l) de la case de la mémoire ROM contenant l'instruction de lecture de solde, l'attaquant peut ainsi faire incrémenter le solde avec l'incrément de son choix, malgré la satisfaction de la condition du test Adr (m- 2) à une étape précédente, et récupérer le portemonnaie électronique crédité après l'instruction Retour. Au pire, l'attaquant peut écrire une séquence dans la mémoire EEPROM MC qui réitère la séquence d'instructions Adr (m-l) à Adr (m+2) autant de fois que l'attaquant le souhaite. Selon l'invention en référence à la figure 4, de manière à éviter que l'exécution de cette séquence de transaction dans la mémoire ROM MEa puisse être commandée par un attaquant au moyen d'un programme écrit dans la mémoire EEPROM MC, l'invention protège cette séquence en introduisant dans la mémoire MEa le test pour créditer. Ainsi, immédiatement après l'instruction opérationnelle d'incrémentation"dangereuse"à l'adresse Adrm, la case suivante d'adresse Adr (m+l) contient le test par exemple identique à celui déjà présenté en référence à la figure 3, ou un test sur une condition liée à l'opérande constitué par le résultat SO=SO+ASO, telle qu'une comparaison à une limite supérieure, et à une identification de propriétaire. Si l'instruction conditionnelle Adr (m+l) n'est pas satisfaite, les instructions suivantes aux adresses Adr (m+2) et Adr (m+3) sont inexécutées. Aucun solde incrémenté n'est écrit dans la mémoire EEPROM MC, et la séquence est branchée vers l'émission d'un message d'erreur ou analogue pour invalider le porte- monnaie électronique et éventuellement éjecter celuici hors du terminal d'accueil. En revanche, si l'instruction conditionnelle Adr (m+l) est satisfaite, le solde incrémenté SO est écrit dans la mémoire MC selon l'instruction à l'adresse Adr (m+2) et le programme est poursuivi après l'instruction de fin de séquence Retour à l'adresse Adr (m+3). Bien que la description ci-dessus se réfère à une donnée CB normalement à lire dans la mémoire non volatile EEPROM MC par l'instruction"dangereuse" écrite à l'adresse Adrm dans la mémoire non réinscriptible ROM ME, le moyen de commande au sens de l'invention peut inclure non seulement la mémoire EEPROM MC, mais également la mémoire à accès aléatoire RAM MA du microcontrôleur. REVENDICATIONS 1-Procédé pour protéger une instruction opérationnelle (Adrm) comprise dans une séquence d'instructions (SQ) écrite dans un moyen de mémoire (ME) contre une commande d'exécution (COM) depuis un moyen de commande (MC) pour accéder au résultat de l'instruction opérationnelle exécutée, en réponse à une instruction de fin (Adr (m+3)) de la séquence, caractérisé en ce que la séquence comprend un test (Adr (m+l), Adr (m+2) ) immédiatement exécuté à la suite de l'instruction opérationnelle (Adrm) sur une condition liée à au moins un opérande (DPTR) de ladite instruction opérationnelle, un transfert (RET) du résultat (CB) de l'instruction opérationnelle exécutée depuis le moyen de mémoire (ME) vers le moyen de commande (MC) lorsque la condition est satisfaite, et une inexécution de l'instruction de fin de séquence (Adr (m+3) ) lorsque la condition est insatisfaite. 2-Procédé conforme à la revendication 1, selon lequel le test comprend un calcul dépendant de l'opérande et d'une valeur prédéterminée (M), la condition étant une comparaison du résultat du calcul à au moins un seuil prédéterminé. 3-Procédé conforme à la revendication 1 ou 2, selon lequel l'instruction opérationnelle (Adrm) est une lecture, écriture ou modification d'une donnée (CB) dans le moyen de commande (MC), et l'opérande est un pointeur d'adresse de donnée (DPTR). 4-Procédé conforme à l'une quelconque des revendications 1 à 3, selon lequel l'inexécution de l'instruction de fin (Adr (m+3)) résulte d'un saut (JC) d'une instruction vers elle-même exécutée à la suite de l'insatisfaction de la condition. 5-Procédé conforme à la revendication 1, selon lequel l'instruction opérationnelle (Adrm) est une transaction, et la condition du test (Adr (m+l)) est une autorisation de la transaction. 6-Procédé conforme à la revendication 5, selon lequel l'instruction opérationnelle (Adrm) est la modification d'un solde (SO) succédant à une lecture (Adr (m-l)) de celui-ci dans le moyen de commande (MC), la condition est appliquée sur le solde ou un incrément de solde (ASO), et le transfert comprend une écriture (Adr (m+2)) du solde modifié depuis le moyen de mémoire (MEa) dans le moyen de commande. 7-Objet électronique portable comportant un microcontrôleur (CP), caractérisé en ce qu'une mémoire non réinscriptible du microcontrôleur et une mémoire non volatile programmable et/ou une mémoire à accès aléatoire (MA) du microcontrôleur sont incluses respectivement dans le moyen de mémoire (ME) et le moyen de commande (MC) pour la mise en oeuvre du procédé conforme à l'une quelconque des revendications 1 à 6. 8-Objet conforme à la revendication 7, dans lequel au moins l'une d'instructions opérationnelles (Adrm) écrites dans la mémoire non réinscriptible pour lire, écrire ou modifier une donnée dans la mémoire non volatile (MC) et/ou la mémoire à accès aléatoire est suivie immédiatement d'un test (Adr (m+l), Adr (m+2)) écrit dans la mémoire non réinscriptible, sur une condition liée à au moins un opérande de ladite instruction opérationnelle, afin d'invalider l'objet lorsque la condition est insatisfaite.