FR 2990533 A1 20131115 FR 1254221 A 20120509 DOMAINE DE L'INVENTION Le domaine de l'invention est celui de la sécurité de composants électroniques, notamment de cartes à puce. L'invention est notamment applicable au contrôle de l'exécution d'un logiciel sécurisé. ETAT DE LA TECHNIQUE Un des objectifs principaux des développeurs de logiciels sécurisés pour microcontrôleur est d'empêcher un attaquant potentiel de modifier l'ordre d'exécution d'instructions ou blocs d'instructions constituant un logiciel. Ces attaques peuvent prendre la forme d'attaques électriques ou lumineuses, ou de modifications indues de données. Pour assurer la maîtrise de l'exécution du logiciel, des techniques logicielles de contrôle d'exécution d'un logiciel sécurisé ont été développées. Parmi ces techniques, on compte des logiciels permettant d'identifier des modules - c'est-à-dire des groupements de fonctions logicielles - en cours d'utilisation, ou des fonctions logicielles, et permettant de contrôler des transitions entre différents modules ou différentes fonctions appartenant à un ou plusieurs modules. Ainsi, si suite à une intrusion, l'ordre d'exécution des fonctions est erroné, l'appel par une première fonction d'une deuxième fonction non prévu par le logiciel est détecté. L'intrusion est donc détectée. Des techniques logicielles ont également été développées pour suivre l'exécution d'un logiciel par incrémentation d'une variable dédiée à des étapes critiques de l'exécution dudit logiciel, avec des contrôles intermédiaires et/ou un contrôle final de la variable dédiée. En fonction des valeurs prévues et réelles de la variable, les contrôles peuvent donc détecter une mauvaise exécution du logiciel. Ces techniques présentent l'avantage d'une simplicité de mise en oeuvre, et d'une bonne efficacité de détection des attaques. Cependant, elles grèvent les performances du logiciel car elles nécessitent une taille de code importante. En outre, elles n'assurent pas une sécurité complète du logiciel puisqu'en tant que logiciel, ces solutions peuvent elles-mêmes être attaquées. PRESENTATION DE L'INVENTION La présente invention a pour but de remédier aux problèmes décrits ci-avant, en proposant une solution de contrôle de l'exécution d'un logiciel plus fiable que les solutions de l'art antérieur, et qui ne diminue pas les performances du logiciel contrôlé. A cet effet, l'invention a pour objet un procédé de suivi de l'exécution d'un programme mis en oeuvre par ordinateur, ledit programme intégrant dans ses instructions un ensemble de balises permettant le contrôle de ses étapes d'exécution, caractérisé en ce que lors du franchissement d'une balise dans le flux des étapes d'exécution du programme, on transmet en entrée d'une unité de suivi d'exécution des données d'identification associées à cette balise, ladite unité comprenant un registre et un circuit de traitement à portes logiques configure pour lire les données mémorisées dans le registre et mettre en oeuvre sur ces données et sur les données d'identification reçues en entrée par l'unité de suivi d'exécution, des opérations adaptées pour contrôler les données d'identification reçues, ledit circuit de traitement générant ou non une interruption de l'exécution du programme en fonction du résultat de ces opérations. Un tel procédé est avantageusement complété par les caractéristiques suivantes prises seules ou selon toutes leurs combinaisons techniquement possibles : les données d'identification d'une balise comportent une valeur de compteur associée à la balise, le registre comportant un champ correspondant, le circuit de traitement comparant la valeur de compteur de la balise à la valeur de compteur du champ correspondant dans le registre et mettant à jour cette dernière valeur par incrémentation du champ correspondant dans le registre, lors d'un franchissement de balise ; les données d'identification d'une balise comportent des données d'identification de fonction associées à la balise, le registre comportant un champ correspondant, le circuit de traitement comparant les données de la balise à celles de ce champ dans le registre et, lors d'un franchissement d'une balise à l'occasion de l'appel de l'exécution d'une seconde fonction dans le cours de l'exécution d'une première fonction, remplaçant dans le champ d'identification de fonction du registre des données d'identification de la première fonction par des données d'identification de la seconde fonction ; - notamment, lorsque la première et la deuxième fonctions appartiennent à des modules différents, le circuit de traitement remplace en outre dans un champ d'identification de modules du registre des données dépendant du module de la première fonction par des données dépendant du module de la seconde fonction, les données d'identification d'une balise comportant des données d'identification de module que le circuit de traitement compare à des données du champ correspondant dans le registre ; - les données dépendant de la seconde fonction ou du second module sont obtenues respectivement par application de l'opérateur « ou exclusif bit à bit» entre les données de la première fonction ou du premier module et un identifiant de la seconde fonction ou du second module ; - à chaque mise à jour des données des champs d'identification du registre, le circuit de traitement met à jour des données d'un champ de suivi et de contrôle des modifications des champs d'identification. - à chaque mise à jour des données du champ de suivi et de contrôle des modifications des champs d'identification, le circuit de traitement remet à zéro le champ de suivi d'exécution du programme. L'invention concerne en outre une unité de suivi d'exécution d'un programme, comprenant sur un même support matériel: - un registre et - un circuit de traitement à portes logiques configuré pour lire les données mémorisées dans le registre et mettre en oeuvre le procédé. Elle concerne par exemple une carte à puce comprenant une puce et une telle unité de suivi d'exécution dont le circuit de traitement et le registre ont été fondus avec ladite puce. DESCRIPTION DES FIGURES 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 un module matériel dans un contexte d'utilisation, - La figure 2 représente schématiquement un exemple de communication entre un programme et les composants d'un module matériel mise en oeuvre dans le procédé de suivi de l'exécution du programme, - La figure 3 représente les principales étapes du procédé de suivi de l'exécution du programme. DESCRIPTION DETAILLEE D'AU MOINS UN MODE DE MISE EN OEUVRE Description matérielle de l'unité de suivi d'exécution d'un programme L'unité de suivi d'exécution d'un logiciel, référencée par 1 sur la figure 1, comprend sur un même support matériel un registre 10, et un circuit « hardware » à portes logiques 11, ou circuit de traitement, configuré pour lire et écrire des données du registre 10 et réaliser des opérations sur celles-ci. Par exemple, ainsi qu'illustré sur la figure 1, le logiciel peut être un programme tournant en tout ou partie sur le processeur 20 d'une carte à puce 2, le registre 10 et le circuit 11 étant fondus avec le processeur 20 en étant intégrés matériellement à celui-ci. Pour permettre un contrôle du déroulement du programme par le circuit 11, le logiciel est développé en intégrant dans le flux de ses instructions un certain nombre de balises B dont l'identification est susceptible d'être contrôlée grâce au circuit de traitement 11 et au registre 10. Le circuit de traitement étant lui-même développé et fondu, en cohérence 20 avec l'intégration des balises dans le programme, pour permettre les opérations de contrôle attendus sur les balises étant fondu en fonction du logiciel à exécuter, tandis que le logiciel est quant à lui développé en cohérence avec le circuit 11. Notamment, chaque module du programme (constitué d'une ou plusieurs fonctions logicielles) et chaque fonction de celui-ci étant programmée dans le 25 programme avec un identifiant particulier MID, FID, une balise B dans le flux logiciel est identifiée par les identifiant MID et FID du module et de la fonction auxquels elle correspond, ainsi que par une valeur de compteur CPT. De son côté, le registre 10 comprend plusieurs champs dédiés au suivi de l'exécution d'un programme et en particulier : 30 un premier champ MID, en lecture et en écriture, qui permet de vérifier l'identification du module en cours d'exécution par le programme, par comparaison de la valeur lue dans ce champ avec la valeur de l'identifiant MID de la balise B concernée, le circuit 11 générant une interruption du programme, si les valeurs du module et du champ diffèrent ; - un second champ FID, en lecture et en écriture, qui permet de vérifier que la fonction exécutée par le programme est bien celle désirée, en vérifiant l'adéquation de la valeur de ce champ avec l'identifiant FID donnée par la balise B, le circuit générant une interruption logiciel si les valeurs de la fonction et du champ diffèrent et empêchant ainsi le passage non contrôlé d'une fonction à une autre ; - un troisième champ CPT, en lecture et en écriture, sert à suivre le déroulement du programme, en contrôlant qu'une balise franchie par le programme est bien celle désirée, le circuit 11 comparant, pour chaque balise B franchie par le programme, la valeur du compteur CPT indiquée au niveau du programme pour cette balise celle du champ CPT du registre 10, puis incrémentant la valeur de ce champ dans le registre 10 ce dernier. Si les deux valeurs comparées sont identiques, l'exécution se poursuit normalement. A contrario, si les valeurs diffèrent, une interruption est générée. Le registre 10 comprend en outre un champ OPE de commande, qui en lecture se décompose en : - un bit de poids fort utilisé comme champ ERR indicateur d'erreur (Quand ce bit est à 1, une erreur est signalée, et le circuit de traitement 11 provoque l'interruption du programme) et - un champ LVL qui constitue un compteur de niveau qui permet de maitriser les changements de valeurs qui peuvent être rendus nécessaires par les discontinuités liées aux appels de fonctions et aux interruptions. Le registre 10 peut être un registre à 32 bits, le circuit 11 étant un coeur 32 bits. Par exemple, le champ MID d'identification de module représente 8 bits, le champ FID d'identification de fonction représente 10 bits, et le champ CPT représente 7 bits. En écriture le champ de commande OPE représente 7 bits, tandis que le champ indicateur d'erreur ERR représente 1 bit en lecture, et le champ LVL représente 6 bits. Egalement, l'unité 1 peut être avantageusement couplée à un chien de garde (circuit électronique permettant de redémarrer le système si une action donnée n'est pas exécutée dans un délai imparti) pour assurer le contrôle temporel de l'exécution du logiciel à surveiller (non représenté sur la figure). Les opérations de modification des champs du registre 10 par le circuit 11 en fonction de l'exécution du programme sont décrites plus en détails ci-après. Exemple de procédé de contrôle d'exécution d'un programme En référence à la figure 2 et à la figure 3, on décrit un exemple de mise en oeuvre du procédé de contrôle d'exécution du programme au moyen dudit registre 10 et du circuit « hardware » 11 associé. Pour plus de clarté, on utilise dans la suite les conventions d'écriture suivantes : Champ.b = Valeur courante du 'Champ' avant écriture Champ.w = Valeur écrite, Champ.a = Valeur résultante après écriture. lnitialisation Le procédé comporte une première étape 1000, d'initialisation ou de réinitialisation des valeurs du registre. Il s'agit du seul moyen de modifier intégralement le registre. De fait, cette commande étant critique, elle génère une interruption dès que l'un champ des champs du registre est modifié, interdisant toute utilisation non maitrisée. Cette étape est mise en oeuvre par une commande CFU_LOAD(LVL) du champ OPE décrite ci-dessous : Commande: OPE.w = CFU_LOAD(LVL) Action(s): LVL.a = LVL.w = OPE[5..0].w (6 bits de poids faible d'OPE.w) MID.a = MID.w FID.a = FID.w CPT.a = CPT.w ERR.a = 0 Les conditions d'exceptions entraînant une interruption consistent en toute modification d'un champ du registre, c'est-à-dire : (ERR.b * 0) or (LVL.b * LVL.w) or (MID.b * MID.w) or (FID.b * FID.w) or (CPT.b * CPT.w) De la sorte, cette commande CFU_LOAD permet de contrôler les valeurs de tous les champs du registre. Vérification et modification des valeurs des champs Suite à cette étape d'initialisation du registre, le procédé comprend une étape 1100 de mise à jour des valeurs des champs du registre au fur et à mesure de l'exécution du programme, et le contrôle de la correspondance des valeurs des champs et des étapes en cours d'exécution du programme. Ainsi, le déroulement d'un programme est représenté schématiquement en figure 2. Il comprend l'exécution de fonctions F1, F2, F3 appartenant à différents modules Ml, M2, et, pour chaque fonction, le franchissement d'un certain nombre de balises B programmées. Le circuit de traitement 11 étant fondu en fonction du programme à exécuter, tandis que le programme est quant à lui développé en cohérence avec le circuit 11, à chaque franchissement d'une balise B par le programme, le circuit de traitement 11 vérifie les identifiants MID et FID en les comparant avec ceux précédemment écrits dans le registre 10 et exécute une étape 1110 de mise à jour de la valeur du champ CPT. Cette étape peut être réalisée par une commande CFU_STEP référencée 1111 en figure 3, ou par une commande CFU_ADD, référencée 1112, du champ 25 OPE. Commande CFU_STEP La commande CFU_STEP sert à incrémenter le champ compteur de balise CPT, et à vérifier que le programme n'a pas changé de fonction ou de module en 30 cours d'exécution. En cas d'absence de correspondance entre les valeurs des champs du registre et l'étape d'exécution du programme, une interruption est générée. Commande : OPE.w = CFU_STEP 35 Actions : CPT.a = CPT.b + 1 ERR.a = (ERR.b * 0) or (MID.b * MID.w) or (FID.b * FID.w) or (CPT.b * CPT.w) or (CPT.a Par ailleurs, on constate également que le résultat d'une modification du champ CPT est une combinaison de la valeur courante et de la valeur écrite (en l'occurrence un incrément de 1). Ainsi, une valeur donnée du compteur dépend des valeurs précédentes et permet la propagation d'une erreur pour une détection ultérieure, sauf si le champ de suivi LVL est modifié. Commande CFU_ADD La commande CFU_ADD, quant à elle, vérifie également les valeurs des champs d'identification MID et FID, et elle modifie la valeur du champ CPT par addition de la valeur en écriture (CPT.w). Commande: OPE.w = CFU_ADD Actions: CPT.a = CPT.b + CPT.w ERR.a = (ERR.b * 0) or (MID.b * MID.w) or (FID.b * FID.w) or (CPT.a Le champ LVL constitue donc un compteur du « niveau » (« level » en anglais) où se trouve le logiciel. Commandes CFU INC et CFU_DEC Les commandes CFU_INC et CFU_DEC sont exécutées comme suit : - CFU_INC: Commande: OPE.w = CFU_INC Actions: LVL.a = LVL.b + 1 MID.a = MID.b xor MID.w FID.a = FID.b xor FID.w CPT.a = CPT.b + CPT.w ERR.a = (ERR.b * 0) or (LVL.a = 0) or (CPT.a >= CPT.b) Conditions d'exception: (ERR.a * 0) or (MID.w * 0) - CFU_DEC: Commande: OPE.w = CFU_DEC Actions: LVL.a = LVL.b - 1 MID.a = MID.b xor MID.w FID.a = FID.b xor FID.w CPT.a = CPT.b + CPT.w ERR.a = (ERR.b * 0) or (LVL.b = 0) or (CPT.a >= CPT.b) Conditions d'exception: (ERR.a * 0) or (MID.w * 0) L'incrémentation ou la décrémentation du champ oblige le débordement du compteur CPT. Le logiciel est rendu compatible avec ce fonctionnement du module grâce à une programmation du logiciel prévue pour faire correspondre le nombre de balises entre chaque débordement du compteur, la taille du compteur, et les transitions entre fonctions. Cet ajustement du nombre de balises est chose aisée pour l'Homme de l'Art. Par ailleurs, le fait de changer de module, c'est-à-dire de changer la valeur du champ MID entraîne la génération d'une interruption sans activation du drapeau d'erreur (champ ERR). Cette interruption systématique à chaque modification du champ MID permet de gérer les contextes d'exécution du logiciel. Lors d'un changement de fonction et de l'exécution des commandes CFU_INC ou CFU_DEC, les modifications des champs MID ou FID sont réalisées par application de l'opérateur « ou exclusif » (« xor ») entre la valeur courante du champ, qui correspond à un identifiant de la fonction ou du module avant changement, et un identifiant de la fonction ou du module après changement (noté FID.w ou MID.w). Le fait de modifier les valeurs des champs par un opérateur « ou exclusif » et non pas par un changement direct permet une meilleure maitrise de la transition d'une fonction à l'autre. En effet, le résultat est une combinaison de la valeur courante et de la valeur désirée ; donc s'il y a une erreur sur la valeur courante, correspondant à l'identifiant de la fonction avant changement, l'identifiant résultant est lui aussi erroné. Une erreur est propagée par une modification, au lieu d'être écrasée par celle-ci, et si elle n'a pas été détectée, elle peut l'être ultérieurement. L'étape 1100 de mise à jour des valeurs du registre au fur et à mesure de l'exécution du programme résulte soit en une étape 1200 de génération d'une interruption (dans le cas où une erreur s'est produite, ou un changement de module a eu lieu) soit en une réitération 1300 de cette étape 1100. Au cours des itérations, le circuit de traitement 11 peut également exécuter une commande CFU_CTRL, référencée 1400 pour contrôler les valeurs de tous les champs du registre, à l'exception du champ « LVL ». Tout écart entre la valeur de contrôle (la valeur écrite) et la valeur courante entraîne l'activation d'un drapeau d'erreur « ERR.a = 1 » et la génération d'une interruption matérielle 1200. Ce procédé est mis en oeuvre jusqu'à la fin de l'exécution du programme. Les commandes décrites ci-avant permettent de contrôler la bonne exécution du logiciel par un module matériel, ce qui réduit fortement la taille de code propre au programme et le temps d'exécution de code destinés à ce contrôle. En outre, l'utilisation d'une interruption matérielle favorise la maîtrise des cas d'exception.15 REVENDICATIONS1. Procédé de suivi de l'exécution d'un programme mis en oeuvre par ordinateur, ledit programme intégrant dans ses instructions un ensemble de balises (B) permettant le contrôle de ses étapes d'exécution, caractérisé en ce que lors du franchissement d'une balise (B) dans le flux des étapes d'exécution du programme, on transmet en entrée d'une unité de suivi d'exécution des données d'identification associées à cette balise, ladite unité comprenant un registre (10) et un circuit de traitement (11) à portes logiques configure pour lire les données mémorisées dans le registre (10) et mettre en oeuvre sur ces données et sur les données d'identification reçues en entrée par l'unité de suivi d'exécution, des opérations adaptées pour contrôler les données d'identification reçues, ledit circuit de traitement générant ou non une interruption de l'exécution du programme en fonction du résultat de ces opérations. 2. Procédé selon la revendication 1, dans lequel, les données d'identification d'une balise comportent une valeur de compteur de suivi d'exécution associée à la balise, le registre comportant un champ (CPT) correspondant, le circuit de traitement (11) comparant la valeur de compteur de la balise à la valeur de compteur du champ correspondant dans le registre (10) et mettant à jour cette dernière valeur par incrémentation du champ correspondant dans le registre, lors d'un franchissement de balise (B). 3. Procédé selon la revendication précédente, dans lequel, les données d'identification d'une balise comportent des données d'identification de fonction associées à la balise, le registre comportant un champ (FID) correspondant, le circuit de traitement (11) comparant les données de la balise à celles de ce champ dans le registre et, lors d'un franchissement d'une balise à l'occasion de l'appel de l'exécution d'une seconde fonction dans le cours de l'exécution d'une première fonction, remplaçant dans le champ (FID) d'identification de fonction du registre (10) des données d'identification de la première fonction par des données d'identification de la seconde fonction. 4. Procédé selon la revendication 3, dans lequel la première et la deuxième fonctions appartiennent à des modules différents, et le circuit de traitement (11) remplaçant en outre dans un champ d'identification de modules (MID) du registre (10) des données dépendant du module de la première fonction par des données dépendant du module de la seconde fonction, les données d'identification d'une balise comportant des données d'identification de module que le circuit de traitement (11) compare à celles du champ correspondant dans le registre. 5. Procédé selon l'une des revendications 3 ou 4, dans lequel les données dépendant de la seconde fonction ou du second module sont obtenues respectivement par application de l'opérateur « ou exclusif bit à bit» entre les données de la première fonction ou du premier module et un identifiant de la seconde fonction ou du second module. 6. Procédé selon l'une des revendications précédentes, dans lequel, à chaque mise à jour des données des champs d'identification du registre, le circuit de traitement (11) met à jour des données d'un champ (LVL) de suivi et de contrôle des modifications des champs d'identification. 7. Procédé selon la revendication précédente, dans lequel, à chaque mise à jour des données du champ (LVL) de suivi et de contrôle des modifications des champs d'identification, le circuit de traitement (11) remet à zéro la valeur du compteur (CPT) de suivi d'exécution du programme (CPT). 8. Unité de suivi d'exécution d'un programme, comprenant sur un même support matériel: - un registre (10), et - un circuit de traitement (11), à portes logiques configuré pour lire les données mémorisées dans le registre (10) et mettre en oeuvre le procédé selon l'une des revendications précédentes. 9. Unité de suivi d'exécution d'un programme selon la revendication précédente, dans lequel le registre (10) comprend 32 bits. 10. Carte à puce (2) comprenant une puce (20) et une unité de suivi d'exécution selon l'une des revendications 8 ou 9, le circuit de traitement (11) et le registre (10) étant fondus avec ladite puce.