PROCEDE SECURISE DE DEPLOIEMENT D'UN PROGRAMME INFORMATIQUE SUR DES SUPPORTS D'INFORMATIONS DISTINCTS
L' invention concerne un procédé sécurisé de déploiement d'un programme informatique sur des supports d'informations distincts. Elle concerne également un procédé de diversification de programmes informatiques. L'invention s'applique à la sécurisation de dispositifs électroniques contenant un ou plusieurs programmes informatiques et plus particulièrement à la sécurisation des dispositifs portables de type cartes à puce. Le problème posé concerne d'une manière générale la sécurité des programmes d'ordinateurs contre les attaques qui permettent d'extraire des informations sensibles lorsque ces programmes sont susceptibles de traiter des données confidentielles. Ce problème concerne en particulier la sécurité contre la fraude de dispositifs portables de type cartes à puce, lesquels sont par nature, utilisés pour stocker et exploiter des données secrètes.
On constate malheureusement que ces dispositifs sont sujets à de nombreuses attaques malveillantes de nature diverses. Ces attaques ont été répertoriées et analysées et leurs principes vont être rappelés ci- dessous :
Une première attaque dite « side channel » consiste à étudier la consommation électrique, la radiation électromagnétique ou toute autre modification de l'environnement du composant électronique lorsqu'il participe à l'exécution d'un programme informatique. A partir de l'observation de cette consommation, il devient possible de déduire l'instant de traitement des
données confidentielles ainsi que les données elles- mêmes .
Une deuxième attaque consiste à modifier l'environnement physique du composant électronique (température, lumière ...) de manière à modifier le déroulement normal du programme qui est exécuté; il est alors possible de déterminer puis d'intervenir au moment précis du traitement des données confidentielles. Par exemple, une influence physique externe au moment du traitement d'un code confidentiel peut amener le programme à accepter un mauvais code.
Une troisième attaque possible consiste en une intrusion physique au sein des composants électroniques afin d'espionner ou de modifier les informations qui transitent sur des bus de données par exemple. Il est ainsi possible de déterminer l'instant précis où les données confidentielles sont manipulées afin de les intercepter.
Pour lutter contre ces fraudes, les solutions de sécurité de l'art antérieur consistent à prévoir des protections et contre-mesures qui repoussent au maximum ces attaques.
Globalement les solutions connues à ce jour ont pour but de rajouter des obstacles logiques ou physiques à toute tentatives de fraude. En pratique, ces obstacles augmentent le temps nécessaire et la complexité pour décoder le déroulement du programme. Malheureusement une fois que le déroulement du programme est connu, il est possible d'appliquer facilement cette connaissance sur tous les dispositifs contenant le même programme afin de récupérer les données confidentielles qu'ils peuvent détenir.
L'invention a donc pour but de remédier à ces inconvénients .
Elle a pour objet un procédé sécurisé de déploiement d'un programme Po principalement caractérisé en ce qu'il consiste à fournir N versions diversifiées de ce programme Po et à charger des versions différentes sur des supports d'informations distincts .
Les différentes versions d'un même programme réalisent les mêmes fonctions essentielles, donnent le même résultat mais ont un comportement légèrement différent lors de leur exécution.
Avantageusement, les N versions différentes du programme Po sont obtenues de la manière suivante : le programme Po est écrit dans un langage quelconque, le programme est ensuite traduit N fois par un programme de diversification.
Selon un mode de réalisation, le programme de diversification est un programme de compilation et un programme éditeur de liens qui introduisent une ou plusieurs variantes à chaque opération de compilation.
Les supports prévus peuvent être X dispositifs portables de type cartes à puce, les N versions étant réparties sur les X dispositifs, X étant supérieur ou égal à N. L'invention a également pour objet un procédé de diversification d'un programme Po principalement caractérisé en ce qu'il consiste à prévoir un programme de diversification apte à introduire des variantes dans le programme Po de manière à obtenir N versions différentes dudit programme.
Selon un mode de réalisation, le programme de diversification est réalisé par un programme compilateur et un programme éditeur de liens, la
diversification se faisant durant la compilation et/ou l'édition de liens dudit programme Po.
Une première variante introduite durant la compilation et l'édition de liens consiste à modifier, d'une version à l'autre, les adresses des fonctions ou sous -programmes dudit programme Po, de la mémoire de programmes dans laquelle il sera enregistré.
Une deuxième variante introduite consiste à modifier, d'une version à l'autre, les adresses des registres tampons et des variables de la mémoire de travail .
Une troisième variante consiste a modifier au moins un paramètre dudit programme ou une instruction par une instruction équivalente, ou un sous-ensemble d'instructions par un autre sous-ensemble d'instructions fonctionnellement équivalent ou ajouter des opérations inutiles d'une version à l'autre dudit programme .
Le procédé de diversification d'un programme Po, est avantageusement utilisé pour la mise en œuvre du déploiement sécurisé dudit programme Po sur des supports d'informations distincts tels que des dispositifs portables de type cartes à puce.
L'invention concerne en outre un procédé de personnalisation de supports d'informations de type cartes à puce principalement caractérisé en ce qu'il consiste à utiliser le procédé de déploiement sécurisé d'un programme Po énoncé ci -dessus.
D'autres particularités et avantages de l'invention apparaîtront clairement dans la description suivante, présentée à titre d'exemple non limitatif en regard des figures annexées qui représentent :
- la figure 1, un schéma classique illustrant la transformation classique d'un programme écrit en langage quelconque en un programme exécutable,
- la figure 2, illustre le principe de la présente invention permettant d'avoir plusieurs versions d'un même programme, la figure 3, illustre un premier exemple de diversification, la figure 4, illustre un deuxième exemple de diversification,
- la figure 5, illustre un troisième exemple de diversification. la figure 6, illustre le déploiement d'un programme sur des cartes à puces .
On rappelle pour mieux comprendre la suite qu'un programme principal Po écrit en langage de programmation fait l'objet d'une compilation réalisée par un programme de compilation pour pouvoir être compris par l'unité de traitement du dispositif support qui exécute le programme. Une unité de traitement comprend, et cela de manière classique, un processeur
(ou microprocesseur ou microcontrôleur) et des mémoires volatiles et non volatiles. L'unité de traitement peut être installée soit dans un microordinateur soit dans tout autre dispositif électronique à base d'un microprocesseur .
Lorsque le programme principal Po fait appel à un ou plusieurs sous-programmes SP1, SP2 , SP3 , un autre programme appelé éditeur de liens ed, intègre les différents sous-programmes dans le programme principal Po compilé pour le rendre exécutable. Cette transformation est schématisée par le bloc Ced de la figure 1.
Afin de simplifier la description qui va suivre on désignera par FI, F2 , F3 , des fonctions ou des sous programmes du programme principal Po .
Selon l'invention, il est donc proposé de déployer le programme Po sous différentes versions Pol, Po2 ,
PoN de manière à assurer une sécurité contre la f aude.
La transformation réalisée est illustrée par le schéma de la figure 2.
Ce déploiement est réalisé par diversification du programme Po .
Plusieurs solutions de diversification vont être décrites dans la suite. Ces solutions peuvent être bien évidemment combinées c'est-à-dire qu'une même version présentera plusieurs variantes par rapport à une autre version. Ceci contribue à renforcer encore plus la sécurité apportée par la diversification.
Les N versions peuvent être obtenues bien entendu par une programmation individuelle de chacune d'elle ou au moyen d'un programme de diversification. De façon avantageuse, il est prévu que cette diversification soit mise en œuvre par un programme compilateur réalisé à cet effet et/ ou par un programme éditeur de liens comme cela va être détaillé à travers les différents exemples donnés dans la suite. Comme cela est illustré sur la figure 2, un programme Po unique écrit dans un langage quelconque (C par exemple) , va donc pouvoir être fourni en N versions Pol, Po2 ..., PoN, grâce aux opérations de compilation et d'édition de liens Ced. Les différentes versions assurent les mêmes fonctions que le programme Po tout en présentant des caractéristiques différentes qui font que la connaissante du comportement d'un programme ne permettra pas d'en retirer des informations utiles pour une autre version de ce même programme.
Une première solution proposée consiste à diversifier les adresses aux quelles se trouvent les fonctions ou sous-programmes nécessaires lors de l'exécution du programme Po, dans la mémoire de programme MP (mémoire électriquement programmable de type EEPROM ou Flash/EEPROM) . Ces adresses sont donc modifiées par le compilateur (s'il s'agit de fonctions du programme) ou par l'éditeur de lien lorsqu'il s'agit de sous-programmes appelés. Cette solution est illustrée sur la figure 3.
On suppose, pour illustrer le propos que le programme Po fait appel aux trois fonctions et/ou sous- programmes FI, F2 , F3 , tel que cela est illustré sur la figure 2. Ces fonctions se trouvent classiquement à des adresses fixées de la mémoire de programme MP. Grâce à la transformation opérée par le compilateur, les fonctions vont se trouver à des adresses distinctes sur chaque version du programme. Sur la version Pol, FI se trouve aux adresses adl-adp ; F2 se trouve aux adresses adr-ads et F3 se trouve aux adresses ads-adn. Sur la version Po2 , FI se trouve aux adresses ado-ad4, F2 se trouve aux adresses ad4-adp et F3 se trouve aux adresses adp-adq. Sur la version PoN, FI se trouve aux adresses ado-ad4, F2 se trouve aux adresses adp-adq et F3 se trouve aux adresses adq-adr.
Une autre solution consiste à effectuer ce même type de diversification d'adresse mais cette fois ci pour la mémoire de travail MT (mémoire volatile RAM) .
On rappelle que classiquement et à titre d'exemple, pour exécuter une opération arithmétique par exemple C=A+B, l'unité arithmétique et logique du dispositif support utilise deux registres RI et R2. Le compilateur charge la valeur A qui est à l'adresse AD1 de la mémoire de travail dans le registre RI et charge la
valeur B qui est à l'adresse AD2 de cette mémoire dans le registre R2. Le résultat C est stocké à l'adresse AD3 (les instructions de chargement et de transfert sont utilisées pour la mise en œuvre de cette opération. )
Selon l'invention, il peut être prévu que le chargement du contenu de ces deux registres se fasse à des adresses différentes pour chaque version de programme Po . De manière plus générale, pour une instruction I donnée, l'adresse de chargement du contenu des registres peut être modifiée par le compilateur. Un exemple pratique est illustré sur la figure 4, pour la mise en œuvre de l'opération C=A+B. Une autre solution consiste à réaliser une diversification des paramètres du programme ou des instructions elles-mêmes.
Plusieurs exemples vont illustrer cette solution dans la suite : II peut être prévu par exemple d'exécuter une instruction d'une manière différente sans rien changer au résultat soit en rajoutant des opérations inutiles soit en changeant une instruction par une instruction équivalente . Par exemple, une opération arithmétique telle que A+B peut être modifiée par le compilateur en A+C+B-C.
Les valeurs de C seront différentes d'une version à 1 ' autre .
Une opération de transfert A-B peut être modifiée en A→C→B.
Une opération conditionnelle : si A+B alors F sinon G, peut être modifiée par l'opération conditionnelle : si A≠B alors G sinon F.
Ces différents exemples sont illustrés par le schéma de la figure 5.
Comme cela a été dit, l'invention s'applique tout particulièrement au déploiement de programmes contenant des données sensibles pour des dispositifs portables tels que les cartes à puce ou autres objets équivalents. Le ou les programmes déployés seront chargés en mémoire électriquement programmable de type
EEPROM ou Flash/EEPROM. Si un programme est modifié de manière à se trouver sous forme de 100 versions distinctes, ces 100 versions seront déployées de manière aléatoire pour équiper l'ensemble du parc de carte à puce prévu. Il est bien évident que si ce parc représente 1 million de cartes à puce distribuées sur tout un territoire géographique
(qui peut être très étendu) , des lots de cartes à puce posséderont une même version dudit programme. Cependant le nombre de carte à puce par lot sera insuffisant pour pouvoir retirer des caractéristiques intéressantes pour un fraudeur, d'autant plus que le déploiement géographique des cartes va empêcher pratiquement la reconstitution d'un même lot pour tout fraudeur.
La figure 6, illustre le déploiement des versions Pol, ...PoN, PoN+1 du programme Po sur des cartes à puce Cl,... CN, CN+1.
Une version donnée d'un programme peut être chargée à tout moment dans une carte à puce, soit avant sa distribution aux organismes de personnalisation soit pendant la personnalisation soit après c'est-à-dire lorsqu'un utilisateur possède cette carte.
Les programmes pouvant faire l'objet d'une telle diversification peuvent être des programmes d'application mais aussi le programme du système d'exploitation (OS) du dispositif portable.