• Aucun résultat trouvé

Avant de placer les abstractions dans le cadre général qui précède, voyons comment il est possible, en pratique, de définir de telles abstractions. Contentons nous d’illustrer ceci par un exemple quelque peu fictif, qui sera suivi par une brève présentation des abstractions qui seront utilisées par la suite.

Exemple : Imaginons que les modèles considérés soient des systèmes de transitions de la forme :

M ˆ= (Q, q0, →, E)

où Q est l’ensemble des états (éventuellement infini), q0 ∈ Q est l’état initial, →⊆ Q × Q est la relation de transition et E ⊆ Q est un ensemble d’états d’erreur. L’ensemble de propriétés considéré est le singleton {ok} et on dit que M |= ok si, et seulement si, quel que soit q ∈ Q atteignable depuis q0, on a q /∈ E. Avec un ensemble d’états infini et une relation de transition arbitraire, savoir si M |= ok est naturellement indécidable. Prenons maintenant pour abstraction de M un système de transitions :

Mα = (Qˆ , q0, →, E)

relié à M au moyen d’une fonction f : Q → Q et satisfaisant les conditions suivantes : – Q est fini ;

– q

0= f (q0) ;

– si q1 → q2 (dans M), alors f(q1) → f (q2) (dans Mα) ; – si q ∈ E, alors f(q) ∈ E.

Pour un état q ∈ Q, atteignable dans M, il est alors clair que f(q) est atteignable dans Mα. Ainsi, si il y a un état q, atteignable dans M et tel que q ∈ E, alors f(q) est atteignable dans Mα et f(q) ∈ E. Par contraposée, on a montré que :

Mα |= ok ⇒ M |= ok

Cette abstraction est donc correcte (au sens où ce qui est prouvé sur le modèle abstrait reste vrai sur le modèle de départ). Pour qu’elle soit également utile, il faut choisir Q et f de manière pertinente, mais c’est un autre problème (qui ne peut être résolu de manière efficace

qu’avec une connaissance plus approfondie de la structure de M). Nous n’irons pas plus loin dans cet exemple (on pourra, pour plus de détails, consulter [DGG97, CGL94] dont nous nous

sommes inspirés). 

Voyons maintenant à quels types d’abstractions nous allons nous intéresser dans la suite : – en ce qui concerne les propriétés de traces, nous choisirons d’abstraire les modèles de la

logique du premier ordre par des modèles finis ;

– pour les propriétés de jeux, nous abstrairons les systèmes de transitions alternés par des systèmes légèrement différents, suivant une construction qui ne sera pas sans rappeler l’exemple qui précède ;

– pour les propriétés d’opacité, nous remplacerons les classes d’équivalence d’éléments indistinguables (pour l’observateur) par des sous-ensembles finis.

Précisons le cadre général qui nous permettra de traiter les problèmes de vérification de protocoles cryptographiques par abstraction. Pour procéder par abstraction, on doit tout d’abord posséder une classe Mα dont les éléments sont appelés des modèles abstraits, un ensemble Eα dont les éléments sont appelés des énoncés abstraits et une relation (dite de correction) :

⊑ ⊆ (M × E) × (Mα× Eα)

Pour plus de simplicité, nous supposerons la relation de correction définie au moyen de deux relations, l’une entre M et Mαet l’autre entre E et Eα. On suppose également qu’une relation de satisfaction est définie entre Mα et Eα, et on la note |=.

On dit qu’une telle abstraction est correcte si :

∀(M, ϕ). ∀(Mα, ϕα). ((M, ϕ) ⊑ (Mα, ϕα) ⇒ (Mα |= ϕα ⇒ M |= ϕ))

Ainsi, si on dispose d’une abstraction correcte et si on désire vérifier qu’un système, représenté par l ∈ L, satisfait une propriété, représentée par ϕ ∈ E, il suffit de montrer que Mα |= ϕα pour un couple (Mα, ϕα) tel que (J[l]K, ϕ) ⊑ (Mα, ϕα). Afin de savoir si raisonner par abstraction est plus intéressant que raisonner directement, on peut regarder si les critères suivants (qui caractérisent, de manière informelle, les abstractions utiles) sont satisfaits. Le problème de décision de la satisfaction sur Mα× Eα doit être plus simple que sur M × E. Le cas le plus intéressant est sans doute celui où la relation de satisfaction est décidable au niveau abstrait alors qu’elle ne l’est pas au niveau concret, mais il ne faut pas dédaigner le cas où les deux sont décidables, mais avec une meilleure complexité au niveau abstrait.

Étant donnés l ∈ L et ϕ ∈ E, calculer un couple (Mα, ϕα) tel que (J[l]K, ϕ) ⊑ (Mα, ϕα) doit être facile. En effet, les modèles de M seront en général infinis. Il ne faut donc pas espérer calculer tout d’abord M = J[l]K puis ensuite utiliser M pour construire Mα, mais fournir un algorithme de calcul direct d’un Mα ∈ Mα qui convienne, en fonction de l. Notons que le calcul d’un ϕαqui convienne se fait en général très simplement, au moyen d’une fonction (de nature syntaxique) α : E → Eα. L’idée est d’essayer de faire de même pour le calcul effectif d’un Mα. Rappelons que les éléments de M sont décrits au moyen d’éléments de M et d’une fonction JK : M → M. Il est raisonnable de supposer qu’il en est de même pour Mα, autrement dit il existe un ensemble (syntaxique) Mα et une fonction JK : Mα → Mα qui permettent de décrire les éléments de Mαau moyen d’éléments de Mα. L’idée naturelle est alors de définir une

fonction α de M vers Mα (de nature syntaxique, donc) satisfaisant la condition de correction suivante :

∀m ∈ M. ∀ϕ ∈ E. Jα(m)K |= α(ϕ) ⇒ JmK |= ϕ

Nous procéderons dans la suite de la manière suivante : on commencera par travailler sur les modèles afin d’établir une notion de correction ⊑ ⊆ M × Mα, puis on expliquera comment obtenir une abstraction correcte à partir des descriptions syntaxiques.

Pour une propriété ϕ ∈ E, typique des systèmes étudiés, l’ensemble : {l ∈ L | Jα([l])K |= α(ϕ)}

doit être un sous-ensemble relativement conséquent de {l ∈ L | l |= ϕ}. En effet, le fait que l’abstraction soit correcte nous assure seulement que, si Jα([l])K |= α(ϕ), alors l |= ϕ, suivant la définition donnée plus haut. Par contre, dans le cas où l |= ϕ, il n’est pas du tout certain que ceci puisse être prouvé par abstraction (c’est précisément à ce niveau que se situe l’approximation). Ce critère exprime donc que l’abstraction se comporte bien vis-à-vis d’un nombre conséquent de systèmes. Attardons-nous un moment sur ce problème d’approximation. Étant donnés l ∈ L et ϕ ∈ E, deux cas peuvent se présenter :

– Jα([l])K |= α(ϕ) : on sait alors que l |= ϕ et tout se passe donc bien ;

– Jα([l])K |=/ α(ϕ) : il y a alors deux sous-cas, soit l |=/ ϕ, soit l |= ϕ (et l’abstraction a introduit une trop grande imprécision). Le problème est que l’on ne peut a priori pas savoir dans quel sous-cas on se trouve. Dans la suite, nous verrons pour chaque abstraction donnée si il est possible d’apporter une réponse (qui ne pourra être que partielle) à ce problème (au moyen d’exemples).

La figure 2.2.1 récapitule le schéma général de vérification au moyen d’abstractions. Pour conclure, récapitulons les étapes essentielles du processus typique de vérification d’une classe de propriétés de sécurité de protocoles cryptographiques :

– la classe des propriétés considérées sera tout d’abord introduite au moyen d’exemples et nous définirons dans le même temps la classe des protocoles considérés, relativement à ces propriétés ;

– nous présenterons ensuite la classe des modèles et des énoncés choisis pour modéliser ces protocoles et ces propriétés, et nous décrirons précisément la sémantique des protocoles en utilisant ces modèles (et énoncés) ;

– nous donnerons ensuite la classe des modèles qui seront utilisés comme abstractions, en justifiant la correction puis en expliquant comment construire ces abstractions de ma-nière syntaxique. Ceci nous permettra de donner la sémantique abstraite des protocoles et propriétés considérés ;

– nous terminerons en détaillant le processus de vérification effective sur quelques exemples et nous commenterons les résultats obtenus.

Sys. (1) //L (3) //M α (7) // (4)  Mα (8)  M (5) |= Mα |= Prop. (2) //E α (6) //Eα

– (1) et (2) : représentations (formelles et syntaxiques) d’objets du monde réel ; – (3) suivie de (4) : sémantique de L (dans M) ;

– (5) : notion de correction entre modèles concrets et modèles abstraits ; – (6) : abstraction des énoncés ;

– (7) : abstraction des descriptions syntaxiques de modèles, respectant la correction (5) ; – (3) suivie de (7) puis (8) : sémantique abstraite de L (dans Mα).

Première partie

Chapitre 3

Introduction

3.1 Un exemple

Considérons le protocole suivant1, proposé par D. Denning et G. Sacco [DS81] : Denning-Sacco :

1. A → S : hA, Bi

2. S → A : {hB, KAB, T, {hKAB, A, T i}k(B,S)i}k(A,S) 3. A → B : {hKAB, A, T i}k(B,S)

Le but de ce protocole est d’établir une communication privée entre A et B, au moyen de la clé symétrique KAB, nouvellement créée par le serveur de confiance S. Analysons ce protocole étape par étape. A commence par informer S qu’il désire établir une communication avec B, en lui envoyant pour cela un message constitué de son identité et de celle de B Recevant ce message, S crée une nouvelle clé symétrique KAB ainsi qu’un cachet T (un tel objet, appelé timestamp dans la littérature, contient une référence à la date à laquelle il a été créé et possède généralement une certaine durée de validité, dépendant de l’implémentation du protocole. Nous considérerons plus simplement qu’il s’agit d’un nonce). Il envoie alors à A un message, chiffré avec k(A, S) et constitué de deux parties. La première, hB, KAB, T i, a pour but de fournir à A la nouvelle clé KAB et contient le cachet T pour éviter que A accepte de cette manière un vieux message de S, contenant une clé qui pourrait avoir été compromise. La seconde partie du message, {hKAB, A, T i}k(B,S), est à destination de B (A ne peut d’ailleurs pas la lire, puisqu’elle est chiffrée avec k(B, S) et se contente de la renvoyer à B dans la dernière étape du protocole). Ce message permet à B de prendre à son tour connaissance de KAB et T .

Quelles propriétés attend-on de ce protocole ? Tout d’abord la clé KAB doit bien entendu rester secrète (c’est à dire connue uniquement de A, B et S). Cette propriété n’est pas suffi-sante, car elle ne permet pas de s’assurer, par exemple, que, à la fin d’une session du protocole, en apparence jouée avec A, B parle effectivement à A (il s’agit là d’une propriété d’authenti-fication).

Nous sommes donc en présence de deux types de propriétés. De plus, lorsque l’on cherche à formaliser ces propriétés, il apparaît que, pour chacune d’elles, plusieurs définitions sont

possibles. Pour le secret, par exemple, les deux définitions suivantes décrites dans [Aba00] sont communément employées :

– une variable libre x apparaissant dans la description d’un protocole P est dite secrète si l’instanciation de x par des messages clos quelconques conduit à des systèmes observa-tionnellement équivalents ;

– un message clos m est secret dans un protocole P si, lors des exécutions de P , il est impossible à un intrus actif de produire m.

La première définition est adaptée dans le cas d’une sémantique des protocoles donnée par des processus munis d’une notion d’équivalence observationnelle tandis que la seconde convient bien pour une sémantique de protocoles en termes de traces, et c’est celle que nous utiliserons ici. En ce qui concerne l’authentification, les définitions possibles sont encore plus nombreuses (on pourra consulter [Low97b] à ce propos) :

– (aliveness) on dit qu’un protocole garantit à a jouant le rôle de A la présence de b si lorsque a termine une session du protocole, apparemment avec b, alors b a auparavant participé à une session du protocole ;

– (weak agreement) on dit qu’un protocole garantit à a jouant le rôle de A la présence forte de b si lorsque a termine une session du protocole, apparemment avec b, alors b a auparavant participé à une session du protocole, apparemment avec a.

On peut également vouloir imposer un accord sur certaines valeurs établies au cours du pro-tocole (il pourrait s’agir de KAB dans l’exemple qui précède) :

– (non-injective agreement) on dit qu’un protocole garantit à a jouant le rôle de A l’accord de b sur un ensemble de données x1, . . . , xnsi lorsque a termine une session du protocole, en apparence avec b, alors b a auparavant participé à une session du protocole, en tant que B, en apparence avec a, et a et b ont instancié x1, . . . , xnpar des valeurs égales ; – (agreement) on dit qu’un protocole garantit à a jouant le rôle de A l’accord fort de b sur

un ensemble de données x1, . . . , xnsi pour toute session du protocole terminée par a , en apparence avec b, il existe une unique session du protocole dans laquelle b a participé, en tant que B, en apparence avec a, dans laquelle a et b ont instancié x1, . . . , xnpar des valeurs égales.

À la différence des propriétés de secret qui précèdent, il est clair que ces définitions ne sont pas équivalentes mais qu’elles forment plutôt (comme annoncé dans [Low97b]) une hiérarchie. Ces propriétés sont également plus compliquées que les propriétés de secret, puisque pour les vérifier il faut mettre en correspondance divers évènements apparaissant lors d’une exécution de plusieurs sessions concurrentes et séquentielles du protocole.