Utilisation de m thodes hybrides pour la d tection e e dintrusion param tr e par la politique de s curit e e e e reposant sur le suivi des ux dinformation
Mounir ASSAF
4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 8 8 9 10 10 11 12 12 13 15 16
2.1 Contrle d'accs . . . . . . . . . . . . . . . 2.1.1 DAC . . . . . . . . . . . . . . . . . . 2.1.2 MAC . . . . . . . . . . . . . . . . . . 2.2 Dtection d'intrusion . . . . . . . . . . . . . 2.2.1 Approches par scnarios . . . . . . . 2.2.2 Approches comportementales . . . . 2.3 Contrle de ux d'information . . . . . . . . 2.3.1 Politique de ux en treillis . . . . . . 2.3.2 La proprit de non-interfrence . . . 2.3.3 Politique de ux en termes de CCAL 2.4 Les mcanismes de contrle de ux . . . . . 2.4.1 L'analyse statique . . . . . . . . . . 2.4.2 L'analyse dynamique . . . . . . . . . 2.4.3 L'analyse hybride . . . . . . . . . . . 3.1 3.2 3.3 3.4
3 Contexte
Objectifs . . . . . . . . . . . . . . . . . . . . . . . Soot : analyse statique de Bytecode . . . . . . . . Jimple : reprsentation intermdiaire de Bytecode Analyse statique de ot de donnes . . . . . . . . 3.4.1 Analyse de vivacit des variables . . . . . 3.4.2 Post-dominateur dans un CFG . . . . . .
21
21 22 22 25 25 26
4 Travaux raliss
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Suivi des ux explicites . . . . . . . . . . . . . . . . . . . . 4.2.1 Description . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Prsentation de l'analyse statique des ux explicites 4.2.3 Les rfrences . . . . . . . . . . . . . . . . . . . . . . 4.2.4 Les appels de mthodes . . . . . . . . . . . . . . . . 4.3 Suivi des ux implicites . . . . . . . . . . . . . . . . . . . . 4.3.1 Description . . . . . . . . . . . . . . . . . . . . . . . 2
28
28 28 28 29 34 35 37 37
4.3.2 Prsentation de l'analyse statique des ux implicites directs . 4.3.3 Les appels de mthode . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Prsentation de l'analyse statique des ux implicites indirects 4.3.5 Les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
38 39 39 42 44
45
Chapitre 1
Introduction
Les systmes d'information sont de nos jours de plus en plus confronts de nombreux risques menaant leur scurit. La protection de ces systmes suppose dans un premier temps de dnir une politique de scurit exprimant les besoins en terme de condentialit, intgrit et disponibilit des biens et services, puis dans un second temps de mettre en uvre cette politique. Gnralement, des mcanismes d'authentication et de contrles d'accs sont dploys pour la mise en uvre de la politique de scurit. Ils vrient d'abord l'identit des utilisateurs, puis s'assurent que ces derniers ont bien les autorisations ncessaires pour accder aux ressources du systme. Cependant, il est important de noter que ces approches prventives ne sont pas toujours susantes pour garantir les proprits de scurit. Elles ncessitent la vrication et le contrle des actions des utilisateurs an de s'assurer postriori que la politique est bien respecte. Intervient alors la dtection d'intrusion qui n'est autre que la dtection des violations de la politique de scurit [And80]. Plusieurs modles de systmes de dtection d'intrusion (IDS) ont t proposs depuis les travaux sminaux d'Anderson [FHS97, SCS98, KR02, ZMB03, HMZ+ 07]. Certaines approches, dites par scnarios, se basent sur une connaissance priori des attaques contre le systme. D'autres, dites comportementales, dnissent plutt le comportement de rfrence du systme. Ces approches comportementales ont l'avantage de pouvoir dtecter mme des attaques nouvelles contrairement aux approches par scnarios. Dans le cadre de ce stage, nous nous intressons en particulier un modle comportemental de dtection d'intrusion, paramtr par la politique de scurit et reposant sur le suivi du ux d'information. Ce modle propos par le laboratoire SSIR, a t implment au niveau du systme d'exploitation Linux. Une deuxime implmentation a ensuite t ralise au niveau de la machine virtuelle Java (JVM). Cette seconde implmentation (JBlare) s'intgre avec la premire (Blare) et permet d'assurer un suivi dynamique du ux d'information dirents niveaux selon les applications. L'objectif de ce stage est d'tudier les techniques d'analyse statique qui pourraient tre mises en oeuvre pour le suivi des ux d'information au niveau des programmes Java an de diminuer l'impact de l'analyse dynamique et amliorer la prcision du suivi. Ce rapport est organis comme suit : Nous dresserons dans la premire partie 2 un tat de l'art de la dtection d'intrusion et du contrle de ux d'information. Nous montrerons les limites du contrle d'accs, puis nous prsenterons les dirents modles de dtection d'intrusion, dont un modle paramtr par la politique de scurit et reposant sur le suivi des ux d'information. Nous exposerons ensuite deux modle de politique de ux et les direntes approches pour le contrle de 4
dumas-00636135, version 1 - 26 Oct 2011
ux d'information. Nous introduisons ensuite dans la partie 3 le contexte de ce stage. Nous xerons nos objectifs, puis nous prsenterons les outils sur lesquels nous fondons notre approche. La partie 4 prsentera ensuite en dtail la dmarche que nous proposons. Enn, nous concluerons et discuterons des travaux futurs envisags dans la dernire partie 5.
Chapitre 2
tat de l'art
dumas-00636135, version 1 - 26 Oct 2011
Nous prsentons dans cette partie deux modles de contrle d'accs et leurs limites. Nous montrons que ces mcanismes sont soit trs restrictifs, soit insusants pour garantir l'application de la politique de scurit. Ensuite, dirents modles de dtection d'intrusion sont exposs, dont un modle paramtr par la politique de scurit et reposant sur le suivi du ux d'information. Nous prsontons aussi dans cette partie deux modles de politiques de ux ainsi que les proprits qu'ils cherchent garantir, puis nous faisons un tat de l'art concernant les mcanismes de contrle de ux.
2.1.1 DAC
L'un des modles classiques de contrle d'accs est le contrle d'accs discrtionnaire (DAC ). Ce modle est largement implment dans les systmes d'exploitation. Il dnit pour les sujets un ensemble d'actions qu'ils peuvent raliser sur des objets. La dnition de cet ensemble de permissions sur un objet particulier est laisse la discrtion du sujet auquel cet objet appartient. Dans [HRU76], les auteurs proposent de reprsenter l'ensemble des permissions par une matrice d'accs telle que l'illustre la gure 2.1. Les lignes de cette matrice correspondent aux sujets et les colonnes correspondent aux objets (qui peuvent eux-mmes tre des sujets). L'objet O par exemple appartient au sujet S1 qui possde sur cet objet les droits de lecture, criture et excution. Le sujet S1 n'autorise par contre que la lecture et l'excution de l'objet O pour le sujet S2. Bien que ce modle ait connu un grand succs, il est implment dans Unix, Linux et Windows, grce la exibilit qu'il introduit, il soure nanmoins d'un inconvnient majeur permettant de contourner la politique de scurit. Prenons l'exemple du sujet S3 dans la gure 2.1. N'ayant pas t autoris lire le contenu de l'objet O par le sujet S1, S3 ne devrait pas pouvoir y accder. S2 qui a 6
Objets Sujets O Lobjet O appartient au sujet S1 S1 Sujets own RWX Permissions du sujet S2 sur lobjet O : lecture, excution
S2 S3
R-X
--X
les droits de lecture sur O, pourrait toutefois copier ce contenu dans un second objet qu'il mettrait la disposition de S3. Ce problme est inhrent au fait que ce modle ne tient pas compte des ux d'informations engendrs par la suite d'accs auxquels a t autoris le sujet S2. En eet, une fois l'accs l'information autoris, ce modle n'impose pas de contraintes quant la dissmination de l'information contrairement au modle introduit par Bell et Lapadula [LB73], prsent par la suite.
2.1.2 MAC
Le contrle d'accs obligatoire (MAC) impose que les droits d'accs aux objets ne soient pas seulement dnis par les propritaires des objets concerns. Bell et Lapadula [LB73] ont introduit un modle de contrle d'accs obligatoire qui associe tous les sujets et objets un niveau de scurit. Les sujets reoivent un niveau d'habilitation ainsi qu'un ensemble de domaines auxquels ils sont conns. Les objets reoivent un niveau de classication et un ensemble de domaines. Ce modle dnit de nouvelles rgles d'accs an d'assurer le connement de l'information en se basant sur les niveaux de sensibilit aects aux sujets (habilitation) ou objets (classication) ainsi que sur les domaines auxquels ils appartiennent. Une relation d'ordre total est dnie sur l'ensemble des niveaux de sensibilit, alors qu'une relation d'ordre partiel correspondant la relation de la thorie des ensembles est dnie pour les domaines. Les rgles du contrle d'accs obligatoire dpendent de la proprit de scurit laquelle on s'intresse, condentialit ou intgrit. En eet, le modle propos par Bell et Lapadula [LB73] assure la condentialit alors que celui propos par Biba [Bib77] assure l'intgrit. Comme l'illustre la gure 2.2, le modle mettant en uvre la condentialit assure qu'un sujet S ne pourra lire l'information contenue dans un objet O que dans le cas o le niveau de classication de O est infrieur ou gal au niveau d'habilitation de S pour la relation , et que le domaine de S domine le domaine de O pour la relation . Ce modle conne aussi le ux d'information puisque le sujet S ne peut dclassier l'information. Pour que S puisse modier un objet O, il faut que le niveau d'habilitation de S soit infrieur au niveau de classication de O et que le domaine de S domine le domaine de O. Ce modle impose donc bien de ce fait la condentialit de l'information pouvant tre lue. De la mme manire, dans le cas du modle mettant en uvre l'intgrit, un sujet ne peut modier un objet s'il n'a pas un niveau d'habilitation suprieur au niveau de classication de l'objet et si son domaine ne domine pas le domaine de l'objet pour la relation . 7
Types d'accs
Type de politique
Condentialit
no read up
Hsujet Cobjet Dobjet Dsujet
Intgrit
no read down
Hsujet Cobjet Dobjet Dsujet
no write down
no write up
Figure 2.2 Rgles d'autorisation d'accs des modles de contrle d'accs obligatoire
Cette approche permet un certain contrle du ux d'information, mais elle est trs restrictive. Elle pose le problme de la contamination de labels (label creep ) puisque le modle de Bell et Lapadula impose qu' chaque fois qu'un sujet habilit modie un objet, le niveau de classication de l'information contenue dans cet objet augmente. Les mcanismes classiques de mise en uvre des politiques de scurit, dits prventifs, s'avrent souvent insusants ou trop restrictif. Le contrle d'accs discrtionnaire n'est pas adapt pour suivre de manire able et prcise, le ot d'information an de garantir les proprits d'intgrit et de condentialit. Le contrle d'accs obligatoire par contre est trop restrictif pour tre utilis dans des systmes grand public ou professionnels. Il est donc ncessaire de s'en remettre des mcanismes d'audit et de contrle postriori automatiss.
dnissent des signatures correspondant l'exploitation de vulnrabilits connues et remontent une alerte ds qu'une tentative d'intrusion est dtecte. Faciles congurer, les systmes de dtection d'intrusion bass sur ce type d'approche, permettent aussi de fournir des rapports trs prcis concernant l'intrusion dtecte, puisque chaque signature est en gnral propre une vulnrabilit particulire, prsente sur une version particulire du programme attaqu. Cependant, ces systmes ne dtectent pas les intrusions eectives, mais les attaques contre le systme. Ils sont aussi trs limits par le fait qu'ils ne peuvent dtecter des attaques rsultant de l'exploitation de vulnrabilits non publiques (zero days vulnerabilities ). De plus, garder une base de connaissance des signatures d'attaques jour peut s'avrer tre une tche trs laborieuse au vue du nombre de nouvelles vulnrabilits dcouvertes chaque jour.
la scurit du systme. Ce modle a t valid par une implmentation propose par Sekar. Nanmoins, il soure d'un inconvnient majeur puisque la mise en place de spcications pour chaque programme du systme et chacune des mises jour de ces programmes s'avre laborieuse. Une troisime approche consiste s'aranchir de la spcication des comportements lgaux de tous les programmes et d'induire ce comportement partir de la politique de scurit. Cette approche dite paramtre par la politique de scurit a t initialement propose par Ko et Redmond [KR02] an de dtecter les violations d'intgrit par des programmes concurrents (des conditions de course). Les travaux du laboratoire SSIR proposent un modle plus gnral qui permet de prendre en compte la fois les problmatiques de condentialit et d'intgrit [ZMB03, HMMT07] et ne sont pas cantonns aux attaques dites de conditions de course. Ce modle infre l'ensemble des comportements sains des applications en termes de ux d'informations autoriss en se basant sur la politique de scurit dnie au niveau de l'OS, la politique DAC notamment. Notons que ce modle ne s'intresse qu' la dtection des violations de proprits de condentialit et d'intgrit. Un programme malveillant prsent sur le systme ne sera dtect qu'au moment o il violera l'une de ces proprits de scurit par exemple. Une implmentation de ce modle a t propose dans [ZMB03, HMMT07]. Elle permet le suivi et le contrle du ux d'informations au niveau OS (Blare) ainsi qu'au niveau de la JVM (JBlare). JBlare ralise un suivi dynamique de ux d'information en instrumentant le bytecode des programmes Java. Ce suivi surapproxime cependant les ux engendrs au sein des mthodes Java, considres comme des botes noires. Les parties suivantes s'intresseront au contrle de ux d'information et notamment aux mcanismes permettant d'amliorer les performances et la prcision du suivi ralis par JBlare.
10
Dnition 1 (Modle de politique de ux d'information en treillis). Un modle de ux d'information < SC, , > forme un treillis si : 1. la relation dnit une relation d'ordre partielle sur l'ensemble SC ; 2. l'ensemble SC est ni ; 3. SC admet une borne infrieure L telle que A SC, L A ; 4. dnit une borne suprieure minimale sur SC SC .
L'hypothse 1 suppose que la relation dnisse une relation d'ordre partielle sur SC . Elle est donc rexive, antisymtrique et transitive. La rexivit et l'antisymtrie ne posent pas de problmes particuliers. En eet, il est cohrent que toute politique autorise les ux intra-classes , un exemple typique tant l'aectation d'une variable elle-mme. De plus, si l'antisymtrie n'est pas vrie alors (A, B) SC SC tels que A B et B A avec A = B . Dans ce cas, rien ne justie de direncier ces deux classes de scurit puisqu'un ux d'une classe vers l'autre est considr lgal. La condition de transitivit implique que si A B et B C alors A C , c'est dire que si le ux indirect entre A et C en passant par B est permis alors le ux entre A et C est permis. Cette condition est raisonnable, bien qu'il soit ncessaire parfois de dnir des politiques de ux intransitives ; dans le cas de la dclassication par exemple, secret dclassi et dclassi publique alors que secret publique. Les hypothses 2 et 3 considrent que l'ensemble SC est ni et qu'il admet une borne infrieure. En vue d'une implmentation sur un systme informatique, l'ensemble SC doit tre ni. L'hypothse de l'existence d'une borne infrieure ne pose pas de problmes particuliers non plus puisque dans tous systmes informatiques, il existe des informations publiques si ce n'est les constantes utilises dans les programmes informatiques. Pour l'hypothse 4, par dnition de , A A B et B A B . Or si C SC tel que C A B et C = A B , alors il sut de poser A B = C .
Cette dnition inspire de [VSI96] et [RS10], spcie que les variables de niveau bas ne dpendent pas des variables de niveau haut. En eet, si les valeurs de toutes les variables de niveau suprieur l sont changes entre deux excutions successives du programme p, cel n'impactera pas du tout les valeurs des variables de niveau infrieur ou gale l. Cette dnition ne tient toutefois pas compte de la non-terminaison du programme qui pourrait causer une fuite d'information. Elle est dite insensible la terminaison du programme.
Dnition 3 (Politique de ux). Une politique de ux est un ensemble des paires (Ii , i )iI appeles
CCAL o : Ii P(I) est un ensemble de contenus i P(O) est un ensemble de conteneurs
Une violation de la politique de scurit est alors dnie par l'association d'un contenu I un conteneur O alors que cette association n'est autorise par aucun CCAL dnissant la politique de ux :
implicite lorsque la valeur d'une variable dpend d'un branchement conditionnel. Dans l'exemple if (secret) then public := 1 else public := 0, il y a un ux d'information implicite de la variable secret contrlant le branchement vers la variable public.
(COMPOSE)
n n (BASE) ; n : l (l) (CONTENTS) ; x : var if (x) = var e n, e n ; l : var if (l) = (ADD) ; e : , ; e : e+e n+n e n, l dom() ; e + e : (UPDATE) ; e : var l := e [l := n] c , c ; e : (SEQUENCE) ; e : c; c e 1, c ; e := e : cmd (BRANCH) ; c : cmd, ; c : cmd if e then c else c e 0, c ; c; c : cmd ; e : , if e then c else c ; c : cmd, e0 (LOOP) ; c : cmd while e do c e 1, c , e+e n+n ; e : , ; c : cmd while e do c ; while e do c : cmd while e do c ; e : , e n, l dom(), / ; [x : var] c : cmd [l := n] [l/x]c (BINDVAR) e+e n+n letvar x := e in c l
Figure 2.6 Les rgles du systme de type de Vol- Figure 2.7 Smantique naturelle du language impratif respectent la politique de ux. Elle spcie que l'aectation de la valeur d'une variable e e n'est possible que si e = e , tout en permettant cette aectation dans le cas gnral o e e grce au sous-typage. La rgle (COMPOSE) combine au sous-typage de commandes, s'assure que le type associ la composition de deux commandes c et c est au plus gal c c . Les rgles (IF) et (WHILE) garantissent que les ux implicites respectent la politique de ux. Elles s'assurent que les aectations de variables globales l'intrieur de branchements ne concernent que des variables dont le niveau de scurit est plus haut que celui de la variable de contrle. Enn, la rgle (LETVAR) garantit que le ux d'information explicite d l'initialisation des variables locales ne viole pas la politique de ux. En eet, si une variable x est initialie avec la valeur de l'expression e, la mmoire est mise jour pour associer x le label de e. Jif [Mye99], une implmentation de ce systme de type a t ralise. Elle propose d'associer statiquement des labels de scurit aux variables, pour le contrle de ux au sein des programmes Java. Cependant, le caractre g des labels de scurit associs aux variables fait de ce systme de type une analyse trop restrictive. Le programme secret = public; public = secret n'est pas typable par exemple, car cette analyse considre qu'il y a une fuite d'information suite l'aectation de la variable secret public , alors mme que secret contient une valeur publique. Cette analyse est dite 14
insensible au ux car elle ne permet pas la propagation des labels de scurit. Une analyse statique plus permissive a t propose dans [HS06]. Cette analyse permet le typage du programme ci-dessus car un label de scurit bas est associ la variable secret suite l'aectation secret = public. Cette analyse est dite sensible au ux car elle permet la propagation des labels de scurit. Cependant, ces deux analyses statiques cherchent prouver que toutes les excutions possibles d'un programme sont compatibles avec la politique de scurit. Or il est parfois dsirable de s'intresser la scurit de l'excution courante d'un programme seulement, sans prendre en compte toutes les excutions possibles.
F1
F2
CCALA CCALB
Figure 2.8
L'interprtation en termes de CCAL de la gure 2.8b interdit l'utilisateur B d'accder en lecture au contenu f1 . Les gures 2.9b et 2.9c illustrent l'volution des objets suite la copie du contenu du chier F1 dans F2 puis la lecture de F2 par l'utilisateur B. La copie du chier F1 vers F2 gnre un ux d'information du contenu f1 vers le conteneur F2 . Ce ux d'information se traduit R alors par la propagation des restrictions du TAG en lecture TF1 = {CCALA } du chier F1 vers les restrictions du TAG en lecture du chier F2 = {CCALA , CCALB }. Cette propagation est induite R R par l'intersection de ces deux tags : TF2 TF1 = {CCALA } (gure 2.9b). Ce ux d'information peut donc tre not :
R W R W R R W ((F1 , f1 , TF1 , TF1 ), (F2 , f2 , TF2 , TF2 )) (F2 , f2 f1 , TF2 TF1 , TF2 )
C1 C2 CA CB
C1 C2 CA CB
C1 C2 CA CB
16
L'analyse propose tant une analyse sensible au ux, la valeur qu'associe chaque variable peut varier au cours de l'excution. Le second environnement s est utilis pour tenir compte des ux implicites. Il est initialis [ ] au dbut de l'excution. chaque fois qu'un branchement sur une variable de contrle de niveau H est rencontr, les variables modies dans les branches non excute sont ajoutes s , en y associant le label H . La gnration de cet environnement empil dans s , repose en gnral sur des annotations adjointes au programme durant l'analyse statique. s est aussi souvent appel contexte d'excution. En eet si s = , alors l'excution courante du programme gnre des ux implicites qu'il faut prendre en compte. Il est not que si s = [ ], le niveau de scurit associ au contexte d'excution est L (s = L). Si s = [ ], alors s = H . La smantique du langage impratif utilis est prsente gure 2.11. Les instructions de ce langage dclenche des vnements internes nots . Le contrleur ragit alors via des vnements . Ces vnements synchronisent en fait le programme et le contrleur de ux. (STOP) (LEVEL)
dumas-00636135, version 1 - 26 Oct 2011
, s , s , s [x lev(e, ) lev(s )], s lev(e, ) = L , , lev(e, ) = H s =
b(e,c) b(e,c) a(x,e) s
, s , updateh (c) : f , : s , s , ,
f
skip, m stop, m m(e) = v x := e, m stop, m[x v] c1 , m stop, m c1 ; c2 , m c2 , m c1 , m c1 , m , c1 = stop c1 ; c2 , m c1 ; c2 , m m(e) = 0 if e then c1 else c2 , m m(e) = 0
b(e,c2 ) a(x,e)
c1 ; end, m
(WHILE)
b(e,c1 )
(STOP) (OUTPUT)
b(e,skip)
stop, m
1 2 3 4 5 6 7 8 9 10
if
secret
if
else else
endif endif skip
outputL (x)
18
0 1 2 3 6 9
H, H, H, H, H, H,
x L, x L, x L, x H, x H, x H,
yL yL yL yL yH yH
19
Cette exception tant dclare et gre explicitement par une instruction try{. . .} catch{. . .}, Il est possible de tenir compte d'une manire prcise du transfert de ot de contrle grce l'analyse statique du bytecode. Nair et al. [NSCT07] ainsi que Chandra et Franz [CF07] prconisent dans ce cas d'ajouter au GFC une arte reliant le dbut du bloc d'instructions try{. . .} au bloc d'instructions catch{. . .}. Les exceptions peuvent tre dclares mais non gres explicitement par la mthode qui les dclare. Il est alors beaucoup plus dicile, de dterminer quel bloc d'instructions est excut pour la gestion de l'erreur leve, au moment de l'analyse statique. Chandra et Franz ignorent ce type d'exceptions. Nair et al. adoptent par contre une approche dirente. L'analyse statique essaie de dterminer quel type d'exception est lev, pour tenter de trouver l'instruction qui place dans la pile la rfrence ce type d'exception. Cette rfrence correspond au bloc charg de grer cette exception. Une arte reliant l'instruction throw ce bloc est ajoute au GFC. En cas d'chec, une arte relie chaque instruction throw au bloc exit de la mthode dans laquelle elle se trouve. Il est noter que les deux approches ignorent les exceptions non dclares.
dumas-00636135, version 1 - 26 Oct 2011
20
Chapitre 3
Contexte
dumas-00636135, version 1 - 26 Oct 2011
Dans cette partie, nous allons tout d'abord rappeler les objectifs de ce stage. Nous prsenterons ensuite l'outil Soot d'analyse statique de Bytecode, la reprsentation intermdiaire Jimple sur laquelle nous fondons notre analyse statique, puis deux exemples d'analyse de ux de donnes statique.
3.1 Objectifs
L'objectif de ce stage est de proposer un mcanisme hybride de suivi de ux d'information au sein des programmes Java, pour la dtection d'intrusion paramtre par la politique de scurit. Ce mcanisme inclue une premire analyse, statique, qui opre sur le Bytecode, puis une seconde analyse, dynamique, qui dduit les ux d'information gnrs par une excution d'un programme grce aux rsultats de l'analyse statique. L'analyse statique doit raliser un prol pour chaque classe Java analyse puis le sauvegarder sous forme d'annotations dans le chier contenant la classe correspondante. Ceci permettra l'analyse dynamique de rutiliser ce prol lors de chaque excution, sans avoir relancer l'analyse statique pour le regnrer. Contrairement Nair et al. [NSCT07] ainsi que Chandra et Franz [CF07] qui s'appuient sur l'analyse statique pour tenir compte des ux implicites seulement, nous souhaitons que notre analyse puisse aussi tenir compte des ux explicites pour amliorer les performances du suivi de ux d'information lors de l'analyse dynamique. L'analyse dynamique doit s'appuyer sur les annotations gnres par l'analyse statique pour dduire les ux d'information gnrs par le programme contrl, puis mettre jour les labels de scurit associs aux variables manipules. Comme Nair et al [NSCT07], nous prenons le parti de modier une JVM plutt que d'instrumenter le Bytecode Java. Ceci permettra de limiter l'impact de l'analyse dynamique et faciliter son intgration avec le mcanisme Blare de suivi des ux d'information au niveau OS. La premire partie de ce stage, comptant pour le Master Recherche en Informatique de l'universit de Rennes 1, doit dboucher sur le dveloppement d'un modle d'analyse statique pour le suivi de ux d'information. La conception et l'implmentation de l'analyse dynamique seront ralises lors de la seconde partie de ce stage, comptant comme stage de n d'tude pour l'cole Suplec. Les travaux eectus concernant l'analyse statique sont prsents dans la partie 4. Les trois sections suivantes exposent les outils ainsi que le contexte de l'analyse statique dveloppe.
21
L'analyse statique de Bytecode et plus gnralement des langages de pile s'avrant trs complexe, Valle-Rai et Hendren [VRH98] ont eu recours au dveloppement d'une reprsentation intermdiaire de Bytecode faciliant cette tche. Cette forme intermdiaire, appele Jimple, a les caractristiques suivantes : elle est sous la forme d'un code 3 adresses ; elle n'utilise pas de pile ; ses variables sont explicitement dclares et types. L'exemple suivant de la gure 3.1, tir de [VRH98], est une squence d'instructions Bytecode stockant dans la variable locale l0 la valeur de l'expression l1/(5 (l2 + l3)). Cette exemple illustre la dicult de l'analyse statique de Bytecode. En eet, avant de pouvoir dterminer quelle expression est utilise la ligne 10 par exemple, il faut d'abord examiner toutes les instructions prcdentes en simulant leur eet sur la pile. Ceci peut s'avrer trs coteux, d'autant plus qu'il peut y avoir un trs grand nombre d'instructions entre l'empilement d'un oprande sur la pile et son dpilement, c'est-dire son utilisation. Or en Jimple, il sut de localiser les instructions qui manipulent la variable correspondante. De plus, le nombre trs restreint d'instructions Jimple, compar la multitude d'instructions Bytecode, facilite grandement l'implmentation d'une analyse statique. La gnration de code Jimple partir de Bytecode dans le framework Soot passe par 5 tapes : 1. 2. 3. 4. 5. gnration de code Jimple simple non typ ; une premire phase d'optimisation ; sparation des direntes variables pour prparer le typage ; typage du code Jimple ; une dernire phase d'optimisation.
Dans la suite de ce rapport, nous ne nous intresserons pas aux tapes d'optimisation 2 et 5 que nous avons dsactives lors de l'analyse, car nous souhaitons garder une forme intermdiaire la plus dle possible au Bytecode initial, pour permettre la transposition des rsultats de notre analyse statique. La premire tape de gnration du code Jimple consiste produire un code 3 adresses simple, non typ. Ceci est ralis en associant chaque oprande de pile une variable Jimple locale non type, puis en transformant les rfrences d'oprandes de piles implicites en rfrences explicites de variables locales. La gure 3.1 illustre ces transformations. 22
Instructions Bytecode
1 2 3 4 5 6 7 8 9 10
Instructions Jimple $stack0 = l1 $stack1 = 5 $stack2 = l2 $stack3 = l3 $stack2 = $stack2 + $stack3 $stack1 = $stack1 * $stack2 $stack0 = $stack0 / $stack1 ... ... l0 = $stack0
iload 1 iconst 5 iload 2 iload 3 iadd imul idiv ... ... istore 0
Instructions Bytecode
1 2 3 4
Instructions Jimple
1 2 3 4
Dnition 5 (Une variable dnie par une instruction). Une instruction dnit une variable si elle
assigne une valeur cette variable. lit la valeur de cette variable.
Dnition 6 (Une variable utilise par une instruction). Une instruction utilise une variable si elle Dnition 7 (Un web). Un web est un ensemble S de rfrences, minimal et clos. Cet ensemble
est clos dans le sens o pour chaque dnition d S , toutes les utilisations possibles de d sont dans S . De mme, pour chaque utilisation u S , toutes les dnitions possibles de u sont dans S . Un algorithme de construction des webs d'un programme est fourni dans [Muc97]. Considrons l'exemple illustr par la gure 3.3. 23
If z > 1
If z#1 > 1
x=1
x=2
x#1 = 1
x#1 = 2
If z > 2
If z#1 > 2
y=x+1
z = x -3
y#1 = x#1 + 1
z#2 = x#1 -3
x=4
x#2 = 4
z=x+7
z#3 = x#2 + 7
exit
exit
Dnitions d Utilisations u
24
L'tape numro 4 de la production du code Jimple consiste aecter des types aux direntes variables. L'approche adopte dans Soot consiste construire un ensemble de restrictions de types pour chaque variable locale en parcourant le code. Ces restrictions sont ensuite utilises pour en dduire le type de la variable en question.
Dnition 8 (La vivacit d'une variable). Une variable x est vive dans une instruction i si l'une
des conditions suivantes est ralise : 1. x est utilise dans l'instruction i ; 2. x est vive aprs l'excution de i, sans tre rednie par i.
Dans l'exemple de la gure 3.6, la variable y est utilise la premire instruction, mais n'est plus utilise plus tard. Donc la variable y est vive la premire instruction seulement. Notons que cette variable doit tre dnie bien avant ce bloc d'instruction. La variable x, par contre, est dnie la premire instruction, puis est utilise la dernire instruction. Or il existe un chemin d'excution o x n'est pas rednie entre la premire et la dernire instruction, elle est donc vive pour tout ce bloc d'instructions. Quant la variable z , elle n'est jamais utilise, bien que dnie la deuxime et quatrime instruction. Elle n'est donc vive aucune instruction. L'analyse de vivacit peut tre formalise en analyse de ot de donnes en arrire (backward analysis ) : le parcours du CFG dbute par le point de sortie du programme et remonte dans le sens contraire au chemin d'excution. Cette analyse associe deux ensembles chaque instruction i du programme, genSet(i) et killSet(i), dnis par les quations locales 3.1. GenSet(i) est l'ensemble des variables utilises par i, alors que KillSet(i) est l'ensemble des variables dnies par i.
GenSet(i) = ensemble de variables utilises par i KillSet(i) = ensemble variables dnies par i
(3.1)
25
x = y +1
z=0
If x < 0
z=1
x = sqrt(x)
return x
(3.2)
L'ensemble OutSet(i) reprsente les variables vives aprs l'excution de l'intruction i. On considre par dnition, qu'une variable est vive aprs l'instruction i si elle est vive dans au moins un des successeurs de i car on cherche dterminer toutes les variables potentiellement vives, d'o l'utilisation de l'union. Si l'on cherchait dterminer les variables srement vives aprs une instruction donne, on aurait plutt utilis l'intersection des ensembles InSet(s), o s est un successeur de l'instruction i. Ce choix est trs important et dpend fortement de l'utilisation que nous voulons faire des rsultats de cette analyse. Si cette analyse est utilise pour l'limination de code inutile, nous choisirons de faire une sur-approximation des variables vives car nous voudrons absolument viter de supprimer des dnitions de variables qui pourraient tre utilises plus tard. Nous opterons alors pour l'union -comme nous l'avons fait dans cet exemple- plutt que l'intersection. L'ensemble InSet(i) par contre reprsente les variables vives avant l'excution de l'instruction i. L'analyse de ux de donnes rsout ces quations grce au parcous du CFG et la propagation des ensembles inSet et outSet, jusqu' trouver un point xe et donc une solution ces quations globales. La gure 3.7 illustre le rsultat de cet analyse sur l'exemple de la gure 3.6 :
26
On appelle aussi un post-dominateur immdiat du noeud n l'unique noeud qui est dirent de n, qui post-domine n et qui est post-domin par tous les autres post-dominateurs de n. Pour une instruction conditionnelle, le post-dominateur immdiat est le point de jonction de toutes les branches de cette instruction. Le noeud exit est par exemple le post-dominateur immdiat du noeud 1 dans la gure 3.3. Les post-dominateurs des noeuds d'un CFG peuvent tre dtermins grce une analyse de ot de donnes en arrire. Les quations de cette analyse sont fournies dans la gure 3.3. Un exemple de cette analyse est aussi droul gure 3.8.
OutSet(i) = s:succ(i) InSet(s) InSet(i) = outSet(i) {i}
(3.3)
z=0
z=0
If x < 0
in Se t(4
3
{x
in Se
If x < 0
t(4
3
{5 ,6
outSet(3) = {4,6}{5,6}
t(5 )=
in
z=1
inS )= (4 x } et = { S ut ( et 6)
x = sqrt(x)
o in utS Se e t t(6 (5) )= = {x }
z=1
e inS = 4) {6} t( Se = ut t( 6)
in
Se
)= {x }
,6
Se
t(5 )=
)= {4
x = sqrt(x)
o in utS Se e t t(6 (5) )= = {6 }
5 killSet(4)={z}
return x outSet(6)={}
genSet(6)={x}
return x outSet(6)={}
Figure
3.7 Analyse de vivacit sur Figure 3.8 Analyse des post-dominateur l'exemple gure 3.6 sur l'exemple de la gure 3.6
27
Chapitre 4
Travaux raliss
4.1 Introduction
L'analyse statique que nous souhaitons raliser est une analyse intra-mthode. En eet, pour un programme Java, il est souvent impossible de dterminer, avec prcision, quelle mthode est appele lors de l'excution grce une analyse statique. Une analyse inter-procdurale ncessiterait alors de faire de grossires approximations. Notre analyse construit construit donc un prol pour chacune des mthodes appartenant aux classes Java analyses. Ce prol est ensuite utilis pour annoter la mthode correspondante. Cette analyse statique est ralise sur la reprsentation intermdiaire Jimple des mthodes. Elle fait l'hypothse que la JVM modie, ralisant l'analyse dynamique, soit capable d'aecter des labels de scurit aux variables manipules, que ces variables soient des paramtres de mthodes, oprandes de pile, objets ou attributs d'objets. De plus, cette JVM est capable de charger les annotations d'une mthode avant son excution et de les interprter en termes de ux d'information et de points de contrle, qui pointent tous deux vers des instructions Bytecode de la mthode analyse. Ces points de contrle correspondent un ensemble de compteurs ordinaux d'instructions Bytecode pour lesquelles il est ncessaire que la JVM eectue certaines actions an de suivre les ux d'information, avant de pouvoir poursuivre l'excution l'instruction suivante. Ces actions sont explicites dans la suite de ce rapport. Notons que l'analyse que nous proposons n'est pas une analyse l scuris car nous raisonnons sur une excution squentielle des mthodes analyses.
dumas-00636135, version 1 - 26 Oct 2011
4.2.1 Description
L'analyse propose pour permettre le suivi des ux explicites est une analyse de ux de donnes en avant (forward analysis ). Le parcours du CFG dbute par les points d'entre de la mthode, 28
puis continue dans le sens du chemin d'excution. Nous souhaitons tenir compte avec prcision des ux explicites grce cette analyse. Cependant, comme nous l'avons discut dans la section 3.4.1, la perte d'information est inhrente l'analyse statique puisque nous devons choisir entre une surapproximation ou une sous-approximation des ux gnrs par deux chemins d'excution dirents qui se rejoignent. Ceci est illustr par la gure 4.1.
If z > 1
x=1 x {y} : un flux dinformation de y vers x a=b a {b} x=y x {y} y=x+1
x=2
If z > 2
z = x -3
x=4
z=x+7
Figure
4.2 Exemple de dcoupage d'une mthode en blocs de base Nous nous aranchissons de ce problme en dcoupant la mthode analyse en blocs de base et en restreignant l'analyse statique chacun de ces blocs. Un bloc de base est une squence d'instruction, ayant un seul point d'entre (la premire instruction) et un seul point de sortie (la dernire instruction) [All70]. Ceci veut dire qu' chaque fois que la premire instruction d'un bloc est excute, les instructions suivantes de ce bloc sont excutes dans l'ordre et une seule fois. Un bloc de base ne contient donc ni des boucles ni des branchements. Il peut biensr avoir plusieurs blocs successeurs ou prdcesseurs. Il peut aussi tre lui mme un bloc successeur dans le cas des boucles. La gure 4.2 illustre un exemple de dcoupage d'une mthode en blocs de base.
dans cette sous-section que les ux gnrs par des types primitifs Java puisque nous discuterons les rfrences dans la sous-section 4.2.3. L'analyse propose associe deux ensembles d'associations chaque instruction i du bloc de base Jimple analys, inSet(i) et outSet(i). Ces ensembles associe une variable son ensemble de dpendance. L'ensemble associe une variable v (que nous noterons inSet(i)[v] ou outSet(i)[v]) est l'ensemble des variables dont v dpend explicitement. Cela signie qu'il y a un ux d'information explicite partir de toutes les variables appartenant l'ensemble inSet(i)[v] (respectivement outSet(i)[v]) vers la variable v . L'ensemble inSet(i)[v] est l'ensemble des ux d'information explicites gnrs avant l'excution de l'instruction i, alors que l'ensemble outSet(i)[v] reprsente les ux explicites gnrs aprs l'excution de l'instruction i. Les quations de cette analyse de ux de donnes en avant sont explicites en 4.1. L'ensemble d'associations inSet du point d'entre du bloc de base est initialis l'ensembles d'associations vide {}.
inSet(i) = outSet(pred(i))
outSet(i) = genSet(i) inSet(i) {v Dv } si i dnit une variable v . Dv est l'ensemble genSet(i) = des variables utilises pour dnir v {} sinon
(4.1)
La premire quation de 4.1 copie dans l'ensemble d'associations inSet de l'instruction i l'ensemble d'associations outSet de son prdcesseur. La seconde quation introduit un ensemble d'associations genSet(i) ainsi qu'un oprateur . L'ensemble d'associations genSet(i) correspond aux ux d'information explicites gnrs par l'instruction i. Il associe la variable ventuellement dnie par l'instruction i son ensemble de dpendances explicites, c'est--dire les variables utilises par l'instruction i. L'oprateur est dni pour deux ensembles d'associations et rend un ensemble d'associations. Cet oprateur n'est pas commutatif car il rsout les dpendances des variables utilises dans une instruction en fonction des ux gnrs par les instructions qui la prcdent. Il est dni formellement en 9. Soient R et S deux ensembles d'associations tels que : R = vV {v R[v]} et S = vW {v S[v]}. R[v] ou S[v] est l'ensemble de dpendances de la variable v . L'oprateur est alors dni comme suit :
R S = vV {v R[v]} vW {v S[v]} = vV {v fS (R[v])} vW {v S[v]}
L'exemple de la gure 4.3 illustre l'analyse de ux de donnes selon la formalisation que nous avons proposes prcdemment. Considrons l'instruction numro 3 de cet exemple. Cette instruction dnit la variable $stack0#2 en utilisant les variables $stack0 et $stack1. L'ensemble d'associations outSet(3) va donc prendre en compte ces ux d'information explicites, tout en resolvant les 30
$stack1 = l1
inSet(3)= outSet(3) = {$stack0 {l0}, $stack1 {l1}} genSet(3) = {$stack0#2 {$stack0, $stack1} }
$stack1#2 = l2
inSet(5)= outSet(4) = {$stack0 {l0}, $stack1 {l1}, $stack0#2 {l0,l1}, $stack1#2 {l2}} 5 $stack0#3 = $stack0#2 + $stack1#2 {$stack0 {l0}, $stack1 {l1}, $stack0#2 {l0,l1}, $stack1#2 {l2}, $stack0#3 {l0, l1, l2}} genSet(5) = {$stack0#3 {$stack0#2, $stack1#2} }
Nous pouvons aussi remarquer grce l'exemple de la gure 4.3, que les ensemble d'associations inSet et outSet vont trs vite exploser en taille. En eet, du fait de l'utilisation des webs pour typer le code Jimple, un trs grand nombre de variables est gnr, alors que ces variables peuvent correspondre en ralit une seule et mme position sur la pile. L'oprande de pile $stack0 par exemple, empil la position 0 suite l'excution de l'instruction numro 1, est dpil aprs l'excution de l'instruction numro 3. Il est alors remplac par $stack0#2, sa somme avec $stack1. Donc cette variable $stack0 ne sera vraisemblablement plus utilise aprs l'excution de l'instruction numro 3. Pourtant, nous propageons pour l'instant ses dpendances, jusqu' la n du bloc analys. Nous adressons ce problme grce l'analyse de vivacit des variables. En eet, si une variable n'est plus vive dans une instruction i, c'est--dire qu'elle n'est plus utilise dans la suite de la mthode et si cette variable est prsente dans l'ensemble inSet(i), alors nous la supprimons de l'en31
semble d'associations outSet car nous n'avons plus besoin de garder l'ensemble de ses dpendances. Ce raisonnement n'est valable que pour les variables locales et les oprandes de piles de type primitif car ils ont une porte limite la mthode. S'ils ne sont pas utilises partir d'une certaine instruction, on peut oublier leurs dpendances puisque nous n'en aurons plus besoin par la suite. Nous introduisons pour cela un ensemble de variables killSet(i) pour chaque instruction i, ainsi qu'un oprateur dni en 10. L'ensemble de variables killSet(i) permet de supprimer les dpendances des variables qui sont prsentes dans l'ensemble d'associations inSet(i) et qui ne sont pas vives dans l'instruction i. L'oprateur est donc dni pour un ensemble d'associations et un ensembles de variables.
Soit R un ensemble d'associations, tel que R = vV {v R[v]}. L'oprateur est alors dni comme suit : R W = vV \W {v R[v]} o V \ W est la dirence ensembliste de V et W .
Les quations de la nouvelle analyse propose sont explicites en 4.2. Ces quations introduisent l'oprateur i paramtr par l'instruction i et dni en 11. Le fonctionnement de cet oprateur est le mme que celui prsent en 9, sauf qu'il rsout les dpendances de associations de genSet(i) avant la suppression des variables qui ne sont plus vives. Il rsout donc ces dpendances par rapport l'ensemble inSet(i).
inSet(i) = outSet(pred(i)) outSet(i) = genSet(i)
i
(inSet(i) killSet(i))
{v Dv } si i dnit une variable v . Dv est l'ensemble genSet(i) = des variables utilises pour dnir v {} sinon killSet(i) = l'ensemble des variables prsentes dans inSet(i) et qui ne sont plus vives dans i
(4.2)
Dnition 11 (L'oprateur
i ). Soient V , W et Z trois ensembles de variables. Soient R et S deux ensembles d'associations tels que : R = vV {v R[v]} et S = vW {v S[v]}. Soit l'ensemble d'association inSet(i) = vZ {v inSet(i)[v]} associ l'instruction i. L'oprateur i est alors dni comme suit :
R
i
S = vV {v R[v]}
i
vW {v S[v]}
o fS est dni comme suit : finSet(i) (R[v]) = (xR[v]Z inSet(i)[v]) (xR[v]\Z {x}) Le rsultat de cette nouvelle analyse sur l'exemple 4.3 est illustr par la gure 4.4. Les variables supprimes grce l'ensemble killSet sont barr d'un trait dans cet exemple. Ce raisonnement concernant la vivacit des variables n'est par contre pas valable pour les objets qui peuvent avoir 32
une porte globale. En eet, comme nous allons le voir dans la section 4.2.3, l'analyse propose prcdemment est modie pour prendre en compte la particularit des objets ou des rfrences en gnral. Notons que l'analyse de vivacit est ralise sur l'ensemble de la mthode et pas seulement sur le bloc de base, contrairement l'analyse statique des ux explicites.
inSet(1)={} 1 $stack0 = l0 liveVars(1) = {$stack0}
$stack1 = l1
inSet(4)=outSet(3) = {$stack0 {l0}, $stack1 {l1}, $stack0#2 {l0,l1}} 4 $stack1#2 = l2 liveVars(4) = {$stack0#2, $stack1#2}
33
Instructions Jimple
g e t s t a t i c TEST. n : int $ s t a c k 0 = <TEST: int n> istore 1 l1 = $stack0 iconst 0 $ s t a c k 0#2 = 0 p u t s t a t i c TEST. n : int <TEST: int n> = $ s t a c k 0#2
outSet(1) = $stack0 {T EST.n} outSet(2) = $stack0 {T EST.n}, {l1 {T EST.n}} outSet(3) = {l1 {T EST.n}}, $stack0#2 {} outSet(4) = {l1 {T EST.n}}, T EST.n {}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
byte $stack1 , $ s t a c k 1#2 int l3 , l4 , $stack2 , $ s t a c k 2#2 int [ ] l1 , l2 , $stack0 , $ s t a c k 0 #2, $ s t a c k 0#3
$stack0 = 11; l2 = $stack0 ; $ s t a c k 0#2 = l 1 ; $stack1 = 1; $stack2 = l3 ; $ s t a c k 0 #2[ $ s t a c k 1 ] = $ s t a c k 2 ; $ s t a c k 0#3 = l 2 ; $ s t a c k 1#2 = 1 ; $ s t a c k 2#2 = l 4 ; $ s t a c k 0 #3[ $ s t a c k 1 #2] = $ s t a c k 2 #2;
35
inSet(1)={} 1 $stack0 = l1 { $stack0 {l1} } liveVars(2) = {l4, l2, l3, l1, $stack0}
l2 = $stack0
$stack1 = 1
{ l2 {l1}, $stack0#2 {l1}, $stack1 {}} 5 $stack2 = l3 liveVars(5) = {l4, l2, $stack0#2, $stack1, $stack2} killSet(5) = {$stack0#2, $stack1#2}
{ l2 {l1}, $stack0#2 {l1}, $stack1 {}, $stack2 {l3}} 6 $stack0#2[$stack1] = $stack2 liveVars(6) = {l4, l2} save_labels($stack0#2[$stack1] {l3})
{ l2 {l1}, $stack0#2 {l1}, $stack1 {}, $stack2 {l3}} 7 $stack0#3 = l2 {l2 {l1}, $stack0#3 {l1}} 8 $stack1#2 = 1
$stack2#2 = l4
{$stack0#3 {l1}, $stack1#2 {}, $stack2#2 {l4}} 10 $stack0#3[$stack1#2] = $stack2#2 outSet(10) = {} liveVars(10) = {} save_labels($stack0#3[$stack1#2] {l4})
Figure 4.8 Rsultat de l'analyse statique de l'exemple gure 4.5, prenant en compte l'analyse de
vivacit 36
rfrence de l'instance est alors stock dans la variable locale la position 0. Le premier argument est stock la position 1, le deuxime argument la position 2 et ainsi de suite. L'appel d'une mthode statique se fait de la mme manire, sauf que la mthode appelante n'empile pas de rfrence d'instance d'objet. Le premier argument de la mthode appele se trouve alors dans la variable locale la position 0 de la nouvelle frame, le deuxime la position 1 et ainsi de suite. L'analyse statique que nous proposons insre un point de contrle save_labels() chaque appel de mthode, pour forcer la JVM mettre jour tous les labels de scurit des variables manipules par la mthode appelante. En eet, si nous dcidons de retarder cette mise jour de label jusqu'au premier point de contrle rencontr dans l'une des mthodes appeles, il faudrait . La JVM calcule alors les labels de scurit des paramtres de la mthode appele et les associe aux positions correspondantes sur la nouvelle pile. Ces labels sont utiliss par la suite pour dduire les labels de scurit des variables manipules par la mthode appele. Lors du retour de la mthode appele, la valeur de retour ventuelle est empile sur sa pile. Suite l'excution de l'instruction de retour, la JVM empile cette valeur de retour sur la pile de la mthode appelante avant de librer compltement la pile de la mthode appele. Or, comme l'instruction de retour est un point de sortie d'un bloc de base, c'est donc un point de contrle save_labels(). La JVM calcule alors pralablement les labels de scurit des variables manipules par la mthode appele, et associe donc un label de scurit la valeur de retour aussi. Ce label de scurit est donc associ la valeur de retour empil sur la pile de la mthode appelante.
If $stack1 < 0
Pimp = []
If $stack1 < 0
l2 = 0
l3 = 0 pop(1)
l3 = $stack0 pop(2)
Figure 4.10 Analyse statique des variables gnrant des ux implicites
Il est plus judicieux d'instrumenter ainsi la JVM modie pour construire, dynamiquement, la pile contenant les labels de scurit des variables gnrant des ux implicites. En eet, comme le label de scurit associ une condition de branchement peut changer au cours de l'excution d'une des branches (si les variables intervenant dans cette condition sont rednies), il faut valuer ce label de scurit au moment de l'excution de l'instruction conditionnelle, ce qui revient construire la pile dynamiquement. Grce la pile des ux implicites, la JVM modie peut tenir compte des ux implicites directs. En eet, chaque fois qu'elle prend en compte les ux explicites concernant une variable v et ses 38
dpendances explicites Dv , elle propage les labels de scurit des variables de Dv vers v . Il sut alors de propager aussi les labels de la pile des ux implicites vers v .
car le premier oprande du code Jimple est utilis pour l'instruction if , le deuxime oprande est utilis pour la condition du branchement et le troisime oprande est utilis pour l'instruction cible du branchement si la condition est vraie. Donc suite l'excution d'une instruction if , le ot de contrle peut soit passer l'instruction suivante si la condition du branchement est fausse ou passer l'instruction cible du branchement si la condition du branchement est vraie. Donc si nous ignorons le changement de ot de contrle d aux exceptions, toute instruction ayant deux successeurs est une instruction if .
a au plus deux successeurs. De plus, une instruction ayant deux successeurs est une instruction if .
L'analyse que nous proposons pour le suivi des ux implicites indirects prend en compte tous les attributs de classes qui pourraient tre modis lors de l'excution, puisqu'ils ont une porte globale. Par contre, elle prend en compte seulement les variables locales et les oprandes de pile qui sont vifs au point de jonction de chaque branche, c'est--dire au post-dominateur immdiat. En eet, les variables locales et oprandes de piles ayant une porte locale la mthode, il n'y a pas besoin de mettre jour leur label de scurit ds qu'elles ne sont plus utilises au sein de la mthode. Cette analyse associe chaque instruction i deux piles d'ensembles inSet(i) et outSet(i) contenant les variables modies au sein des deux branches d'une instruction conditionnelle. Les quations de cette analyse sont explicites gure 4.3.
inSet(succ(i)) si i a un seul successeur outSet(i) = inSet(s2 ) i inSet(s1 ) si i est une instruction if dont les deux successeurs sont s1 et s2 popM ergeLast(outSet(i)) si i est une instruction if pushN ewSet(outSet(i), n)si i est un prdcesseur d'un post-dominateur immdiat, marqu d'une action pop(n) addT oLastSet(outSet(i), v) si v est une variable dnie par l'instruction i inSet(i) = addT oLastSet(pushN ewSet(outSet(i), n), v) si v est dnie par l'instruction i et i est un prdcesseur d'un post-dominateur immdiat marqu d'une action pop(n) outSet(i) sinon
Proposition 1. Si l'on ignore les exceptions lors de la construction du CFG, alors toute instruction
(4.3) Ces quations font intervenir un oprateur paramtr par l'instruction i et dni pour deux piles d'ensembles ayant le mme nombre d'lments, ainsi que dirents autres oprateurs dnis pour une pile d'ensemble. Une dnition formelle de chacun de ces oprateurs est prsent en 12, 13 et 14. L'ensemble outSet du point de sortie de la mthode est initialis avec une pile contenant un seul ensemble vide. Cette analyse a t ralise de sorte que le nombre d'lments des piles outSet(i) et inSet(i) rete la profondeur de branchements conditionnels l'instruction i. L'oprateur popM ergeLast dpile le dernier ensemble et rajoute toutes les variables qu'il contient l'avant dernier ensemble, sauf les variables locales et oprandes de piles non vifs au post-dominateur immdiat. L'oprateur 40
augmente. Le nombre d'ensembles empiler est dtermin grce aux rsultats de l'analyse prcdentes des ux implicites directs, puisque comme l'illustre la gure 4.10, une instruction peut tre le post-dominateur immdiat de plusieurs branchements. L'oprateur addT oLastSet, par contre, ajoute la variable dnie par une instruction au dernier ensemble de la liste inSet.
pushN ewSet empile un ensemble vide chaque fois que la profondeur de branchements conditionnels
Dnition 12 (Les oprateur popM ergeLast et pushN ewSet). Soient L une pile d'ensembles n
lments. Alors la pile M n 1 lments telle que M = popM ergeLast(L) est dnie comme suit : L[k] si 1 k < n 1 M [k] = L[n 1] L[n] si k = n 1 o est l'oprateur d'union dni pour les ensembles. La pile N n + m lments telle que N = pushN ewSet(L, m) et m 1 est dnie comme suit : L[k] si 1 k n N [k] = {} si n + 1 k n + m
dumas-00636135, version 1 - 26 Oct 2011
Dnition 13 (L'oprateur
une variable. Alors la liste O = addT oLastSet(L, v) est dnie comme suit : L[k] si 1 k < n O[k] = L[n] {v} si k = n
Dnition 14 (L'oprateur
paramtr par l'instruction conditionnelle i). Soient L1 et L2 deux piles d'ensembles n lments. Soit Vi l'ensemble des variables locales et piles d'oprandes vives au post-dominateur immdiat de l'instruction i. Nous notons Loc(L1 [k]) la projection des variables de l'ensemble L1 [k] sur les variables locales et oprandes de piles. Notons aussi Class(L1 [k]) la projection des variables de l'ensemble L1 [k] sur les variables de classes (attributs statiques). La pile d'ensembles L n lments telle que L = L1 i L2 est dnie comme suit : L1 [k] si 1 k n 1
L[k] = Class(L1 [k]) Class(L2 [k]) ( Loc(L1 [k]) Loc(L2 [k]) Vi
si k = n
L'oprateur i paramtr par l'instruction conditionnelle i ralise l'union des variables appartenant aux deux derniers lments des piles inSet(s1 ) et inSet(s2 ), o s1 et s2 sont les deux successeurs de i, tout en supprimant les variables locales et oprandes de piles qui ne sont plus vifs au post-dominateur immdiat de l'instruction i. Cet oprateur est dnie pour deux piles ayant le mme nombre d'lments car les ensembles inSet des deux successeurs de l'instruction i ont le mme nombre d'lments. De plus, comme l'arme la proposition 2, tous les lments de ces deux ensembles inSet sont gaux sauf leur dernier lment. Bien que nous ne dmontrons pas cette proposition, il est intuitif de se rendre compte grce notamment l'exemple de la gure 4.11, que le dernier lment de l'ensemble inSet d'un successeur s de i contient des variables modies dans les chemins d'excution reliant s au post-dominateur immdiat de i, alors que les autres lments de inSet contiennent les variables modies dans les chemin d'excution reliant le post-dominateur immdiat de i au point de sortie de la mthode analyse. 41
Proposition 2 (Les ensembles inSet(s) des successeurs s d'une instruction conditionnelle i). Soit
i une instruction conditionnelle et s1 , s2 ses deux successeurs. Alors card(inSet(s1 )) = card(inSet(s2 )) et k, tel que 1 k card(inSet(s1 )) 1, alors inSet(s1 )[k] = inSet(s2 )[k]
Un exemple de cette analyse est illustr par la gure 4.11. Le dernier ensemble de la pile outSet(i) de chaque instruction conditionnelle i correspond aux variables potentiellement modies au sein des deux branches dnis par i et qui sont vives au post-dominateur immdiat de i. En eet, si nous considrons l'instruction 1 de cet exemple, le dernier lment de outSet(1) est {l2, l3}. Or ces deux variables sont justement les seules variables qui sont vives au post-dominateur immdiat de l'instruction 1, c'est--dire l'instruction 9. An de permettre la prise en compte des ux implicites indirects lors de l'analyse dynamique, nous annotons le post-dominateur immdiat de chaque instruction conditionnelle i avec le dernier lment de la pile outSet(i). L'analyse dynamique value alors les nouveaux labels de scurit des variables modies au sein des branches excutes et non excutes en utilisant la pile des ux implicites. L'analyse que nous avons propos ne prend en compte que les ux implicites indirects concernant les variables locales et les oprandes de piles, ainsi que variables de classe. Elle ne peut pas prendre en compte les ux implicites indirects concernant les attributs d'objets car nous ne connaissons pas les rfrences des objets concerns par ce ux implicites indirects lors de l'excution. Ceci ncessiterait de raliser une analyse statique d'alias et suppose donc une analyse inter-procdural comme le propose Chandra et Franz [CF07]. Nair et al. [NSCT07] par contre, adopte une approche qui consiste ne pas dpiler la pile des ux implicites au post-dominateur immdiat d'une instruction conditionnelle si un attribut d'objet, dont la rfrence ne peut pas tre dtermin l'excution, est modi au sein d'une branche non excute. Ceci pourrait permettre de tenir compte des ux implicites indirects si cet attribut d'objet est utilis par la suite. Cette approche, que nous pensons trop conservatrice, ncessite alors le dpilement de la pile des ux implicites manuellement pour viter le problme de la contamination des labels de scurit. ne permet de prendre en compte que les ux implicites indirects concernant les objets dont la rfrence est connue, avant l'excution de l'instruction conditionnelle. Considrons l'exemple o une rfrence d'un objet ne peut tre connue qu'au moment de l'excution grce un appel de mthode. Si cet appel de mthode se trouve dans une branche non excute, l'analyse dynamique ne peut dterminer la rfrence de cet objet an de tenir compte des ux implicites indirects le concernant. Les analyses proposes pour le suivi des ux d'information implicites, directs ou indirects, ne prennent pas en compte les ux gnrs par les exceptions. Nous discutons ce dernier point dans la sous-section suivante.
inSet(1)= [{$stack0#3,l3,l2}] outSet(1)= [{$stack0#3},{l3,l2}] inSet(2)= [{$stack0#3},{l3,l2,l4}] inSet(3)= [{$stack0#3},{l3,l2}] inSet(5)= [{$stack0#3},{l2,l3,$stack1#2}] outSet(6)=[{$stack0#3},{l2,l3}] outSet(6)=[{$stack0#3},{},{l2,l3}] inSet(8)=[{$stack0#3},{},{l2}] l2 = $stack0 pop(2) inSet(4)=[{$stack0#3},{l3}] outSet(4)=[{$stack0#3},{}] inSet(7)=[{$stack0#3},{},{l3}] outSet(7)=outSet(8)= [{$stack0#3}, {},{}]
l4 = erreur
$stack1#2 = l1
l2 = 0
4 pop(1)
l3 = $stack0
7 pop(2)
8 l3 = $stack0
inSet(9)=[{$stack0#3,$stack0#2}] outSet(9)=[{$stack0#3}]
10
11
$stack0#3 = l2
pop(1)
13
return $stack0#3
Live(13) = {$stack0#3}
inSet(13)=outSet(13) = [{}]
43
4.4 Rsum
Nous avons prsent dans cette section l'analyse statique dveloppe pour le suivi des ux d'information. Cette analyse intra-mthode est ralise sur une reprsentation intermdiaire du Bytecode : Jimple. Elle est constitue de plusieurs tapes dont la premire est la construction du CFG de la mthode, ralise grce Soot. Ensuite, une analyse de vivacit des variables, implmente aussi par Soot, est eectue. Les rsultats de cette analyse sont utiliss tout au long des tapes suivantes. S'ensuit alors une analyse de ot de donnes pour chaque bloc de base de la mthode analyse. Cette analyse que nous avons implment, permet la prise en compte des ux explicites par l'analyse dynamique, grce notamment des points de contrles forant la JVM modie mettre jour les labels de scurit associs tout ou une partie des variables. Un parcours du CFG, que nous avons implment, est ensuite ralis pour insrer des points de contrles pour chaque instruction conditionnelle ainsi que les prdcesseurs de leur post-dominateur immdiat. Ces points de contrles permettent lors de l'analyse dynamique de construire une pile de labels de scurit, associs aux variables gnrant des ux implicites. Finalement, une dernire analyse de ot de donne est ralise, pour permettre l'analyse dynamique la prise en compte des ux implicites indirects. Cette dernire analyse ainsi que les annotations de mthodes avec les rsultats de notre analyse statique n'ont pas encore t implment. Cependant, nous avons dj pens la manire de transposer les rsultats de notre analyse statique eectue sur du code Jimple au Bytecode Java. En eet, nous disposons grce Soot de l'oset de l'instruction Bytecode correspondant chaque instruction Jimple. Donc nous pouvons associer chaque ensemble outSet son instruction Bytecode correspondante. De plus, nous avons utilis grce Soot un nommage particulier des variables en Jimple, qui nous permet d'associer avec prcision chaque variable Jimple soit une position prcise sur la pile, soit une variable locale prcise.
44
Chapitre 5
45
Exemple de programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemple de code Jimple simple non typ . . . . . . . . . . . . . . . . . . . . Exemple de programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sparation des variables pour l'exemple 3.3 . . . . . . . . . . . . . . . . . . Les direntes dnitions et utilisations de la variable x . . . . . . . . . . . Exemple de programme et le rsulat de l'analyse de vivacit de ses variables Analyse de vivacit sur l'exemple gure 3.6 . . . . . . . . . . . . . . . . . . Analyse des post-dominateur sur l'exemple de la gure 3.6 . . . . . . . . . .
Approximation de l'analyse statique . . . . . . . . . . . . . . . . . . . . . . . . . . Exemple de dcoupage d'une mthode en blocs de base . . . . . . . . . . . . . . . . . Exemple de l'analyse de ux de donnes . . . . . . . . . . . . . . . . . . . . . . . . . Exemple de l'analyse de ux de donnes . . . . . . . . . . . . . . . . . . . . . . . . . Cas particulier de la manipulation des rfrences . . . . . . . . . . . . . . . . . . . . Rsultat de l'analyse statique de l'exemple gure 4.5 . . . . . . . . . . . . . . . . . . Cas particulier de la manipulation des rfrences . . . . . . . . . . . . . . . . . . . . Rsultat de l'analyse statique de l'exemple gure 4.5, prenant en compte l'analyse de vivacit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9 Flux implicites directs et indirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10 Analyse statique des variables gnrant des ux implicites . . . . . . . . . . . . . . . 4.11 Exemple d'analyse statique des ux implicites indirects . . . . . . . . . . . . . . . . .
46
Bibliographie
Frances E. Allen. Control ow analysis. SIGPLAN Not., 5(7) :119, 1970. James P. Anderson. Computer Security Threat Monitoring and Surveillance. Technical report, James P. Anderson Company, Fort Washington, Pennsylvania, April 1980. [Bib77] K. Biba. Integrity considerations for secure computer systems. Technical Report NESD-TR 76-372, MITRE Co., April 1977. [CF07] Deepak Chandra and Michael Franz. Fine-grained information ow analysis and enforcement in a java virtual machine. In ACSAC, pages 463475, 2007. [Den76] Dorothy E. Denning. A lattice model of secure information ow. Commun. ACM, 19(5) :236243, 1976. [FHS97] S. Forrest, S.A. Hofmeyr, and A. Somayaji. Computer immunology. Communications of the ACM, 40(10) :8896, October 1997. [GM82] J. Goguen and J. Meseguer. Security policies and security models. In IEEE Symposium on Research in Security and Privacy, 1982. [HMMT07] G. Hiet, L. M, B. Morin, and V. Viet Triem Tong. Monitoring both os and program level information ows to detect intrusions against network servers. In IEEE Workshop on "Monitoring, Attack Detection and Mitigation", 2007. + 07] Guillaume Hiet, Ludovic M, Jacob Zimmermann, Christophe Bidan, Benjamin Morin, [HMZ and Valrie Viet Triem Tong. Dtection able et pertinente de ux d'informations illgaux. In Proc of the 2nd Conference on Security in Network Architectures and Information Systems (SARSSI), 2007. [HRU76] Michael A. Harrison, Walter L. Ruzzo, and Jerey D. Ullman. Protection in operating systems. Communication of the ACM, 19(8) :461471, 1976. [HS06] S. Hunt and D. Sands. On ow-sensitive security types. In Conference record of the 33rd ACM SIGPLAN-SIGACT symposium on Principles of programming languages, pages 7990. ACM, 2006. [KR02] Calvin Ko and Timotyy Redmond. Noninterference and intrusion detection. In Proceedings of the IEEE Symposium on Security and Privacy, 2002. [LB73] Leonard J. LaPadula and D. Elliott Bell. Secure computer systems : A mathematical model. MTR-2547 (ESD-TR-73-278-II) Vol. 2, MITRE Corp., Bedford, may 1973. [Muc97] S.S. Muchnick. Advanced compiler design and implementation. Morgan Kaufmann, 1997. [All70] [And80]
47
A.C. Myers. JFlow : Practical mostly-static information ow control. In Proceedings of the 26th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, pages 228241. ACM, 1999. [NSCT07] Srijith K. Nair, Patrick N. D. Simpson, Bruno Crispo, and Andrew S. Tanenbaum. A virtual machine based information ow control system for policy enforcement. In First International Workshop on Run Time Enforcement for Mobile and Distributed Systems (REM 2007), pages 111, Dresden, Germany, 2007. [RS10] Alejandro Russo and Andrei Sabelfeld. Dynamic vs. static ow-sensitive security analysis. Computer Security Foundations Symposium, IEEE, 0 :186199, 2010. [SCS98] R. Sekar, Yong Cai, and Mark Segal. A specication-based approach for building survivable systems. In Proceedings of the 21st National Information Systems Security Conference (NISSC'98), pages 338347, Crystal City, VI, October 1998. [VRH98] R. Vallee-Rai and L.J. Hendren. Jimple : Simplifying java bytecode for analyses and transformations. 1998. [VS97] D. Volpano and G. Smith. A type-based approach to program security. In Theory and Practice of Software Development, 1997. [VSI96] Dennis Volpano, Georey Smith, and Cynthia Irvine. A sound type system for secure ow analysis. Journal in Computer Security, 4(2-3) :167187, 1996. [ZMB03] Jacob Zimmermann, Ludovic M, and Christophe Bidan. An improved reference ow control model for policy-based intrusion detection. In Proceedings of the 8th European Symposium on Research in Computer Security (ESORICS), October 2003. [Mye99]
48