• Aucun résultat trouvé

Approches hybrides pour l’application des politiques de s´ ecurit´ e

La combinaison d’analyses statique et dynamique est de plus en plus populaire. Les techniques ainsi g´en´er´ees sont plus permissives qu’une analyse statique pure. En effet, elles peuvent utiliser certaines informations qui ne sont disponibles que dynamique- ment, pour d´ecider de l’acceptation ou du rejet du programme. De plus ces techniques permettent de r´eduire la surcharge d’ex´ecution due aux tests effectu´es dynamiquement. En effet, ces techniques peuvent se servir d’informations obtenues lors d’une premi`ere analyse statique pour r´eduire les tests `a effectuer dynamiquement.

Russo et Sabelfeld [39] pr´esentent un moniteur hybride sensible au flot d’information. Une configuration du moniteur est de la forme hΓ, Γsi. Γ est un environnement de

typage, qui associe `a des variables, des niveaux de s´ecurit´e. L’analyse ´etant sensible au flot, l’environnement Γ peut changer durant l’ex´ecution des programmes et est consid´er´e comme faisant partie de l’´etat du moniteur. Le moniteur effectue des transitions de la forme, hΓ, Γsi

α

→γ hΓ0, Γ0si avec α qui d´esigne les diff´erents ´ev´enements internes que

peuvent d´eclencher les commandes de la figure 2.7, γ qui d´esigne un ´ev´enement de sortie ou simplement un ´ev´enement vide . La communication entre le programme et le moniteur se fait par le biais des ´ev´enements internes. En effet, chaque fois qu’une commande d´eclenche un ´ev´enement interne α, le moniteur permet `a l’ex´ecution de se poursuivre de fa¸con s´ecuritaire `a la condition qu’il soit lui mˆeme capable d’effectuer la transition ´etiquet´ee α. La r`egle suivante r´esume cette situation :

hc, mi−→ hcα 0, m0i hΓ, Γ si α − →γ hΓ0, Γ0si hhc, mi |µΓ, Γsi γ − → hhc0, m0i | µ Γ0, Γ0si

Chaque ´ev´enement α est synchronis´e avec le moniteur et l’´ev´enement γ est la r´eponse `

a un tel ´ev´enement. La figure2.7 repr´esente une s´emantique `a petits pas (small − step) des commandes. Le langage et la s´emantique sont standard, except´e la commande end qui sert `a marquer la fin des blocs conditionnels ( if et while). Celle-ci est g´en´er´ee lors de l’ex´ecution et ne fait pas partie des commandes disponibles dans les configurations avant ex´ecution. De fa¸con sommaire, les ´ev´enements informent le moniteur des com- portements du programme. Le moniteur s’en sert pour ´evaluer si l’instruction ex´ecut´ee est s´ecuritaire ou pas. Il pourra ´eventuellement soit d´ecider de modifier l’ex´ecution du programme, soit de l’arrˆeter. La s´emantique du moniteur est d´ecrite `a la figure 2.8. La pile Γsdans la configuration du moniteur, est une pile d’environnements de typage. Son

rˆole est semblable `a celui du pc (program counter ) dans un syst`eme de types, qui sert `

a enregistrer le niveau de s´ecurit´e du contexte. Lorsque la pile est vide (Γs = ), cela

indique que l’instruction courante se retrouve dans un contexte de niveau de s´ecurit´e bas L. En fait Γs = , ´equivaut `a pc = L. Autrement, lorsque Γs 6= , l’instruction cou-

rante se trouve dans un contexte de niveau de s´ecurit´e ´elev´e. Ce qui correspond dans un syst`eme de types, `a avoir pc = H. De plus, le nombre d’´el´ements empil´es dans Γs,

indique le nombre de branchements conditionnels imbriqu´es qui ont ´et´e faits. Chaque ´

el´ement empil´e renseigne sur l’analyse statique des branches non prises. Consid´erons l’exemple suivant :

if secret then (if secret’ then x := 0 else skip) else skip

Lorsque l’instruction x := 0 est ex´ecut´ee, le nombre d’´el´ements empil´es dans Γs est 2.

des branches non prises. La fonction lev(e, Γ), retourne le niveau de confidentialit´e de l’expression e en se servant de l’environnement Γ. La fonction updatel(c) retourne un

environnement de typage dans lequel le type L est attribu´e `a toutes les variables que la commande c peut modifier. Ces deux fonction sont en fait des v´erifications syntaxiques. Il est n´ecessaire de mieux expliquer les ´ev´enements. L’´ev´enement s, qui est d´eclench´e par la commande skip, est toujours accept´e sans modification `a la configuration du moniteur. L’´ev´enement a(x, e) d´eclench´e par la commande x := e, associe `a x le niveau de s´ecurit´e de lev(Γs) t lev(e, Γ). En fait, lev(Γs) retourne H lorsque Γs 6=  et L

si ce n’est pas le cas. L’´ev´enement b(e, c), qui est d´eclench´e par les branchements conditionnels ( if et while), indique au moniteur qu’un branchement sur l’expression e a ´et´e effectu´e et que la commande c est celle de la branche non prise. Prenons l’exemple suivant :

if e then x := 1 else x := 2

Avec e s’´evaluant `a vrai, l’´ev´enement d´eclench´e est b(e, x := 2). En communiquant cette information sur les branches non prises, le moniteur pourra ´eventuellement empˆecher les flots d’information implicites.

Expliquons maintenant le traitement effectu´e par le moniteur suite `a la r´eception de chacun de ces ´ev´enements. La r`egle (B-LOW) est appliqu´ee lorsqu’un branchement conditionnel est effectu´e dans un contexte de niveau de s´ecurit´e bas L. On peut noter que Γs =  aussi bien avant qu’apr`es la transition du moniteur. La r`egle (B-HIGH) est

appliqu´ee lorsqu’un branchement conditionnel est effectu´e sur une expression de niveau de s´ecurit´e ´elev´e H, soit lev(e, Γ) = H ou lorsque le branchement est effectu´e dans un contexte qui est d´ej`a de niveau de s´ecurit´e ´elev´e, soit Γs 6= . Le moniteur effectue

l’analyse statique des branches non prises. En r´ealit´e, il empile sur Γs un environne-

ment contenant l’ensemble des variables qui pourraient ˆetre modifi´ees par l’ex´ecution de la branche non prise, en leur attribuant comme nouveau type de s´ecurit´e H. Cet environnement est conserv´e jusqu’`a la sortie du branchement conditionnel, o`u il est d´epil´e grˆace `a la r`egle (J-HIGH). Cette derni`ere r`egle, met `a jour l’environnement Γ en attribuant le type H aux variables contenues dans l’environnement d´epil´e. Cela est r´ealis´e en faisant le supremum de Γ et Γ0 (Γ t Γ0). Cette op´eration permet de donner le mˆeme niveau de s´ecurit´e aux variables modifi´ees dans la branche non prise que celles dans la branche prise. Le moniteur est aussi conservateur que l’analyse statique, pour le typage des branchements conditionnels if et while avec une garde de niveau de s´e- curit´e ´elev´e H. Il est cependant plus permissif que l’analyse statique lorsque le niveau

hskip, mi−→ hstop, mis m(e) = v

hx := e, mi−−−−→ hstop, m[x 7→ v]ia(x,e) hc1, mi α −→ hstop, m0i hc1; c2, mi α −→ hc2, m0i hc1, mi α −→ hc01, m 0 i c016= stop hc1; c2, mi α −→ hc01; c2, m0i m(e) 6= 0 h if e then c1 else c2, mi b(e,c2) −−−−→ hc1; end, mi m(e) = 0 h if e then c1 else c2, mi b(e,c1) −−−−→ hc2; end, mi

hend, mi−→ hstop, mif m(e) 6= 0

h while e do c ,mi−b(e,skip)−−−−−→ hc; end;while e do c, mi m(e) = 0

h while e do c ,mi−−−→ hend, mib(e,c)

m(e) = v h outputl(e) ,mi

ol(e,v)

−−−−→ hstop, mi

Table 2.7 – S´emantique et ´ev´enements internes.

hΓ, Γsi s −→ hΓ, Γsi hΓ, Γsi a(x,e) −−−−→ hΓ[x 7→ lev(e, Γ) t lev(Γs)], Γsi (B-LOW) lev(e, Γ) = L hΓ, i−−−→ hΓ, ib(e,c) (B-HIGH) lev(e, Γ) = H ∨Γs6=  hΓ, Γsi b(e,c) −−−→ hΓ, updateH(c) : Γsi (J-LOW) hΓ, i−→ hΓ, if (J-HIGH) hΓ, Γ0: Γsi f −→ hΓ t Γ0, Γsi

Table 2.8 – Moniteur sensible au flot.

de s´ecurit´e de la garde est bas L. L’exemple suivant illustre bien ce fait. if l1 then l2 := h else l2 := 0 ; outputl(l2)

Avec Γ = {h 7→ H, l1 7→ L, l2 7→ L}. Ce programme est rejet´e par le syst`eme de types

sensible au flot de Hunt et Sands [20] qui est pr´esent´e `a la figure 2.4. En effet, le niveau de s´ecurit´e de l2 est ´elev´e `a H apr`es le branchement conditionnel. Alors que le moniteur

accepte cette ex´ecution lorsque l1 s’´evalue `a faux.

La r`egle (J-LOW) est appliqu´ee lorsque les points de jointure sont atteints avec un contexte de niveau bas L. On peut noter que l’´etat du moniteur n’est pas chang´e.