• Aucun résultat trouvé

2.2 Méthodes de protection

2.2.2 Intégrité

L’objectif de la vérification d’intégrité est de détecter toute injection ou corruption du code ou des données, et d’interdire l’exécution du contenu de la mémoire intentionnellement modi- fié. La propriété d’intégrité est plus difficile à assurer que la propriété de confidentialité car la vérification de l’intégrité d’une donnée nécessite toujours une donnée supplémentaire de réfé- rence qu’il faut produire et stocker. Dans cette sous-section, nous présenterons les différents mécanismes de protection1d’intégrité contre les trois attaques actives que nous avons présenté

dans le modèle de menace.

2.2.2.1 Méthodes de protection contre l’attaque par injection

Pour protéger l’intégrité d’une donnée, il est nécessaire de stocker une information supplé- mentaire permettant de s’assurer que la donnée n’a pas été modifiée. Le condensé cryptogra- phique est un choix naturel : il est facile à calculer et il prend moins de place que la donnée initiale.

Néanmoins, les fonctions de hachage sont publiques. Il ne servirait donc à rien de stocker les condensés dans la mémoire non fiable : si un adversaire désire remplacer dans la mémoire une donnée par une autre, il peut librement calculer le nouveau condensé et le substituer également à celui de la donnée manipulée. L’attaque ce sera pas détectée.

Par conséquent, la protection d’intégrité avec les fonctions de hachage nécessite le stockage des condensés à l’intérieur de la zone fiable (SoC) dans une mémoire locale (figure 2.6). Ainsi, si un attaquant veut modifier une donnée D0, comme il ne peut plus modifier hash0 = H(D0),

il doit trouver D00 6= D0 tel que H(D00) = hash0 = H(D0), c’est-à-dire casser la propriété de

résistance à la seconde préimage de la fonction de hachage. Pour chaque opération d’écriture, le hash calculé sur un groupe de données cible est mis à jour dans la mémoire locale du SoC. La vérification d’intégrité (pendant les opérations de lecture) est effectuée en calculant le hash du groupe de données cible et le comparant avec le hash stocké dans la mémoire locale.

Cette solution de stockage interne n’est malheureusement pas extensible du fait de la taille nécessairement limitée de la mémoire locale du SoC utilisée pour stocker les condensés. Elle n’est applicable que dans les situations où la taille de la zone mémoire à protéger est limitée et connue lors de la conception du SoC.

Les fonctions les fonctions de MAC (ou les fonctions de hachage à clé) sont plus intéres- santes du point de vue du problème du stockage des condensés : l’attaquant ne peut rien calculer

1. Nous utilisons ici, et dans toute la suite du manuscrit, le terme de protection d’intégrité dans le sens de détection des violations d’intégrité. Puisque nous ne pouvons pas empêcher les attaques actives, nous pouvons juste les détecter.

zone non fiable zone fiable hashn hash1 hash0 D0 D1 D2 Dn

Mémoire locale Mémoire externe

D : Groupe de données

FIGURE2.6 – Protection d’une zone mémoire contre les attaques par injection

sans clé (stockée à l’intérieur du SoC), ce qui permet de stocker les condensés dans la mémoire externe avec les groupes de données qu’ils protègent (figure 2.7). En effet, l’utilisation de la clé (inaccessible par l’attaquant) par le MAC permet, en plus de la résistance aux attaques par recherche de seconde préimage, la résistance aux attaques par recherche de collisions (trouver deux données différentes avec le même MAC). Par conséquent, l’attaque par injection peut être détectée parce que l’attaquant ne peut pas modifier le groupe de données et son MAC. La com- paraison entre les deux MAC, celui stocké dans la mémoire externe et celui généré à partir du groupe de données modifié, va permettre la détection de l’erreur.

Dn D2 D1 D0 MACk(D1) MACk(D2) MACk(D0) MACk(Dn) Mémoire externe D : Groupe de données

FIGURE2.7 – Protection d’une zone mémoire contre les attaques par injection

2.2.2.2 Méthodes de protection contre l’attaque par permutation spatiale

La solution proposée contre les attaques par injection en utilisant des MAC, n’est pas suf- fisant pour protéger l’intégrité contre les attaques par permutation spatiale : un attaquant est capable de permuter deux groupes de données ainsi que leurs MAC sans que le système détecte une erreur dans la comparaison entre les deux MAC comparés (généré et de référence). Une

solution simple pour palier ce problème consiste à utiliser, par exemple, l’adresse du groupe de données lors du calcul du MAC afin d’empêcher un attaquant de copier le groupe de don- nées et son MAC vers une autre adresse de la mémoire. Par exemple, on peut, dans le mode CBC-MAC, utiliser l’adresse comme premier bloc à chiffrer (figure 2.8). Donc, chaque MAC est considéré comme unique pour une adresse donnée. Un chiffrement de bloc supplémentaire est le prix de protection contre l’attaque de permutation spatiale. L’utilisation de l’adresse dans le calcul du MAC ne peut toutefois pas détecter les attaques de type rejeu parce qu’un atta- quant peut rejouer un groupe de données et leur MAC sans détection (permutation temporelle entre deux MAC, le dernier mis à jour avec un autre ancien). Le MAC utilisant les adresses ne pourra donc être utilisé que pour les données non modifiables2dans la mémoire, qui ne sont pas menacées par le rejeu3. Cette possibilité est intéressante car les MAC sont des primitives cryp-

tographiques peu complexes dont les impacts sur les performances et sur l’empreinte mémoire sont moindres que ceux des arbres de Merkle que nous étudions dans la section suivante.

EK EK EK P1 Pb−2 Pb−1 EK P0 @||0...0 0 EK MAC P : Bloc de données Ek: Chiffrement avec la clé k

FIGURE2.8 – Calcul du CBC-MAC avec adresse

2.2.2.3 Méthodes de protection contre l’attaque par rejeu

Les attaques par rejeu sont les plus difficiles à contrer. Une solution naïve est d’ajouter dans le calcul du MAC, en plus de l’adresse, une valeur de circonstance (nonce, number used once) incrémentée à chaque nouvelle écriture dans la mémoire externe. Les nonces ajoutés permettent la détection des attaques par rejeu en distinguant entre deux MAC de la même adresse mais écrits dans la mémoire dans deux temps différents. Cette solution n’est valable que si les nonces sont stockés dans la zone sécurisée, afin d’éviter une altération de leurs valeurs. Par contre, le stockage interne des nonces est, comme pour les condensés de fonctions de hachage, un point critique car la taille de la mémoire interne est généralement limitée.

Dans la même stratégie de protection, [22] propose une nouvelle méthode de protection en utilisant la technique AREA (Added Redundancy Explicit Authentication [23]) au niveau du bloc. Chaque groupe de données (D) est concaténé avec un nonce (N ) et les deux (D||N ) sont chiffrés en utilisant un algorithme de chiffrement par bloc pour générer un bloc chiffré. Les blocs chiffrés sont stockés dans la mémoire externe et la clé du chiffrement est stockée

2. On appelle données non modifiables les données qui sont écrites une fois, lors de leur initialisation, et qui ne sont ensuite plus jamais modifiées.

MAC0 MAC1 MAC2 MAC3 MACi= HK(Di, Ni) D0 D2 Dn D1 N0 N1 Nn Mémoire externe Mémoire locale

zone fiable zone non fiable D : Groupe de données

N : Nonce

FIGURE2.9 – Protection de la mémoire externe avec des MAC et nonce

à l’intérieur de la puce (figure 2.10). Cette méthode propose de stocker les nonces dans une mémoire locale pour protéger la mémoire externe contre les attaques par rejeu. Les avantages de cette méthode est qu’elle permet, en plus de la protection de l’intégrité contre toutes les attaques actives, le chiffrement des données dans la mémoire externe. Par contre, elle augmente le coût du système du fait de la mémoire locale. Les auteurs évaluent un surcout entre 25 % et 50 % en fonction de l’algorithme de chiffrement implémenté.

zone non fiable N0 N1 Nn C0= Ek(D0||N0) C0= Ek(D2||N2) C0= Ek(Dn||Nn) C0= Ek(D1||N1)

Mémoire locale Mémoire externe

zone fiable D : Groupe de données C : Bloc chiffré

Ek: Chiffrement par bloc (ECB) avec la clé k N : Nonce

FIGURE2.10 – Protection de la mémoire externe avec la technique AREA

Les techniques décrites précédemment sont basées sur le stockage des informations (des MAC ou des nonces) dans une mémoire digne de confiance à l’intérieur de la puce afin de protéger le système contre les attaques par rejeu. Cette condition impose un surcout du système du fait de la mémoire locale. Par exemple, dans les conditions étudiées par les auteurs de [24],

en considérant une mémoire RAM de 1 Gio, les techniques de MAC (avec nonces) et de AREA au niveau bloc, exigent respectivement 128 Mio et 256 Mio de mémoire locale.

Dans la littérature, une technique a été proposée afin d’éviter le stockage dans la mémoire locale. Elle est basée sur l’utilisation des arbres de Merkle, initialement introduits par Merkle et al.[25] pour des calculs efficaces dans les cryptosystèmes à clé publique, et ensuite adaptés par Blum et al. [26] pour la protection d’intégrité du contenu de mémoires. L’arbre de Merkle (de condensés ou de MAC) protège tout l’ensemble de données de manière hiérarchique selon une organisation en arbre. Les feuilles sont les données à protéger et les nœuds sont les condensés. Tous les nœuds de l’arbre sont stockés dans la zone mémoire non fiable sauf la racine qui est stocké dans une zone sécurisée (figure 2.11).

d0 d1 d2 d3 d4 d5 d6 d7 H0(d0||d1) H1(d2||d3) H2(d4||d5) H3(d6||d7) H5(H2||H3) H4(H0||H1) H6(H4||H5) Mémoire sécurisée Mémoire non sécurisée

H : Fonction de hachage ou de MAC

FIGURE2.11 – Arbre de Merkle

Les arbres de Merkle réguliers sont traités de manière approfondie dans la prochaine sec- tion.