• Aucun résultat trouvé

4.5.1 Introduction

Russo et Sabelfeld [23] proposent un traitement de l’interaction entre les processus et l’or- donnanceur qui permet `a ce dernier de tenir compte du niveau de s´ecurit´e des informations manipul´ees par chaque processus. Leur mod`ele est compatible comme nous allons le voir avec la plupart des propri´et´es de la section pr´ec´edente. Le langage est enrichi avec deux primitives qui permettent de prot´eger momentan´ement un processus pendant qu’il manipule des infor- mations secr`etes. Une sp´ecification de s´ecurit´e permissive et similaire `a la non-interf´erence est d´efinie, de mˆeme qu’un syst`eme de types pour la s´ecurit´e, stable par composition, qui applique cette sp´ecification. Un traitement efficace et convivial est propos´e pour la cr´eation dynamique des processus et pour la synchronisation.

4.5.2 Syntaxe et s´emantique des commandes

La syntaxe du langage est repr´esent´ee dans la figure 4.2. En plus des primitives imp´eratives standard, le langage inclut de nouvelles commandes, hide et unhide, pour isoler l’ex´ecution d’une section de code ; puis fork et hfork, pour cr´eer dynamiquement des processus.

Figure 4.2 – syntaxe des commandes tir´ee de [23]

Une commande c et une m´emoire m forment une configuration hc, mi. La s´emantique des commandes est pr´esent´ee dans la figure4.3. La s´emantique d’une ´etape atomique des configu- rations prend la forme hc, mi* hcα 0, m0i, qui modifie la commande et la m´emoire en pr´esence d’un ´ev´enement α s’il y a lieu, α appartenant `a l’ensemble des ´ev´enements {• , •, ◦−→

d, •−→d}

o`u−→d est un ensemble de processus. La signification des ´ev´enements est d´ecrite avec les r`egles qui les impliquent.

Avant d’expliciter le fonctionnement des commandes hide et unhide, introduisons d’abord le terme suivant.

D´efinition 8. Bassin des processus ´

Etant donn´e un programme concurrent en ex´ecution, nous d´esignerons par bassin des processus l’ensemble fini des processus actifs du programme. Cela inclut le processus en cours d’ex´ecution et tous ceux qui sont en attente d’ˆetre planifi´es par l’ordonnanceur.

Figure 4.3 – S´emantique des commandes tir´ee de [23]

Remarquons que la taille du bassin varie avec l’´etat du programme, puisque les processus termin´es sont exclus du bassin et les nouveaux processus dynamiquement cr´e´es font leur entr´ee. L’ex´ecution d’un programme concurrent se termine lorsque le bassin devient vide. On utilise la s´emantique des commandes pour partitionner le bassin des processus en deux, une partie haute d´edi´ee aux processus priv´es et une partie basse pour les autres processus. L’intention est de cacher le timing de l’ex´ecution des processus du groupe priv´e des processus du groupe public.

La commande hide d´eplace le processus courant de la partie publique vers la partie priv´ee du bassin. Ceci est exprim´e dans la s´emantique par l’´ev´enement • qui indique `a l’ordonnanceur de traiter le processus comme priv´e, mˆeme s’il l’´etait d´ej`a. La commande unhide a un effet dual. Il indique `a l’ordonnanceur par l’´ev´enement • que le processus doit ˆetre trait´e comme public. Pour illustrer intuitivement comment utiliser les commandes hide et unhide, modifions l’exemple de la section 4.3 en intercalant la commande de branchement entre les primitives hide et unhide de la mani`ere suivante :

d1: hide; (if h then sleep(100) else skip); unhide; l := 1

d2: sleep(50); l := 0

Initialement, le processus de la commande d1 et celui de la commande d2 sont consid´er´es

comme publics par l’ordonnanceur. Apr`es l’ex´ecution de la commande hide, le processus de d1devient temporairement priv´e, et celui de d2ne peut plus ˆetre planifi´e jusqu’`a ce que la com-

par l’instruction de branchement dans d1, n’est plus visible par d2. La fuite par chronom´etrage

interne est ainsi ´evit´ee.

Les commandes fork (c,−→d ) et hfork (c,−→d ) engendrent dynamiquement le groupe de processus −

d = d1...dn, pendant que le processus courant ex´ecute la commande c. La diff´erence entre

les deux primitives se situe dans la g´en´eration des ´ev´enements. La commande fork (c,−→d ) pr´evient l’ordonnanceur de la cr´eation d’un processus public avec l’´ev´enement ◦−→

d, alors que

la commande hfork (c,−→d ) indique que le processus cr´e´e doit ˆetre trait´e comme priv´e avec l’´ev´enement •−→

d.

Les commandes skip, affectation, if then et while op`erent conform´ement `a la s´emantique d´ecrite dans la section2.3.3

4.5.3 S´emantique de l’ordonnanceur

Un ordonnanceur est repr´esent´e par un programme σ et une m´emoire ν. La configuration est not´ee hσ, νi. On suppose que la m´emoire de l’ordonnanceur et celle du programme sont disjoints. La m´emoire de l’ordonnanceur contient les variables q, t, r et s o`u :

– la variable q garde le nombre d’´etapes restant `a ex´ecuter pour le processus courant. – la variable t permet de diff´erencier les deux partitions du bassin des processus :

– t◦ repr´esente la partie basse (publique) du bassin,

– t• repr´esente l’une des parties hautes (priv´ees) du bassin, constitu´ee des processus

qui sont priv´es d`es leur cr´eation et qui le demeurent tout au long de leur ex´ecution. – te repr´esente l’autre partie haute, constitu´ee des processus qui ´etaient initialement

publics avant de subir une d´elocalisation par la commande hide. Les processus vont et viennent dans la zone te sous l’action des commandes hide et unhide.

– la variable r identifie le processus en cours d’ex´ecution.

– la variable s est un drapeau qui indique en tout temps si un processus de la partie publique du bassin peut ˆetre ex´ecut´e.

– si s est ´egal `a •, seuls les processus priv´es peuvent ˆetre s´electionn´es.

– si s est ´egal `a ◦, tous les processus (publics et priv´es) peuvent ˆetre s´electionn´es par l’ordonnanceur pour ˆetre ex´ecut´es.

L’ordonnanceur peut avoir d’autres variables internes en plus des quatre variables cit´ees ci-dessus. On s’int´eresse seulement aux variables qui influencent l’interaction avec les programmes.

Une transition de l’ordonnanceur prend la forme hσ, νi + hσα 0, ν0i. Par convention, on repr´esentera ν par ses variables q, t, r et s et ν0 par q0, t0, r0 et s0. On suppose que l’ordonnanceur peut effectuer d’autres transitions qui ne sont pas forc´ement visibles.

Nous nous int´eresserons seulement aux transitions qui g´en`erent des ´ev´enements visibles au niveau des ´echanges avec le programme. Il s’agit du traitement d’une information qui aboutit `a la cr´eation ou `a la terminaison d’un processus, et de la communication d’une information de s´election d’un processus.

Les r`egles pour l’ordonnanceur s’´enoncent comme suit : – La r`egle α−→r

d assure que l’ordonnanceur met `a jour la bonne partie du bassin selon

la valeur de α au moment de la cr´eation des nouveaux processus.

– L’op´eration N (−→d ) retourne les identificateurs du processus et g´en`ere les nouveaux processus `a l’ex´ecution des commandes fork et hfork.

– La r`egle r garde les traces d’une transaction non terminale du processus r. L’effet direct est que le compteur q est d´ecr´ement´e d’une unit´e.

– La derni`ere transition d’un processus r envoie l’´ev´enement r × qui demande `a l’ordonnanceur d’exclure le processus r du bassin.

– Les ´ev´enements ↑ ◦r0 et ↑ •r0 sont envoy´es suite `a la s´election du processus r0. Un processus public ne peut ˆetre s´electionn´e que si s a la valeur ◦.

– Les ´ev´enements r • et • r sont issus de l’ex´ecution des commandes hide et unhide respectivement. L’ordonnanceur traite l’´ev´enement r • en d´epla¸cant le processus courant de la zone publique vers la zone priv´ee du bassin et affecte `a s0 la valeur •. En pr´esence de l’´ev´enement • r, l’ordonnanceur d´eplace le processus courant de la zone priv´ee vers la zone publique du bassin et affecte la valeur ◦ `a s0. – Les ´ev´enements r •× et • r× sont envoy´es suite `a l’ex´ecution des commandes hide et unhide respectivement, lorsqu’elles sont les derni`eres commandes du pro- cessus.

4.5.4 S´emantique du programme concurrent

Une configuration prend la forme h−→c , m, σ, vi, o`u −→c repr´esente le bassin des processus, m est la m´emoire des programme, σ est le programme de l’ordonnanceur et v sa m´emoire. Les transitions sont de la forme h−→c , m, σ, vi−→ hα −→c0, m0, σ0, v0i o`u α appartient au mˆeme ensemble d’´ev´enements que dans la s´emantique de l’ordonnanceur.

La s´emantique de la configuration du bassin des processus est repr´esent´ee dans la figure 4.4.

– La r`egle de la cr´eation dynamique du processus est d´eclench´ee lorsque le processus en cours crg´en`ere l’´ev´enement de cr´eation de processus α−→d, avec α ∈ {•, ◦}. Cet ´ev´enement

est synchronis´e avec l’´ev´enement de l’ordonnanceur αr−→

d qui indique `a l’ordonnanceur de

Figure 4.4 – S´emantique du bassin des processus tir´ee de [23]

– Si cr n’engendre pas de nouveaux processus ou se termine, la synchronisation se fait

avec l’´ev´enement de l’ordonnanceur r .

– Si crse termine par une transition sans ´etiquette, alors l’´ev´enement r × est n´ecessaire

pour la synchronisation, afin de mettre `a jour l’information du bassin des processus dans la m´emoire de l’ordonnanceur.

– Si crtermine avec • (respectivement • ), alors, la synchronisation avec r •× (res-

pectivement • r×) est n´ecessaire pour enregistrer la terminaison et la d´elocalisation de r dans la partie haute (respectivement basse) du bassin.

– L’´ev´enement de l’ordonnanceur ↑α r0 d´eclenche la s´election d’un nouveau processus r0

sans changer ni les commandes du bassin, ni la m´emoire des commandes.

– L’entr´ee et la sortie de la partie haute du bassin est faite par la synchronisation du processus courant avec l’´ev´enement de l’ordonnanceur r • et • r.

D´efinition 9. Terminaison de programme

Soient cfg une configuration non vide et cfg0 une configuration vide, s’il existe une transition cfg −→ cfgα 0, on dit que la configuration cfg se termine avec la configuration cfg0. On note cfg ⇓ cfg0.

Rappelons que le programme de l’ordonnanceur s’ex´ecute ind´efiniment. Par contre, par rap- port `a la d´efinition pr´ec´edente, le programme se termine s’il n’y a plus de processus `a planifier dans le bassin.

On suppose dans la suite que la fonction M(cfg) extrait la m´emoire du programme de la configuration du bassin. Par exemple, M(h−→c , m, σ, vi) = m .

4.5.5 Sp´ecification de s´ecurit´e

On suppose qu’on a un treillis de s´ecurit´e `a deux points {L v H}, et qu’un niveau de s´e- curit´e est attribu´e `a chaque variable au d´ebut du programme. La vue de la m´emoire du programme par l’attaquant est d´efinie par la relation d’´equivalence =Ld´efinie par m1=Lm2

si et seulement si les restrictions de m1 et m2 `a l’ensemble des variables de niveau de s´ecurit´e

L co¨ıncident. Un programme sera dit s´ecuritaire sous un ordonnanceur quelconque si pour deux ex´ecutions qui commencent avec deux m´emoires L-´equivalentes, lorsque les ex´ecutions se terminent, les deux m´emoires finales sont aussi L-´equivalentes. Cette affirmation est g´e- n´eralis´ee `a une classe d’ordonnanceurs dont le fonctionnement est conforme aux hypoth`eses de la section 4.5.3 et qui satisfont chacune une certaine forme de non-interf´erence que nous d´efinissons dans le paragraphe qui suit.

On s´epare les ´ev´enements li´es `a l’ordonnanceur en deux groupes, les ´ev´enements de haut niveau de s´ecurit´e et les ´ev´enements de bas niveau de s´ecurit´e :

– Les ´ev´enements ◦r−→

d, r , r ×, ↑ ◦r 0

, r •, • r, r • × et • r× op`erent sur des processus publics. Nous les appellerons par d´efinition des ´ev´enements de bas niveau de s´ecurit´e.

– Les ´ev´enements •r−→

d, r , r ×, ↑ •r

0, r •, • r, r • × et • r× (o`u r et r0 sont

des processus priv´es ) sont des ´ev´enements de haut niveau de s´ecurit´e.

On dira qu’une transition est de haut niveau (respectivement de bas niveau) si elle g´en`ere un ´

ev´enement de haut niveau (respectivement de bas niveau).

Avec cette partition s´ecuritaire d´efinie sur les ´ev´enements des ordonnanceurs, nous allons sp´ecifier « l’indiscernabilit´e » des configurations des ordonnanceurs.

Une relation R sur les configurations d’un ordonnanceur est une L-bisimulation si pour deux configurations li´ees par R, si une des deux (disons la premi`ere) peut faire une transition

de haut niveau vers une troisi`eme configuration, alors cette derni`ere est aussi en relation avec l’autre configuration (disons la seconde). D’autre part, si aucune des configurations ne peut effectuer une transition de haut niveau, mais que l’une peut effectuer une transition de bas niveau, alors, l’autre configuration peut aussi effectuer une transition de bas niveau avec la mˆeme ´etiquette, et les deux transitions r´esultantes doivent aussi ˆetre li´ees par R. Formellement, on a la d´efinition suivante :

D´efinition 10. L-bisimulation sur les configurations d’un ordonnanceur

Une relation R est une L-bisimulation sur les configurations d’un ordonnanceur si pour tout couple de configurations (hσ1, ν1i, hσ2, ν2i) appartenant `a R, on a :

– si hσi, νii α

* hσi0, νi0i avec α un ´ev´enement de haut niveau et i ∈ {1, 2}, alors hσi0, νi0i R hσ3−i, ν3−ii

– si aucune des configurations ne peut faire une transition en g´en´erant un ´ev´enement de haut niveau et si hσi, νii* hσα i0, νi0i avec α un ´ev´enement de bas niveau pour i ∈ {1, 2},

alors hσ3−i, ν3−ii α

* hσ3−i0 , ν3−i0 i et hσ0i, νi0i R hσ03−i, ν3−i0 i.

La premi`ere condition stipule que les transitions de haut niveau conservent la relation R, c’est-`a-dire qu’apr`es une telle transition, la configuration initiale et la configuration finale sont li´ees par R. La seconde stipule que si une des deux configurations li´ees par R peut seulement effectuer une transition de bas niveau, l’autre configuration peut aussi effectuer la mˆeme transition et les configurations d’arriv´ee restent li´ees par R.

D´efinition 11. L-indiscernabilit´e

On dira que deux configurations d’ordonnanceur hσ1, ν1i et hσ2, ν2i sont L-indiscernables s’il

existe une L-bisimulation R telle que hσ1, ν1iRhσ2, ν2i. On note hσ1, ν1i ∼Lhσ2, ν2i.

D´efinition 12. Ordonnanceur non interf´erent

L’ordonnanceur σ est dit non interf´erent si hσ, νi ∼Lhσ, νi pour toute m´emoire ν de l’ordon-

nanceur.

D´efinition 13. Programme s´ecuritaire

Un programme c est dit s´ecuritaire si pour tout ordonnanceur σ non interf´erent et pour deux m´emoires m1 et m2 L-´equivalentes on a :

hc, m1, σ, νiniti ⇓ cfg1 ∧ hc, m2, σ, νiniti ⇓ cfg2 =⇒ M(cfg1) =LM(cfg2).

On peut constater que cette condition de s´ecurit´e ne d´epend pas d’un ordonnanceur en par- ticulier, et qu’elle n’est pas sensible `a la terminaison d’une ex´ecution.

4.5.6 Syst`eme de types de s´ecurit´e

La figure 4.5pr´esente les r`egles de typage pour les expressions et les commandes. On suppose qu’on a un environnement de typage Γ qui associe `a chaque variable un type correspondant `a son niveau de s´ecurit´e (H ou L), et deux variables pc et hc dont les valeurs possibles sont des niveaux de s´ecurit´e. Par convention, on ´ecrira Γv pour restreindre Γ `a toutes les variables sauf

v. La variable pc garde le niveau de s´ecurit´e du contexte tel que d´ecrit dans le paragraphe

3.2.1.

Figure 4.5 – Syst`eme de types de s´ecurit´e tir´e de [23]

Les jugements de typage des commandes ont la forme Γ ` c : τ . Ces jugements utilisent le type d’une expression, qui correspond `a son niveau de s´ecurit´e tel que d´efini dans la section

3.2.1.

La variable de s´ecurit´e hc indique le « niveau de protection » de la section courante de code et τ d´ecrit le type de la commande. Les deux aident `a traquer les flots d’information propres `a une configuration concurrente. Le rˆole principal de hc est d’enregistrer si le processus courant est dans la partie haute (hc = H) du bassin des processus ou dans la partie basse (hc = L). Le type de commande τ garde la valeur de la variable hc apr`es l’ex´ecution de la commande. la r`egle pour l’affectation impose que le niveau de la variable affect´ee soit au moins plus grand que la borne sup´erieure entre le niveau de l’expression `a droite de l’affectation, le niveau du

contexte pc et le niveau de protection du bloc de code hc. Le m´ecanisme assure :

– qu’il n’y a pas d’affectation d’une expression de niveau H `a une variable de niveau L, – qu’il n’y a pas d’affectation `a une variable de niveau L dans un contexte de niveau

H. On a ainsi la garantie que, si le jugement Γpc, pc 7→ H ` c : τ est valide, alors la

commande c ne fait aucune affectation `a une variable de niveau L.

– qu’il n’y a pas d’affectation `a une variable de niveau L `a l’int´erieur d’un bloc dont le niveau de protection est H.

La r`egle pour les commandes hide et unhide hausse et abaisse respectivement le niveau du processus. La condition τev Γ(hc) dans les pr´emisses des r`egles de if et while assure que les

branches d’un bloc conditionnel ou d’une boucle de haut niveau ne peuvent ˆetre typ´ees que si hc vaut H. Ceci permet d’appliquer l’exigence qu’une instruction de contrˆole de haut niveau doit ˆetre ex´ecut´ee par un processus priv´e. La r`egle de typage assure aussi qu’une branche d’un if ou d’un while de haut niveau doit ˆetre typ´ee dans un contexte de haut niveau, c’est-`a-dire avec pc = H.

Le syst`eme de types assure qu’il n’y a pas de commande fork (mais probablement des hfork) dans une instruction de contrˆole de haut niveau. Ceci est contrˆol´e par la r`egle pour la com- mande fork qui exige que hc soit de niveau L.

On peut remarquer que si on exclut les r`egles de typage pour les commandes hide, unhide, fork et hfork, de mˆeme que les variables de type de s´ecurit´e hc et τ du tableau des r`egles de la figure4.5, on obtient le syst`eme de types standard de Volpano [32] pour la s´ecurisation du flot d’information dans un programme s´equentiel.

4.5.7 Extension du mod`ele aux ordonnanceurs coop´eratifs

Rappelons que l’ordonnanceur distribue le temps du processeur entre les diff´erents processus du bassin. Dans un syst`eme pr´eemptif, l’ordonnanceur peut interrompre `a tout moment une tˆache en cours d’ex´ecution pour permettre `a une autre tˆache de s’ex´ecuter. `A l’inverse, un ordonnanceur coop´eratif ne peut interrompre une tˆache pour laisser une autre s’ex´ecuter s’il n’a pas re¸cu une commande lui indiquant de faire ainsi. En pr´esence d’un ordonnanceur coop´eratif, il revient au programmeur d’inclure dans son code des commandes pour demander `

a l’ordonnanceur d’interrompre la tˆache en cours d’ex´ecution. Ce paragraphe examine une extension du mod`ele aux ordonnanceurs coop´eratifs. Cette extension se fait par un ajout mineur `a la s´emantique du programme et aux r`egles de typage.

Le langage est ´etendu avec la primitive yield dont la s´emantique op´erationnelle est :

La s´emantique de la commande doit pouvoir propager l’´etiquette 9 dans la r`egle de la com- position parall`ele. La s´emantique de l’ordonnanceur doit pouvoir r´eagir par la r´e-initialisation du compteur q0 :

q > 0 q0= 0 hσ, νir9* hσ0, ν0i

q > 0 q0 = 0 ∀α ∈ {◦, •} t0α= tα\{r}

hσ, νir9×* hσ0, ν0i .

On doit s’assurer que la seule possibilit´e de planifier un autre processus est par la g´en´eration de l’´ev´enement 9. Pour cela, on ajoute la pr´emisse q = ∞ `a la s´emantique de l’ordonnanceur pour les ´ev´enements de s´election ↑ ◦r0et ↑ •r0. D’autre part, la derni`ere r`egle de la figure4.4est valable pour α ∈ {r •, • r, 9} qui propage l’´ev´enement du processus `a l’ordonnanceur. Comme pour les ´ev´enements r •×, et • r×, une nouvelle transition sera ajout´ee `a la s´emantique du bassin des processus pour inclure le cas o`u la commande yield est ex´ecut´ee comme derni`ere commande du processus.

Dans le nouveau syst`eme de types, passer le contrˆole lorsqu’on est `a l’int´erieur d’une com- mande de haut niveau (pc = H) ou l’int´erieur du couple de commandes hide et unhide (hc = H) est potentiellement dangereux. La r`egle de typage de la commande yield permet d’´eviter une telle situation :

Γ(pc) = L Γ(hc) = L Γ ` yield : Γ(hc) .

Les auteurs montrent que le syst`eme de types reste coh´erent avec cette extension.

Figure 4.6 – syntaxe du langage avec gestion des s´emaphores tir´ee de [23]

4.5.8 Extension du mod`ele aux primitives de synchronisation

On ajoute au langage les commandes wait() et signal() pour la manipulation des s´emaphores. La s´emantique des nouvelles commandes est repr´esent´ee dans la figure 4.6.

L’extension de la s´emantique des ordonnanceurs passe par l’introduction d’une nouvelle va- riable qui garde la liste des processus bloqu´es. Les r`egles de s´election des processus par