La présente invention se rapporte à un procédé de sécurisation d'un
programme informatique et à un dispositif, notamment une carte à microcircuit (aussi appelée "carte à puce") mettant en oeuvre un tel procédé. L'invention concerne également un dispositif de génération de la sécurisation
d'un programme associé à ce procédé.
Dans la suite de ce document, on entendra par sécurisation d'un programme informatique: - la détection d'attaques mal intentionnées visant à perturber le comportement normal d'un programme informatique; mais aussi - tout traitement visant à fiabiliser le déroulement d'un programme informatique et notamment celui d'un programme s'exécutant dans un environnement très perturbé, comme un satellite, ou celui d'un programme informatique à forte exigence de fiabilité comme par exemple un programme de contrôle d'un implant cardiaque.
Par ailleurs, on entendra par programme informatique, tout programme, quel que soit le langage informatique et les moyens de mémorisation utilisés. Par exemple, et de façon non limitative, le programme informatique peut être écrit en langage machine, assembleur, C, C++, Java, VHDL. Le programme peut être mémorisé dans une mémoire permanente, par exemple dans une mémoire ROM ou EEPROM ou sur un disque dur, ou dans une mémoire volatile, par exemple de type RAM. Le programme peut être également matérialisé par un circuit intégré, par exemple de type FPGA ou même d'un circuit ASIC (Application Specific Integrated Circuit).
La présente invention vise en particulier la détection d'une attaque destinée à modifier le déroulement de l'exécution d'un programme informatique s'exécutant sur une entité électronique sécurisée, par exemple une carte à microcircuit, une carte PCMCIA sécurisée (par exemple une carte IBM4758), une clef USB ou un passeport intégrant une puce sans contact dans une de ses pages, et le déclenchement d'une contre-mesure à cette attaque.
La présente invention vise tout particulièrement à détecter des attaques par perturbation du fonctionnement d'une entité électronique, par exemple les attaques de type attaques par génération de fautes (en anglais "Fault Attack").
Ces attaques visent à modifier illicitement le contenu ou la lecture du contenu d'un registre, d'une mémoire ou d'un bus, ou à obliger un processeur à ne pas ou mal exécuter certaines instructions d'un programme informatique. Le programme informatique attaqué peut alors se dérouler d'une façon très différente de celle qui avait été prévue au moment de sa conception.
Ces attaques peuvent, entre autres et de façon connue, être effectuées: en générant un pic de tension à l'une des bornes d'alimentation du processeur; - en élevant brusquement sa température; - en changeant rapidement sa fréquence d'horloge ou sa tension d'alimentation; - en appliquant un flash de lumière, un rayon laser, ou un champ électromagnétique, sur une partie du silicium qui le compose.
De telles attaques sont particulièrement actives sur certaines instructions d'un programme, notamment les instructions de branchements conditionnels et inconditionnels.
On rappellera à cet effet que les instructions de branchement sont par exemple les instructions if , case , en langage C. La compilation de telles instructions de branchement en langage assembleur produit une instruction de saut conditionnel ou inconditionnel vers une adresse ou une instruction du programme à atteindre. L'instruction à atteindre est repérée par une étiquette dans un programme en assembleur. Selon le langage assembleur 8051, les instructions de saut conditionnels ou inconditionnels du langage C sont traduites en instructions de type jnz (qui peut être traduit par saut si le résultat de l'instruction précédente est non égal à 0 ), jz (que l'on peut traduire par saut si le résultat de l'instruction précédente est égal à 0 ), jmp (qui peut être traduit par saut ).
Une fois compilée en langage machine, l'instruction à atteindre est identifiée par son adresse passée en argument (ou paramètre) de l'instruction de saut. Cette adresse est soit un incrément ou un décrément en nombre d'octets par rapport à l'adresse de l'instruction de saut, encore appelée adresse relative, soit une adresse absolue, c'est-à- dire, une adresse fixe au sein de la mémoire. Les instructions de saut comportent le plus souvent une adresse relative de saut.
L'adresse relative représente la différence d'octets entre l'adresse de l'instruction à atteindre et l'adresse de l'instruction de saut.
Lors d'une attaque par faute, l'exécution d'une instruction de saut peut dans une très grande majorité des cas être perturbée, lors par exemple, d'une attaque par faute, entraînant un saut vers une adresse non prévue par le programme initiall. En effet, lors de la perturbation d'une telle instruction, le résultat obtenu est équivalent à une modification de la valeur de l'adresse passée en argument de l'instruction de saut. Cette valeur est modifiée de manière aléatoire. Ainsi si l'adresse du saut est une adresse relative, l'adresse qui serait atteinte par l'instruction de saut ainsi perturbée, serait une adresse comprise dans l'ensemble des adresses accessibles à partir de l'adresse de saut.
Ainsi, par exemple, lorsque l'adresse relative passée en argument de l'instruction de saut est codée sur un octet, soit 8 éléments binaires, une attaque par faute de cette adresse provoque un saut dans une zone mémoire comprise entre - (2' - 1) et 2' 1 octets soit entre -127 et + 127 octets par rapport à l'adresse de l'instruction de saut. L'adresse atteinte par le saut suite à l'attaque par génération de faute est équiprobable sur cet intervalle. Selon le langage assembleur utilisé, l'adresse relative peut aussi être codée sur 2 ou 3 octets voire plus, dans une zone mémoire d'autant plus importante.
Etant donné que les instructions sont codées et mémorisées, par exemple sur 2 ou 3 octets, la zone d'instructions précédant et suivant l'instruction de saut définie par l'adresse relative, se compose donc typiquement d'une centaine d'instructions au maximum.
La modification de l'adresse résultante du saut peut entraîner l'accès de façon non autorisée à une instruction critique du programme ou à des données sensibles, par exemple des clés et donc permettre à un attaquant la mise en péril de la sécurité du système.
Selon l'état actuel de la technique, l'homme du métier dispose de différents moyens pour sécuriser un programme informatique et notamment pour lutter contre les attaques par génération de fautes dans une carte à microcircuit.
Une méthode consiste à installer, dans les composants des cartes à microcircuit, des capteurs qui permettent de détecter de telles attaques.
L'efficacité d'une telle méthode est néanmoins restreinte car il est en pratique impossible de mettre des capteurs sur toute la surface de ce composant. Par ailleurs ces capteurs étant également composés de silicium, il est également possible de les perturber ou de modifier les informations qu'ils transmettent.
La présente invention vise une méthode de sécurisation de type logiciel et ne présentant pas les inconvénients précédents.
A cet effet, elle propose un procédé de sécurisation d'un programme informatique contre des attaques par faute. Ce procédé est applicable notamment dans une carte à puce. Selon ce procédé, on identifie dans le programme au moins une instruction de saut comportant une adresse relative choisie parmi une pluralité d'adresses relatives possibles, et permettant d'atteindre une adresse visée au sein d'une zone mémoire s'étendant avant et après de cette instruction de saut et regroupant cette pluralité d'adresses relatives possibles. Au sein de cette zone mémoire, on identifie une instruction à préserver. Pour sécuriser au moins cette instruction, on insère au moins un premier lot non opérant comportant au moins une instruction, cette insertion étant réalisée de telle sorte que: - cette insertion est compatible avec le maintien de l'adresse visée par l'instruction de saut à l'intérieur de la zone mémoire, - cette insertion est compatible avec le déroulement normal du programme.
Le procédé de sécurisation selon l'invention consiste donc à insérer une ou plusieurs instructions au sein de la zone mémoire s'étendant en amont et en aval de l'instruction de saut, et comprenant toutes les adresses accessibles à partir de l'adresse relative visée par l'instruction de saut, soit une zone mémoire allant de -127 octets à +127 octets lorsque cette adresse relative est codée sur un octet.
Ainsi, la sécurité de l'instruction à préserver est accrue. En effet, lors d'une attaque par faute générant une modification de l'adresse relative atteinte par l'instruction de saut, l'instruction à préserver a moins de chance d'être atteinte, et donc, cette instruction a moins de chance d'être exécutée à un moment où cela n'est pas prévu, tandis que les instructions insérés sont privilégiées.
Les instructions insérées forment un lot, et ce lot est non opérant, c'est-à-dire qu'il ne modifie pas le comportement fonctionnel du programme lors d'une exécution normale du programme. Les instructions composant un lot sont notamment, l'instruction vide (par exemple en assembleur l'instruction nop signifiant non opérant ), ou une instruction n'ayant aucun effet sur le résultat de l'exécution du programme à elle seule ou combinée avec d'autres instructions en fonctionnement normal.
Lors d'une attaque ou d'une perturbation de l'exécution, selon l'invention, on a une certaine probabilité de tomber dans les lots non opérant. L'insertion du lot non opérant peut impliquer une modification de l'argument de l'instruction de saut pour atteindre l'adresse visée.
Cependant, l'insertion de lot non opérant doit être compatible avec le maintien de cette adresse visée par l'instruction de saut à l'intérieur de la zone mémoire précédemment définie.
En plus d'instructions à préserver, le programme peut comporter des instructions qui sont au contraire à favoriser pour la sécurité du déroulement du programme. En particulier, après un test, les instructions à effectuer en cas de test valide sont généralement à préserver tandis que les instructions en cas de test invalide sont souvent à favoriser. C'est pourquoi, selon un mode de réalisation particulier, le procédé comprend les étapes suivantes: identification dans le programme d'un lot sécuritaire comportant au moins une instruction à exécuter, - insertion d'un lot non opérant, distinct ou non du premier lot opérant, précédant le lot sécuritaire identifié et propre à en favoriser l'exécution.
Ce mode de réalisation implique donc, d'une part d'identifier un lot sécuritaire, c'est-à-dire un ensemble d'instructions réalisant une action sensible, dont la non exécution peut mettre en péril la sécurisation du système, puis, d'autre part, de favoriser l'exécution du lot sécuritaire identifié, étant donné que ce lot doit être exécuté pour la sécurité du programme et de la carte, en insérant précédernment à ce lot un lot non opérant qui améliore la probabilité d'exécuter ce lot sécuritaire. Ainsi en cas de fautes, une instruction de saut peut atteindre ce lot non opérant qui va forcer l'exécution les instructions du lot sécuritaire, assurant ainsi que ce lot est exécuté.
La nature du premier lot non opérant peut dépendre des positions relatives de l'instruction de saut, de l'adresse visée par le saut et de l'instruction à préserver.
Lorsqu'on ne veut pas avoir à tenir compte de ces positions relatives, dans un premier mode de réalisation, le premier lot non opérant est inséré dans le programme de manière à ce qu'une instruction de contournement empêche normalement l'exécution des instructions du lot non opérant et qu'une instruction d'éjection vers un programme d'action, à la fin du lot non opérant, empêche l'exécution d'instructions en aval de ce lot non opérant Ce mode de réalisation est particulièrement avantageux car en fonctionnement normal du programme ou lorsque l'instruction de saut atteint normalement une instruction en amont du lot non opérant inséré, une instruction de contournement empêche l'exécution d'instructions de ce lot non opérant.
En effet, en l'absence d'instruction de type saut, appel de sous programme ou de type retour au programme appelant (instruction assembleur ret , en anglais return ) précédant le premier lot non opérant, ce lot serait atteint. La présence d'une instruction de contournement évite un tel inconvénient.
Ainsi, de manière avantageuse, lors d'un fonctionnement normal du programme, ce lot non opérant d'instructions inséré n'est pas exécuté, et donc les performances du programme (performances modifiées, induites par l'ajout de lot d'instructions) ne sont quasiment pas modifiées.
De plus, une instruction d'éjection située sensiblement à la fin du lot non opérant inséré est présente de telle sorte que, dans le cas d'une perturbation de l'instruction de saut, le saut atteigne ce premier lot non opérant d'instructions, cette instruction d'éjection empêche l'exécution d'instructions en aval du lot non opérant et donc empêche l'exécution de l'instruction à préserver si celle-ci est en aval de ce lot. Dans ce cas, la sécurité du système est grandement augmentée puisque ce lot non opérant, exécuté en cas de faute, évite d'atteindre l'instruction à préserver et exécuter cette instruction à préserver à un moment où cela n'est pas prévu. En fait, même lorsque ce lot non opérant n'est pas inséré avant l'instruction à préserver, la sécurité est améliorée par le simple fait qu'il y a éjection si le saut aboutit, suite à une par perturbation, dans ce lot non opérant.
Selon une caractéristique avantageuse, le programme d'action comprend un lot sécuritaire comportant au moins une instruction à exécuter.
En effet, selon un mode d'exécution particulier, le programme d'action comprend des instructions dont l'exécution doit être réalisée pour la sécurité du programme. Ainsi, la sécurisation du programme est sensiblement améliorée du fait que l'on augmente, en cas de perturbation, la probabilité d'exécuter un lot sécuritaire comprenant une suite d'instructions importantes pour la sécurité du programme.
Selon une première variante de réalisation, l'instruction de contournement fait partie du programme à sécuriser et précède le lot non opérant de telle sorte que ce lot non opérant n'est normalement pas exécuté.
Selon une seconde variante de ce mode de réalisation, l'instruction de contournement est au début du lot non opérant et renvoie vers la première instruction du programme en aval de ce lot non opérant Dans ce cas, le lot non opérant peut être inséré en aval d'une instruction quelconque de programme, la première instruction de ce lot (instruction de contournement) renvoyant vers cette instruction.
Il mérite d'être noté que les différents modes de réalisation empêchant l'exécution de lots non opérant limitent les pertes de performances potentielles dues à l'insertion de code.
Certaines règles de positionnement du premier lot non opérant peuvent être avantageuses et permettre une simplification de la structure de ce lot. C'est ainsi que, de manière préférée, l'insertion du premier lot non opérant est effectuée après la première des dites instructions de saut ou à préserver.
Cette caractéristique contribue avantageusement à la sécurisation d'un programme ainsi que cela apparaît ci-dessous.
Selon un premier mode de réalisation du procédé de sécurisation, l'insertion du lot non opérant est effectuée entre l'instruction à préserver et l'instruction de saut si cette instruction à préserver précède l'instruction de saut.
Cette caractéristique est particulièrement avantageuse, en effet elle a pour fonction d'éloigner l'instruction à préserver de l'instruction de saut par insertion de lots entre les deux instructions, et de remonter cette instruction à préserver au sein de la zone mémoire accessible à partir de l'adresse de l'instruction de saut et précédant l'instruction de saut. L'instruction à préserver étant remontée au sein de la zone mémoire précédant l'instruction de saut, en cas de perturbation de l'adresse relative du saut, les chances d'exécuter cette instruction se trouvent diminuées malgré le fait que les adresses sont accessibles de manière équiprobable. En effet, lors d'un saut, l'exécution se poursuit en incrémentant l'adresse des instructions, la probabilité d'exécuter l'instruction à préserver après insertion de lot non opérant s'en trouve diminuée.
Avantageusement, lorsque, en outre, l'instruction à préserver précède l'adresse visée par l'instruction de saut, le lot non opérant comporte un nombre d'instructions tel que, après insertion, l'instruction à préserver est en amont de la zone mémoire accessible par l'instruction de saut.
Préférentiellement, le lot non opérant comprend au minimum m instructions avec m = 2n-' + l'adresse relative (avant sécurisation) de l'instruction à préserver par rapport à l'instruction de saut, n étant le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée.
Ainsi, l'insertion du lot non opérant est effectuée de telle sorte que celle-ci entraîne la sortie de l'instruction à préserver de la zone mémoire précédant l'instruction de saut, rendant son accès impossible à partir de l'instruction de saut.
De manière alternative, lorsque l'adresse visée par l'instruction de saut précède l'instruction à préserver, alors le lot non opérant comprend au maximum p instructions avec p = 2n"' -1 + l'adresse relative (avant sécurisation) visée par l'instruction de saut, n étant le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée, grâce à quoi l'instruction cible reste dans la zone mémoire après sécurisation.
En effet, afin de respecter la contrainte que l'insertion doit être compatible avec le maintien de l'adresse visée par l'instruction de saut à l'intérieur de la zone mémoire précédant l'adresse de saut, lorsque l'instruction à préserver est présente dans la zone définie par l'adresse de saut de l'instruction de saut et l'instruction de saut, alors le nombre d'instructions que contient le lot non opérant est limité de manière à ne pas faire sortir l'instruction présente à l'adresse visée par l'instruction de saut.
Préférentiellement, le lot non opérant est inséré de manière à n'être exécuté qu'en cas de perturbation de l'instruction de saut, une instruction de contournement empêchant normalement l'exécution d'instructions de ce lot non opérant.
Ainsi de manière avantageuse, lors d'un fonctionnement normal du programme, ce lot non opérant d'instructions inséré n'est pas exécuté, et donc la perturbation en termes de performance du programme, perturbation de performance induite par l'ajout de lot d'instructions, s'en trouve très limitée.
De manière avantageuse, ce lot comporte également à la fin du lot non opérant, une instruction d'éjection empêchant l'exécution d'instructions en aval de ce lot non opérant.
Cette instruction est présente de telle sorte que, dans le cas d'une perturbation de l'instruction de saut, le saut atteint un lot non opérant d'instructions, une instruction d'éjection empêche l'exécution d'instructions en aval du lot non opérant et donc empêche l'exécution de l'instruction en aval du lot non opérant.
Selon un second mode de réalisation du procédé de sécurisation, l'insertion de lot non opérant est effectuée entre l'instruction de saut et l'instruction à préserver de manière à n'être exécuté qu'en cas de perturbation de l'instruction de saut, et une instruction d'éjection à la fin du lot non opérant empêche l'exécution d'instructions en aval de ce lot non opérant.
Ainsi, lorsque l'insertion de lot non opérant s'effectue en aval de l'instruction de saut et que cette dernière précède l'instruction à préserver, alors cette insertion permet de repousser l'instruction à préserver vers l'extérieur de la zone mémoire suivant l'instruction de saut. Le risque qu'après perturbation de l'adresse de l'instruction de saut, cette instruction atteigne une instruction à préserver est donc diminué.
Avantageusement, lors d'insertion de lot entre l'instruction de saut et l'instruction à préserver, ce lot doit contenir au minimum une instruction d'éjection. Cette dernière permet en cas de perturbation de l'instruction de saut, le saut atteignant ce lot, d'empêcher l'exécution d'instructions en aval de ce lot et donc de l'instruction à préserver.
Préférentiellement, le lot non opérant est inséré juste en amont l'adresse visée par l'instruction de saut lorsque l'adresse visée par l'instruction de saut est en amont de l'instruction à préserver.
Ainsi de manière avantageuse, lors d'un fonctionnement normal du programme, ce lot non opérant d'instructions inséré n'est pas exécuté, et donc la perturbation en termes de performance du programme, perturbation de performance induite par l'ajout de lot d'instructions, s'en trouve très limitée.
Selon une variante de réalisation, une instruction de contournement empêche normalement l'exécution d'instructions du lot non opérant.
Préférentiellement, l'instruction de contournement est au début du lot non opérant, et renvoie vers la première instruction du programme en aval de ce lot non opérant.
Avantageusement, selon ces modes de réalisation, le lot non opérant peut être inséré en aval d'une instruction de programme, quelque soit cette instruction de programme. Ainsi afin de ne pas exécuter en fonctionnement normal le lot non opérant inséré et donc arriver sur une instruction d'éjection, la première instruction de ce lot est une instruction de contournement de ce lot renvoyant vers la première instruction en aval de ce lot.
De plus, les différents modes de réalisation empêchent l'exécution de lots non opérant et donc limitent les pertes de performances potentielles dues à l'insertion de code.
Avantageusement, lorsque l'instruction à préserver précède l'adresse visée par l'instruction de saut, le lot non opérant comprend au maximum q instructions avec q = 2n-1 -1 - adresse relative visée par l'instruction de saut, n étant le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée, grâce à quoi l'instruction cible reste dans la zone mémoire après sécurisation.
En effet, afin de préserver la contrainte telle que l'insertion est compatible avec le maintien de l'adresse visée par l'instruction de saut à l'intérieur de la zone mémoire, le nombre d'instructions non opérantes susceptibles d'être ajoutées est limité.
Ainsi, il n'est nullement possible de repousser l'instruction visée par l'instruction de saut en dehors de la zone mémoire suivant l'instruction de saut.
L'effet de la sécurisation est atteint, en cas d'erreur. Or cet effet est d'autant plus probable que la taille du lot non opérant est importante.
Dans l'alternative où la première instruction est l'instruction de saut et que l'adresse visée par l'instruction de saut précède l'instruction à préserver, le lot non opérant est inséré entre l'adresse visée par l'instruction de saut et l'instruction à préserver.
L'insertion de lots non opérant entre l'adresse visée par l'instruction de saut et l'instruction à préserver, permet de repousser l'instruction à préserver à l'extérieur de la zone mémoire accessible après l'instruction de saut.
Selon une caractéristique, l'instruction à préserver est à la fin de la zone mémoire après l'instruction de saut.
De rnanière préférentielle, le lot non opérant comporte un nombre d'instructions tel que après insertion, l'instruction à préserver est en aval deÉla zone mémoire.
Ainsi, l'insertion de lot entraîne la sortie de l'instruction à préserver de la zone mémoire précédant l'instruction de saut, rendant son accès impossible à partir de l'instruction de saut.
Selon ce mode de réalisation, le lot non opérant comprend au minimum r instructions, avec r = 2n-1 - l'adresse relative de l'instruction à préserver par rapport à l'instruction de saut, n étant le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée.
Selon une troisième variante de réalisation, l'insertion est effectuée après la seconde des dites instructions du programme de manière à ce qu'une instruction de contournement empêche normalement l'exécution des instructions du lot et qu'une instruction d'éjection à la fin du lot empêche l'exécution d'instructions en aval de ce lot.
Préférentiellement l'instruction de contournement fait partie du programme à sécuriser et précède le lot non opérant de telle sorte que ce lot non opérant n'est normalement pas exécuté.
Alternativement, l'instruction de contournement est au début du lot non opérant renvoyant vers la première instruction du programme en aval de ce lot non opérant.
Avantageusement, selon ces modes de réalisation, le lot non opérant peut être inséré en aval d'une instruction de programme, quelque soit cette instruction de programme. Ainsi afin de ne pas exécuter en fonctionnement normal, le lot non opérant inséré et donc arriver sur une instruction d'éjection, la première instruction de ce lot est une instruction de contournement de ce lot renvoyant vers la première instruction en aval de ce lot.
De plus, les différents modes de réalisation empêchent l'exécution de lots non opérant et donc limite les pertes de performances potentiels dues à l'insertion de code.
Selon une caractéristique, l'instruction à préserver précédant le lot sécuritaire, l'instruction à préserver et le lot sécuritaire étant du même côté par rapport à l'instruction de saut, l'insertion du lot non opérant est effectuée entre l'instruction à préserver et le lot sécuritaire.
Ainsi, lorsque l'on souhaite davantage favoriser le lot sécuritaire que de protéger l'instruction à préserver, l'insertion du lot non opérant est effectuée de manière à conduire l'exécution du programme vers le lot sécuritaire en cas d'attaque. Selon cette méthode, l'exécution du lot sécuritaire est favorisée, toutefois, en préservant l'instruction à préserver Plus particulièrement, lorsque l'instruction à préserver est juste après l'instruction de saut, alors l'insertion du lot non opérant est tel que le lot sécuritaire est à la fin de la zone mémoire.
De cette manière, la zone mémoire suivant l'instruction de saut comprend l'instruction à préserver juste après l'instruction de saut, puis la zone mémoire est remplie d'un ensemble d'instructions non opérantes formant un lot non opérant, de tel sorte que le lot sécuritaire est à la fin de la zone mémoire.
Alternativement, lorsque le lot sécuritaire est juste avant l'instruction de saut, alors l'insertion du lot non opérant est telle que l'instruction à préserver est au début de la zone mémoire.
Selon une autre caractéristique, le lot sécuritaire précède l'instruction à préserver, le lot sécuritaire et l'instruction à préserver sont du même côté par rapport à l'instruction de saut, l'insertion du lot non opérant est en amont du lot sécuritaire et est effectuée du même côté que le lot sécuritaire par rapport à l'instruction de saut.
Ainsi, lorsque l'on souhaite davantage favoriser le lot sécuritaire que deprotéger l'instruction à préserver, alors l'insertion du lot non opérant est effectuée de manière à conduire l'exécution du programme vers le lot sécuritaire en cas d'attaque. Selon cette méthode, l'exécution du lot sécuritaire est favorisée, toutefois, en préservant l'instruction à préserver Plus particulièrement, l'insertion du lot non opérant est telle que l'instruction à préserver est à la fin de la zone mémoire.
Selon un mode particulier de réalisation de l'invention, après insertion d'un lot non opérant, on identifie au sein de cette zone mémoire au moins une autre instruction à préserver et, pour sécuriser cette autre instruction, on insère un autre lot non opérant comportant au moins une instruction, cette instruction étant exécutée en respectant les dites conditions.
Selon un autre mode de réalisation de l'invention, avant insertion d'un lot non opérant, on identifie au sein de cette zone mémoire au moins une autre instruction à préserver, et on insère le lot non opérant de sorte à respecter les conditions vis-à-vis de chacune des instructions à préserver.
Avantageusement, après sécurisation de la zone mémoire s'étendant avant et après l'instruction de saut, cette zone mémoire comporte au moins 90% d'instructions faisant parties de lots non opérant insérés.
Ainsi la dite zone mémoire comportant au moins 90% d'instructions issues de lots non opérant insérés, on maximise la probabilité suite à une perturbation d'atteindre une instruction d'un lot non opérant, limitant ainsi le risque d'atteindre une instruction à préserver.
Selon un mode de réalisation, un lot non opérant comprend une pluralité d'instructions.
Selon une variante de l'invention, le lot non opérant comprend au moins une instruction d'éjection vers un programme d'action.
Ce mode de réalisation permet non pas de limiter les effets d'une perturbation mais également de détecter ces perturbations et de lancer des programmes d'action dans le but de contrer des attaques ou de fiabiliser le déroulement d'un programme.
De manière alternative, le lot non opérant inséré comprend au moins une instruction d'éjection vers un sous programme d'action.
Selon une caractéristique, le programme d'action comprend un lot sécuritaire comportant au moins une instruction à exécuter.
En effet, selon un mode d'exécution particulier, le programme d'action comprend des instructions dont leur exécution doit être réalisée pour la sécurité du programme. Ainsi, la sécurisation du programme est sensiblement améliorée du fait que l'on augmente, en cas de perturbation, la probabilité d'exécuter une suite d'instructions importantes pour la sécurisation du programme.
Avantageusement le programme d'action comprend des instructions de fin prématurée d'exécution du programme.
Selon ce mode de réalisation, le programme a détecté une attaque ou une perturbation lors de l'exécution, ce qui entraîne la fin de l'exécution du programme.
De manière alternative, le programme d'action comprend des instructions de réinitialisation de l'exécution du programme.
L'invention concerne également un procédé d'exécution sécurisé d'un programme contre des attaques par faute, notamment dans une carte à puce. Le procédé met en oeuvre une étape de sécurisation du programme selon l'invention préalablement à l'exécution dudit programme.
Corrélativement, l'invention concerne un dispositif de sécurisation d'un programme comprenant un moyen pour identifier dans ce programme au moins une instruction de saut comportant une adresse relative choisie parmi une pluralité d'adresses relatives possibles, et permettant d'atteindre une adresse au sein d'une zone mémoire s'étendant avant et après cette instruction de saut et regroupant toutes les adresses accessibles à partir de l'adresse relative, un moyen pour identifier une instruction à préserver au sein de la zone mémoire et, un moyen pour insérer au moins un lot non opérant comportant au moins une instruction pour sécuriser au moins cette instruction.
Ce dispositif présente les mêmes avantages que le procédé de sécurisation d'un programme contre des attaques par faute brièvement décrit ci-dessus.
L'invention vise aussi un support d'informations lisible par un système informatique, éventuellement totalement ou partiellement amovible, notamment CD-ROM ou support magnétique, tel un disque dur ou une disquette, ou support transmissible tel un signal électrique ou optique, ce support d'informations comportant des instructions d'un programme informatique permettant la mise en oeuvre d'un procédé de sécurisation tel que décrit brièvement ci-dessus, lorsque ce programme est chargé et exécuté par un système informatique.
L'invention vise également un programme d'ordinateur stocké sur un support d'informations, ce programme comportant des instructions permettant la mise en oeuvre d'un procédé de sécurisation tel que décrit brièvement ci-dessus, lorsque ce programme est chargé et exécuté par un système informatique.
Les avantages et caractéristiques particulières propres aux support d'information, au programme d'ordinateur et à la carte à microcircuit étant les mêmes que ceux exposés ci-dessus concernant le procédé de sécurisation selon l'invention, ils ne seront pas rappelés ici.
D'autres aspects et avantages de la présente invention apparaîtront plus clairement à la lecture de la description de modes particuliers de réalisation qui va suivre, cette description étant donnée uniquement à titre d'exemple non limitatif, en regard des dessins annexés sur lesquels: la figure 1 est un schéma de principe du procédé de sécurisation selon l'invention, dans un cas où l'instruction à préserver précède l'instruction de saut.
La figure 2 est un cas particulier de la figure 1 où l'instruction à préserver précède en outre l'adresse visée par l'instruction de saut.
- La figure 3 est un autre cas particulier de la figure 1 où par contre, l'adresse visée par l'instruction de saut précède l'instruction à préserver.
- La figure 4 est un schéma de principe du procédé de sécurisation selon l'invention, dans un cas où l'instruction de saut précède l'instruction à préserver.
- La figure 5 est un autre cas particulier de la figure 4 où l'instruction à préserver précède l'adresse visée par l'instruction de saut.
- La figure 6 est un autre cas particulier de la figure 4 où l'adresse visée par l'instruction de saut précède l'instruction à préserver.
- La figure 7 est un troisième schéma de principe du procédé de sécurisation selon l'invention, dans un cas où l'instruction de saut précède l'instruction à préserver.
- La figure 8 est un second schéma de principe du procédé de sécurisation selon l'invention, dans un cas où l'instruction de saut précède l'instruction à préserver.
La figure 9 est un exemple de programme informatique susceptible d'être sécurisé par un procédé de sécurisation conforme à la présente invention.
- La figure 10 est le code assembleur obtenu après exécution du procédé de sécurisation selon l'invention sur l'exemple de la figure 9. La figure 11 est un second exemple de programme informatique susceptible d'être sécurisé par un procédé de sécurisation conforme à la présente invention.
La figure 12 est le code assembleur après exécution du procédé de sécurisation selon l'invention sur l'exemple de la figure 11 de telle sorte que l'instruction à préserver se trouve en amont de la zone mémoire accessible par l'instruction de saut.
- La figure 13 est un troisième exemple de programme informatique susceptible d'être sécurisé par un procédé de sécurisation conforme à la présente invention.
- La figure 14 est le code assembleur après exécution du procédé de sécurisation selon l'invention sur l'exemple de la figure 13 de telle sorte que les instructions insérées comprennent une instruction de contournement et une instruction d'éjection.
La figure 15 est le code assembleur après exécution du procédé de sécurisation selon l'invention appliqué avec une instruction de saut conditionnel.
La figure 16 est une alternative de code assembleur après exécution du procédé de sécurisation selon l'invention appliqué avec une instruction de saut conditionnel.
On peut généralement identifier dans un programme des instructions à préserver, à n'exécuter qu'à bon escient, et des instructions à favoriser, dont l'exécution contribue à la fiabilité du programme. C'est ainsi, notamment, que les instructions à exécuter après vérification de divers tests peuvent souvent être considérées comme des instructions sensibles qu'il vaut mieux préserver, tandis que les instructions de correction, à exécuter lorsque les tests sont négatifs, peuvent souvent être considérées comme des instructions sécuritaires qu'il vaut mieux favoriser.
On peut noter ainsi qu'après un test, on peut généralement identifier une alternative entre une instruction à préserver et une instruction à favoriser et que le fait de réduire les chances que l'instruction à préserver soit exécutée en cas de perturbation ou de perturbation du saut revient souvent à augmenter la probabilité d'exécuter d'autres instructions.
Pour ce faire, on peut insérer dans le programme de départ un lot non opérant qui est compatible avec le maintien de l'adresse visée par l'instruction de saut à l'intérieur de la zone mémoire accessible et qui ne perturbe pas le déroulement normal du programme.
Une solution générale consiste, en un quelconque endroit, à insérer un lot commençant par une instruction de contournement qui envoie vers l'instruction suivant ce saut et se terminant par une instruction d'éjection vers un programme ou sous-programme d'action (réinitialisation, répétition du test, tests complémentaires, etc, voire destruction de la carte).
Un tel lot agit ainsi comme un piège détectant des résultats erronés de saut, notamment des résultats d'un saut perturbé par une attaque.
Toutefois divers cas particuliers peuvent être identifiés qui améliorent spécifiquement la préservation de l'instruction à préserver (en favorisant éventuellement des instructions sécuritaires) et / ou simplifient la constitution des lots non opérants. Les cas particuliers peuvent être définis en référence aux positions relatives de l'instruction à préserver et de l'instruction de saut, voire de l'adresse visée par le saut.
II importe ici de noter qu'il peut y avoir un choix arbitraire des instructions de saut et des instructions à préserver (ou a contrario des instructions à favoriser) et que, dans un programme donné, on peut choisir de ne pas sécuriser tous les sauts relatifs ni de préserver toutes les instructions sensibles.
En référence à la figure 1, il est montré un schéma de principe selon l'invention, dans lequel une instruction de saut est suivie d'une adresse relative permettant lors de son exécution d'atteindre une adresse mémoire représentée.
L'adresse passée en argument de l'instruction de saut est une adresse relative codée sur n éléments binaires. Par exemple, le nombre d'éléments binaires est 8 représentant un octet. Cette instruction permet d'exécuter un saut dans une mémoire allant de -(2""' -1) à 2n-1 -1. Selon l'exemple considéré, la zone mémoire accessible par l'instruction de saut va de 127 à + 127 octets.
Dans cette zone mémoire, il est identifié au moins une instruction à préserver. Une instruction à préserver est identifiée comme une instruction dangereuse pour la sécurité du système si elle est exécutée à un moment où cela n'est pas prévu. Ainsi une instruction à sécuriser peut se définir comme étant soit une instruction à exécuter seulement au moment opportun, soit une instruction à exécuter obligatoirement à un moment donné au cours de l'exécution du programme.
Dans le cas de la figure 1, une instruction à préserver est identifiée dans la zone pouvant être accédée par une instruction de saut et en amont de cette instruction de saut.
En cas d'attaque sur l'instruction de saut, cette instruction peut atteindre de manière équiprobable l'ensemble des instructions appartenant à la zone mémoire allant de -(2n"1 -1) à 2"-1 -1.
Cependant, afin de limiter la probabilité d'atteindre l'instruction à préserver, il est inséré des instructions non opérant entre l'instruction à préserver et l'instruction de saut. Cette insertion a pour rôle de faire sortir l'instruction à préserver de la zone mémoire accessible par l'instruction de saut, tout en sachant que l'exécution du programme s'effectue par adresse croissante.
Ainsi, préférentiellement, l'instruction à préserver ne doit pas être positionnée à une adresse supérieure que son adresse initiale lors de l'insertion d'un lot opérant. En effet, lors d'une attaque sur l'adresse de saut, si le saut aboutit à une adresse inférieure ou à une adresse équivalente à l'instruction à préserver, et si l'instruction à préserver est positionnée à une adresse supérieure alors cette instruction à préserver sera exécutée.
Ces instructions non opérant formant un lot non opérant sont, par exemple des instructions dont les faits se neutralisent, c'est-à-dire par exemple, des instructions d'incrément et de décrément d'une variable, ou des instructions d'affectation d'une variable non utilisée dans le reste du programme.
Le lot non opérant, étant une suite d'instructions ayant aucun effet sur le programme, est inséré dans le programme de manière à ce que l'instruction de contournement empêche normalement l'exécution des instructions de ce lot et qu'une instruction d'éjection située à la fin de ce lot empêche l'exécution d'instructions en aval de ce lot.
En référence à la figure 1, le lot non opérant est inséré entre l'instruction à préserver et l'instruction de saut. Ce lot peut comporter en premier lieu, sensiblement dans les premières instructions, une instruction de contournement permettant d'atteindre l'instruction suivant le lot non opérant.
Si une instruction de contournement est située avant ce lot non opérant, alors le lot comporte de manière optionnelle cette instruction de contournement.
Cependant, l'insertion d'une telle instruction évite lors d'une exécution normale du programme, l'exécution de ce lot non opérant, n'introduisant ainsi aucune pénalité de temps d'exécution de ce programme.
De 'même, ce lot peut comprendre sensiblement à la fin, une instruction d'éjection vers un programme d'action, cette instruction empêchant l'exécution d'instructions en aval de ce lot.
L'instruction d'éjection est une instruction non opérant de type instruction de saut, ou instruction d'appel de sous programme qui a comme argument, l'adresse du programme d'action.
Ainsi, en cas d'attaque, lorsque l'instruction de saut aboutit au sein de ce lot non opérant, l'exécution de ce programme est déroutée vers un programme d'action.
Ce programme d'action est composé d'au moins une instruction visant à exécuter une contre-mesure ou plus généralement, un lot sécuritaire.
Par exemple, il peut s'agir d'un programme de destruction de la carte, l'exécution d'une boucle infinie ou la réinitialisation du programme. Il peut s'agir également d'un lot sécuritaire, c'est-à-dire un ensemble d'instructions réalisant une action sensible dont la non exécution peut mettre en péril la sécurisation du système. Par exemple, le lot sécuritaire peut être destiné à lire une clé sensible ou à réaliser une authentification avant d'autoriser un accès.
En référence à la figure 2, il est décrit un cas particulier où l'instruction à préserver précède l'adresse visée par l'instruction de saut.
Dans un tel cas, afin de protéger au mieux l'instruction à préserver, un lot non opérant doit être inséré entre l'instruction à préserver et l'adresse visée par le saut. Ainsi l'instruction à préserver est éloignée de l'instruction de saut et est préférablement sortie de la zone accessible par l'instruction de saut.
Préférentiellement, ce lot non opérant comporte un nombre d'instructions tel que, après son insertion, l'instruction à préserver est sortie de la zone mémoire accessible par l'instruction de saut.
Afin de faire sortir l'instruction à préserver de la zone mémoire accessible par l'instruction du saut, ce nombre d'instructions doit être au minimum de m = 2'1 + x, où n est le nombre d'éléments binaires sur lesquels l'adresse relative visée par l'instruction de saut est codée, et x l'adresse relative de l'instruction à préserver par rapport à l'instruction de saut.
En référence à la figure 3, il est décrit un autre cas particulier dans lequel l'adresse visée par l'instruction de saut précède l'instruction à préserver identifiée.
Dans un tel cas de figure, il est avantageusement inséré le lot d'instructions non opérant entre l'instruction à préserver et l'instruction de saut. En effet, de mêrne que pour les exemples de la figure 1 et de la figure 3, l'instruction à préserver est préférentiellement éloignée de l'instruction de saut. Cependant étant donné que l'adresse visée par l'instruction de saut a une adresse inférieure à celle de l'instruction à préserver, cette instruction à préserver ne peut pas être sortie de la zone mémoire accessible par l'instruction de saut.
Ainsi le nombre d'instructions que peut contenir le lot d'instructions non opérant inséré est au maximum de p instructions avec p = 2" 1 1 + y, où n est le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée, et y l'adresse relative visée par l'instruction de saut.
L'insertion d'un tel lot permet de remonter l'instruction à préserver de telle sorte que, au maximum, l'adresse visée par l'instruction de saut est la première adresse accessible dans la zone mémoire.
En référence à la figure 4, il est représenté un cas particulier où l'instruction de saut précède l'instruction à préserver.
Avantageusement, le lot non opérant est inséré entre l'instruction de saut et l'instruction à préserver.
Lorsque ce lot non opérant est exécuté suite à une attaque, ce lot comprend sensiblement à la fin de ce lot d'instructions, une instruction d'éjection empêchant l'exécution d'instructions en aval de ce lot.
Dans le cas où l'adresse visée par l'instruction de saut est en aval de l'instruction à préserver, le lot non opérant est inséré entre l'instruction de saut et l'instruction à préserver repoussant ainsi l'instruction à préserver de l'instruction de saut, tel que montré à la figure 5.
Si l'adresse visée par l'instruction de saut est en amont de l'instruction à préserver, alors le lot non opérant est préférentiellement inséré en aval de l'adresse visée par l'instruction de saut.
Cette insertion a pour rôle de faire sortir l'instruction à préserver de la zone mémoire accessible par l'instruction de saut.
Afin de faire sortir l'instruction à préserver de la zone mémoire accessible par l'instruction de saut, ce lot non opérant doit comprendre au minimum r instructions avec r = 2n-' y, où n est le nombre d'éléments binaires sur lesquels l'adresse relative du saut est codée, et y l'adresse relative de l'instruction à préserver.
En référence à la figure 7, l'insertion d'un lot non opérant peut être effectuée juste avant l'adresse visée par l'instruction de saut lorsque l'adresse visée par l'instruction de saut est en amont de l'instruction à préserver.
En référence à la figure 8, l'insertion d'un lot non opérant peut-être effectuée après l'instruction à préserver lorsque celle-ci se trouve en aval de l'instruction de saut. Ce lot comprend préférentiellement, une instruction de contournement, sensiblement dans les premières instructions de ce lot, et une instruction d'éjection à la fin du lot qui empêche l'exécution d'instructions en aval de ce lot.
De manière complémentaire à la préservation d'instructions sensibles, des lots non opérants peuvent servir à favoriser un lot sécuritaire, par exemple les instructions constituant, après un saut, l'alternative aux instructions à préserver.
Ainsi, le procédé peut par l'insertion de lot non opérant, favoriser l'exécution d'un lot d'instructions sécuritaires, ce dernier étant formé d'un ensemble d'instructions qui doivent être exécutées pour la sécurité du programme.
Les instructions du lot sécuritaire sont des instructions réalisant des actions sensibles dont leur non exécution suite à une attaque, alors que cette instruction aurait été normalement exécutée, peut mettre en péril la sécurité du système.
Une exécution répétée d'un lot sécuritaire non prévue par le programme ne met généralement pas en péril la sécurité du système.
Par exemple, un lot sécuritaire peut consister à accéder à une clé en mémoire, par exemple de type EEPROM, avant d'exécuter un cryptage de données sensibles, le résultat du cryptage devant être envoyées par la carte au terminal. Si la clé de cryptage n'est pas lue suite à une attaque, la carte risque de renvoyer la donnée sensible au terminal, en clair ou crypté avec une clé dégénérée, ce qui peut mettre en péril la sécurité de ces données. Ceci est particulièrement important lors de la manipulation de données secrètes.
Ainsi, l'exécution d'un tel lot sécuritaire, malgré une faute fonctionnelle ou suite à une attaque, doit être exécuté afin d'assurer par exemple, que la lecture de la clé est bien effectuée.
Selon un second exemple de lot sécuritaire, le calcul et la vérification d'une valeur de checksum, par exemple, accompagnant chaque enregistrement mémorisé dans la mémoire d'une carte à puce, doivent être exécutés après la lecture de données dans un fichier, notamment suite à une commande de lecture (instruction read ), et avant que la carte émette les données lues vers le terminal dans lequel est insérée la carte à puce. Ainsi la carte vérifie qu'elle a bien lu les données et que les données qu'elle mémorise sont intègres.
Une attaque peut consister, par exemple à perturber la lecture de façon à effectuer cette lecture dans des zones non autorisées, zone pouvant comporter un secret.
La vérification de la valeur de checksum effectuée par la carte pose problème pour un attaquant, puisque la lecture perturbée conduit dans la plupart des cas à ce que la carte lise la valeur de checksum dans une zone de la mémoire où il y a des données autres et non cette valeur de checksum. Ainsi cette valeur de checksum issue de données lues dans la mémoire par la carte et la valeur de checksum calculée par la carte ne se correspondent pas. Cette carte détecte alors une erreur de lecture et ne renvoie pas la donnée lue au terminal.
Le lot sécuritaire peut ainsi être un traitement d'anomalie, issue par exemple d'une erreur fonctionnelle ou de la détection d'une attaque. Ainsi, un lot non opérant est inséré de telle sorte que lors d'une faute, on augmente la probabilité que le saut atteigne ce lot non opérant, ce lot non opérant conduisant à l'exécution du lot sécuritaire.
La figure 9 illustre un programme en assembleur où est représenté deux instructions à préserver en amont de l'instruction de saut. Ces instructions sont à préserver car elles peuvent être dangereuses si elles sont exécutées à un moment imprévu par le programme, suite par exemple à une attaque par faute. Ces deux instructions sont d'une part l'instruction call appel1 qui est un appel à un sous programme appel1 et d'autre part, l'instruction inc a qui est une instruction d'incrémentation d'une variable. L'instruction de saut jz etiq (signifiant saut si le résultat de l'instruction précédente est égal à 0 ) est en aval de ces deux instructions à préserver.
La figure 10, obtenue à partir de l'exemple de la figure 9, montre l'insertion d'instructions non opérantes dans la zone mémoire accessible par l'instruction de saut conditionnel jz etiq , permettant de repousser des instructions à préserver à l'extérieur de cette zone mémoire tel que montré à la figure 1 et à la figure 2.
Ainsi on limite le risque qu'un attaquant atteigne une instruction à préserver suite à une attaque par faute réalisée sur cette instruction de saut. La sécurité de l'exécution de ce programme est ainsi améliorée.
Le lot non opérant inséré entre l'instruction à préserver et l'instruction de saut, peut ne pas contenir d'instruction d'éjection. En effet si un attaquant atteint une instruction de ce lot alors l'exécution du programme repassera par l'instruction de saut et donc par le test précédant cette instruction, instruction and , ce qui assure que cette instruction de saut sera ré-exécutée assurant ainsi la sécurisation du programme.
En référence à la figure 9, une instruction à préserver est située en aval de l'instruction de saut, cette instruction est l'instruction call appel4 . La figure 10 montre qu'afin de préserver cette instruction, un lot non opérant est inséré entre l'instruction de saut et l'instruction à préserver, également montré à la figure 4. Cependant, dans le cas de cette figure 4, si un attaquant atteint une instruction du lot non opérant située entre l'instruction de saut et l'instruction à préserver, en l'absence d'instructions d'éjection de type saut ou appel d'un sous programme, l'instruction à préserver est tout de même exécutée. Tel que décrit précédemment en référence à la figure 4, ce lot non opérant doit, préférentiellement, comporter une instruction d'éjection empêchant l'exécution des instructions en aval de ce lot.
La figure 11 présente un autre exemple de programme en assembleur, où il est présenté le cas d'une instruction de saut inconditionnel jump , précédant les instructions à préserver suivantes: call appell et inc a .
La figure 12 obtenue à partir de la figure 11 illustre la sécurisation du programme assembleur de la figure 11.
Concernant les instructions à préserver suivantes call appell et inc a , elles sont situées en aval de l'adresse visée par l'instruction de saut etiq 2 . Afin de sécuriser ces instructions tel que présenté à la figure 6, il est inséré des lots non opérant entre l'adresse visée par l'instruction de saut et les instructions à préserver, provoquant la sortie de ces instructions de la zone accessible par l'instruction de saut. Ces instructions sont maintenant non directement accessibles par l'instruction de saut.
On peut noter que l'exemple de la figure 11, comporte des instructions éventuellement sensibles, par exemple l'instruction call appel2 , qui ne sont pas protégées par des lots non opérants. On peut, au choix, décider d'itérer (ou non) la démarche de sécurisation à propos de ces autres instructions à préserver.Selon un mode de réalisation, après sécurisation de la zone mémoire par insertion de lots non opérants, celleci comporte au moins 90 % d'instructions non opérant. Ainsi il est maximiser la probabilité pour qu'un attaquant perturbant l'adresse de l'instruction de saut atteigne une instruction d'un lot non opérant. Ainsi, le risque d'atteindre une instruction à préserver est limité.
En référence à la figure 13, un attaquant peut tenter de perturber l'instruction de saut afin d'empêcher l'exécution d'un programme de traitement d'anomalie. Ainsi selon l'exemple de la figure 13, l'attaquant peut, par exemple, exécuter le code consistant à lire des données enmémoire et récupérer ces données frauduleusement. Par exemple, l'attaquant peut sauter l'instruction Call traitement_anomalie , appel qui a lieu lorsque le calcul et la vérification du checksum sont invalides, ces opérations devant avoir lieu avant que les données lies soient émises au terminal dans lequel est inséré la carte à puce en vue de vérifier leur intégrité.
Afin de s'assurer qu'un lot sécuritaire est exécuté en cas d'attaque, au moins un lot non opérant est placé aux adresses précédant immédiatement le lot sécuritaire, comme illustré à la figure 14. Le lot sécuritaire identifié est l'appel au programme d'action call traitement_anomalie . Ainsi si l'attaquant tombe sur une instruction non opérante appartenant au lot non opérant lors par exemple, d'une attaque, il est tout de même effectué le lot sécuritaire. En effet, les instructions non opérantes du lot non opérant conduisent l'exécution du programme vers le lot sécuritaire, forçant ainsi son exécution. . Ainsi, selon l'invention, la probabilité d'exécuter un lot sécuritaire est augmentée alors que la probabilité d'exécuter une instruction à préserver est diminuée.
Les figures 15 et 16 illustrent deux exemples de sécurisation de programme dans le cas d'un saut conditionnel. Selon ces exemples, on appelle instructions alternatives , les instructions constituant une alternative à l'exécution des instructions situées à l'adresse visée par l'instruction de saut conditionnel.
Selon un premier mode de réalisation, les instructions alternatives comprennent en outre, l'instruction à préserver call suite_prog , ayant pour rôle la poursuite normale du programme. Cette instruction est située après l'instruction de saut et est accessible par l'instruction de saut. Par exemple, cette instruction est la première instruction après cette instruction de saut. Selon l'exemple de la figure 15, les instructions alternatives contiennent l'instruction à préserver suivie d'un lot non opérant s'étendant jusqu'au bout de la zone mémoire, par exemple, en tant que cas particulier de la figure 8.
Le lot sécuritaire contenant le traitement d'anomalie est située sensiblement dans les dernières adresses de la zone mémoire accessible par l'instruction de saut. Selon un mode de réalisation particulier, le lot non opérant est inséré de tel sorte que le lot sécuritaire débute à la dernière instruction accessible de cette zone mémoire. On obtient ainsi, une protection optimale pour la zone mémoire immédiatement suivant l'instruction de saut.
En effet, il est minimisé la probabilité d'exécuter l'instruction à préserver, et maximisé la probabilité d'exécuter le lot sécuritaire, le lot non opérant, formé d'instructions non opérantes conduisant l'exécution du programme, en cas d'attaque, au lot sécuritaire.
Cette mise en oeuvre peut également être réalisée dans la zone mémoire située avant l'instruction de saut. Dans ce cas, le lot sécuritaire est juste avant l'instruction de saut et l'éventuelle instruction de test qui conditionne le saut, et l'insertion du lot non opérant est telle que l'instruction à préserver est au début de la zone mémoire.
Selon un second mode de réalisation illustré à la figure 16, les instructions alternatives comprennent le lot sécuritaire. Selon cette figure, le lot sécuritaire précède l'instruction à préserver. Afin de maximiser la probabilité d'exécuter le lot sécuritaire et minimiser l'exécution de l'instruction à préserver en cas d'attaque, un lot d'instructions non opérant est inséré après l'instruction de saut et en amont du lot sécuritaire. Par exemple, le lot non opérant est placé immédiatement après l'instruction de saut. Ainsi, ce lot non opérant est suivi tout d'abord, de l'instruction alternative (le lot sécuritaire) et ensuite de l'instruction à préserver, celle-ci devant rester accessible par l'adresse visée par l'instruction de saut, l'instruction de saut ayant pour objectif d'atteindre cette instruction à préserver.
Ainsii, on obtient également une protection optimale pour la zone mémoire suivant l'instruction de saut, puisque la probabilité d'exécuter l'instruction à préserver est minimisée et la probabilité d'exécuter le lot sécuritaire est maximisée, suite, par exemple, à une attaque par faute.
Cette mise en oeuvre peut également être réalisée dans la zone mémoire située avant l'instruction de saut.
Selon une variante de l'invention, l'instruction de saut est telle qu'elle permet uniquement de réaliser un saut vers l'avant. De cette façon on obtient une protection optimale grâce à l'invention telle qu'illustrée dans les figures 15 et 16. En effet il n'y a pas de risque qu'en cas d'attaque le saut atteigne une instruction précédant l'instruction de saut.
Selon une autre variante, une nouvelle instruction de saut conditionnel peut être envisagée, cette instruction ayant en paramètres, deux adresses relatives de saut. Les instructions conditionnelles connues telles que jz ou jnz , ont un paramètre indiquant une adresse relative de saut. Ces instructions ont deux sorties fonctionnelles. En effet, ces instructions réalisent un saut à l'adresse relative si le résultat de l'instruction précédente est respectivement égal à 0 ou non égal à 0, sinon l'exécution se poursuit à l'adresse suivant l'instruction de saut.
Selon l'invention, la nouvelle instruction de saut comporte deux adresses relatives, de tel sorte que cette instruction réalise un saut à la première adresse relative si le résultat de l'instruction précédente est par exemple, égal à 0, ou un saut à la seconde adresse relative dans le cas contraire.
Un programme comprenant cette nouvelle instruction peut être sécurisé par l'ajout de lots d'instructions non opérants et de lots d'instructions sécuritaires, par exemple, avant la première adresse de saut, avant la deuxième adresse de saut.