• Aucun résultat trouvé

Maintenant que les messages ont été définis, nous pouvons nous intéresser à la modélisation des protocoles cryptographiques par une algèbre de processus. La section 1.2.1 présente la syntaxe de cette algèbre de processus. La sémantique associée est exposée en section 1.2.2. Elle stipule que les seules termes échangés sur le réseau doivent être des messages, au sens de la section 1.1.

1.2.1 Syntaxe

Nous disposons d’un ensemble infini Ch de canaux. Les processus sont construits sur la gram-maire suivante, avec u ∈ T0c, Σ0 ] N ] X ) et c ∈ Ch :

P, Q := 0 processus nul | in(c, u).P entrée | out(c, u).P sortie

| (P | Q) composition parallèle | i : P phase

Le processus nul (0) ne fait rien : il représente les processus qui ont fini de s’exécuter. Aussi, nous l’omettrons souvent. in(c, u).P représente un processus qui attend un Σ+0-message m correspondant au motif u sur le canal c. Une fois qu’il a reçu un tel message, il continuera à s’exécuter comme P σ où σ = mgu(m, u) (comme m est clos, σ est défini de manière unique). Le processus out(c, u).P émet u sur le canal c, à condition que u soit un message ; puis le processus P s’exécute. (P |Q) représente les deux processus P et Q en parallèle, c’est-à-dire le processus qui exécute simultanément P et Q. Enfin, le processus i : P permet d’exiger que l’on ait atteint la phase i avant de commencer l’exécution de P . Cette construction est particulièrement utile pour modéliser certaines propriétés. De cette manière, il est possible d’exprimer que l’attaquant ne doit pas pouvoir obtenir certaines informations, même s’il apprend certaines clés après l’exécution du protocole.

L’absence d’opération interne de déchiffrement (let), remplacée par le filtrage de motifs à la réception, en constitue la principale limite. Cependant, rien ne porte à croire que cette restriction ne puisse pas être levée.

Les processus seront supposés avoir des variables disjointes, c’est-à-dire que chaque variable n’est liée qu’une seule fois. En particulier, avec x, y ∈ X et c ∈ Ch, les processus in(c, x).in(c, x) et in(c, x).in(c, y) auront des sémantiques différentes : le premier attend deux fois le même message, alors que le second attend deux messages arbitraires. Une variable d’un processus P est dite libre si elle n’est dans le champ d’aucune entrée. L’ensemble des variables libres d’un processus P sera noté fv (P ), et l’ensemble des sous-termes de P , noté St (P ), est l’ensemble des sous-termes apparaissant dans P . Plus formellement, St (0) = ∅, St (i : P ) = St (P ), St (P |Q) = St (P ) ∪ St (Q) et St (in(c, u).P ) = St (out(c, u).P ) = St (u) ∪ St (P ).

Nous supposerons aussi que les phases des processus sont croissantes , c’est-à-dire que, si i : P est un processus, pour tout suffixe j : Q de P , on a j > i.

Définition 1.1. On dit que le processus P est un protocole si c’est un processus clos, c’est-à-dire fv (P ) = ∅.

Nous pouvons introduire l’exemple du protocole d’Otway-Rees qui nous servira de référence pour la suite.

Exemple 1.12. Le protocole d’Otway-Rees [89] est un protocole d’établissement de clé (Kab) entre deux agents grâce à un tiers de confiance joué par un serveur. Il se décrit informellement comme suit.

1. A → B : M, A, B, {Na, M, A, B}Kas

2. B → S : M, A, B, {Na, M, A, B}Kas, {Nb, M, A, B}Kbs

3. S → B : M, {Na, Kab}Kas, {Nb, Kab}Kbs

4. B → A : M, {Na, Kab}Kas

Les agents A et B cherchent à établir une clé, et S est le serveur. Kas(resp. Kbs) est la clé partagée par A (resp. B) avec S. M est un identifiant de session. Na et Nb sont des nonces créés par A et B, et Kab est une clé créée aléatoirement par S. Pour représenter le protocole d’Otway-Rees, nous utilisons Σstd

5 , comme définie à la fin de la section 1.1.7, et le processus POR avec POR= PA| PB| PS

où PA, PB et PS représentent respectivement les rôles de A, B et S. Soient cA, cB, cS ∈ Ch et les données suivantes :

x, ya, yb, ym, zm, z1senc, zsenc2 , zab∈ X a, b ∈ Σ0, m, na, nb, kas, kbs, kab∈ N Les rôles sont définis comme suit.

PA = out(cA, hm, a, b, senc(hna, m, a, bi4, kas)i4). in(cA, hm, senc(hna, xi2, kas)i2)

PB = in(cB, hzm, a, b, zsenc1 i4).

out(cB, hzm, a, b, z1senc, senc(hnb, zm, a, bi4, kbs)i5). in(cB, hzm, z2

senc, senc(hnb, zabi2, kbs)i3). out(cB, hzm, z2

senci2)

PS = in(cS, hym, a, b, senc(hya, ym, a, bi4, kas), senc(hyb, ym, a, bi4, kbs)i5). out(cS, hym, senc(hya, kabi2, kas), senc(hyb, kabi2, kbs)i3))

1.2.2 Sémantique

Avant d’expliciter la sémantique des processus, nous devons définir le contexte dans lequel ils s’exécutent, et qui tient compte des processus qui restent à exécuter, de la connaissance de l’attaquant, de l’instanciation des variables du protocole et de la phase courante. Soit Σ0 un ensemble de constantes. On dit que le quadruplet (P; φ; σ; i) est une Σ0-configuration si :

— P est un multi-ensemble de processus (qui peuvent avoir des variables libres) — φ est une substitution avec dom(φ) ⊂ W et img (φ) ⊂ MΣ0, appelée Σ0-trame. — σ est une substitution avec fv (P) ⊂ dom(σ) ⊂ X .

— i ∈ N.

Une Σ0-configuration est initiale si σ = ∅. On notera souvent P à la place de 0:P ou de (0:P ; ∅; ∅; 0) et P ] P pour {P } ] P. Le multi-ensemble P représente ce qui reste à exécuter des processus. φ modélise les messages qui ont été diffusés sur le réseau et qui sont connus de l’attaquant, et σ permet de conserver l’affectation des variables libres. L’entier i désigne la phase courante.

La sémantique des processus relativement à Σ0 est décrite par la relation −→ définie à la fi-α gure 1.1, avec la convention que lorsque P n’est de la forme i:P pour aucun entier i, il s’exécute comme 0:P . La règle de réception décrit la réception par un processus d’un message construit

Réception (i:in(c, u).P ∪ P; φ; σ; i)

in(c,R)

−−−−→ (i:P ∪ P; φ; σ ] σ0; i) où R est une Σ0-recette tel que Rφ↓ est un Σ0-message, et Rφ↓ = (uσ)σ0pour σ0 avec dom(σ0) = vars(uσ). Émission (i:out(c, u).P ∪ P; φ; σ; i)

out(c,w)

−−−−−→ (i:P ∪ P; φ ∪ {w . uσ}; σ; i)

avec w une variable fraîche de W, et uσ un Σ0-message. Changement de phase (P; φ; σ; i) phase i

0

−−−−→ (P; φ; σ; i0) avec i0> i. Phase (i:i0:P ∪ P; φ; σ; i) −→τ (i0:P ∪ P; φ; σ; i)

Parallélisme (i:(P | Q) ∪ P; φ; σ; i) −→τ (i:P ∪ i:Q ∪ P; φ; σ; i) Figure 1.1 – Sémantique des processus relative à Σ0

par l’attaquant. La règle d’émission représente la diffusion d’un message par un processus. Ce message est ajouté à la connaissance de l’attaquant, représentée par la trame φ. Le parallélisme rend chaque processus disponible dans le multi-ensemble de processus P ; cette action n’est pas observable. Grâce à la règle de changement de phase, l’attaquant peut augmenter la phase à tout moment, tandis que la règle de phase permet à un processus de passer à l’étape suivante.

La relation α1...αn

−−−−−→ (relativement à Σ0) est la clôture réflexive transitive de −→ (relativementα à Σ0). Étant donnée une séquence d’actions α1. . . αn, la trace tr correspondante est la séquence α1. . . αn sans ses τ -actions. Si K α1...αn

−−−−−→ K0 et tr est la trace correspondante à α1. . . αn, on note K =tr=⇒ K0. L’ensemble des traces d’une configurations est l’ensemble des séquences d’actions que l’attaquant peut observer ainsi que la connaissance qu’il obtient en les observant.

Les règles sont classiques, à l’exception de celles de la phase. Par exemple, dans ProVerif [37], la phase n’est pas visible, mais une fausse attaque est levée chaque fois que les processus ne se trouvent pas dans la même phase. Pour simplifier, dans notre sémantique, les phases et les changements de phases sont visibles. Ces phases servent surtout à modéliser les propriétés.

Définition 1.2. Soit Σ0 un ensemble de constantes, K une Σ0-configuration. On note traceΣ0(K) l’ensemble défini par

traceΣ0(K) = {(tr, φ) | ∃P, σ, i tel que K=tr=⇒ (P; φ; σ; i) avec (P; φ; σ; i) une Σ0-configuration.} On parlera parfois de trace concrète d’une Σ0-configuration K pour désigner la trace trφ↓ où (tr, φ) ∈ traceΣ0(K). L’exemple suivant analyse une trace du protocole d’Otway-Rees.

Exemple 1.13. Reprenons POR comme défini dans l’exemple 1.12. Considérons la trace tr sui-vante.

tr = out(cA, w1).in(cB, w1).out(cB, w2).in(cS, w2).out(cS, w3).in(cA, R)

où R = hproj41(w1), proj32(w3)i2. Avec cette séquence d’actions, l’attaquant obtient la connaissance suivante, avec tA= senc(hna, m, a, bi4, kas), tB= senc(hnb, m, a, bi4, kbs) :

φ = {w1. hm, a, b, tAi4, w2. hm, a, b, tA, tBi5, w3. hm, senc(hna, kabi2, kas), senc(hnb, kabi2, kbs)i3} Nous avons (tr, φ) ∈ traceΣ

0((POR; ∅; ∅; 0)). A l’exception de la dernière action in(cA, R), la trace tr correspond à une exécution normale du protocole. Pour la dernière action, l’attaquant rem-place PB : il récupère directement l’identifiant de session m et le chiffrement senc(hna, kabi2, kas) contenant la clé kab et les passe au processus PA. Rφ↓ = hm, senc(hna, kabi2, kas)i2 et la trace

concrète correspondante à (tr, φ) est :

trφ↓ =out(cA, hm, a, b, tAi4).in(cB, hm, a, b, tAi4).out(cB, hm, a, b, tA, tBi5).

in(cS, hm, a, b, tA, tBi5).out(cS, hm, senc(hna, kabi2, kas), senc(hnb, kabi2, kbs)i3). in(cA, hm, senc(hna, kabi2, kas)i2)

La substitution σ telle que (POR; ∅; ∅; 0))=tr=⇒ (P; φ; σ; 0) est

σ = {zm. m ; z1senc. tA; ym. m ; ya. na; yb. nb; x . kab} Quant au multi-ensemble P des processus qui restent à exécuter, il vaut :

P = {0 ; 0 ; in(cB, hzm, z2senc, senc(hnb, zabi2, kbs)i3).out(cB, hzm, z2senci2)}