Rrabids
: un syst`
eme de d´
etection d’intrusions
comportemental destin´
e aux applications Web
´
ecrites en Ruby on Rails.
Romaric Ludinard
, Lo¨ıc Le Hennaf, ´
Eric Totel
Sup´
elec
2/40
1
G´
en´
eralit´
es
2
Contexte
3
Construction du mod`
ele
Projet Dali
Design and Assessment of application Level Intrusion detection systems
Conception et ´
evaluation d’IDS au niveau applicatif.
Partenaires :
Kereval
: PME rennaise sp´
ecialis´
ee dans le test applicatif.
T´
el´
ecom-Bretagne
.
4/40
Par signature :
Mod´
elise le comportement
interdit de l’entit´
e
Utilise une base de
connaissance des attaques
connues
Ne permet pas de
d´
ecouvrir de nouvelles
attaques
Comportementale :
Mod´
elise le comportement
normal de l’entit´
e
Repose sur la capacit´
e `
a cr´
eer
un mod`
ele de r´
ef´
erence complet
et pr´
ecis
Permet de d´
etecter de nouvelles
attaques sans intervention sur
l’IDS ni mise `
a jour
IDS applicatif
Type d’erreurs d´
etectables
Erreur dans le flot d’ex´
ecution :
Les instructions, appels de fonction, retour de fonction ne
s’ex´
ecutent pas dans l’ordre correct.
T´
emoigne d’attaques tr`
es connues et tr`
es r´
epandues telles que
les d´
epassement de buffer (
buffer overflow
), d´
etournement vers
les librairies (
return to lib C
,
return-oriented programming
).
D´
ej`
a largement ´
etudi´
e.
Erreur dans les donn´
ees :
Certaines variables prennent des valeurs incorrectes vis `
a vis de
la sp´
ecification du logiciel (pas de son impl´
ementation
´
6/40
Dans ces travaux nous nous int´
eressons `
a :
D´
etection comportementale ;
au niveau applicatif ;
par d´
etection d’attaques contre les donn´
ees.
Pour cela :
Construction des invariants du code `
a v´
erifier.
La violation d’un invariant peut ˆ
etre le t´
emoignage de
l’exploitation d’une vuln´
erabilit´
e de l’application par un
attaquant.
Ruby
Langage interpr´
et´
e d´
evelopp´
e depuis 1993 par Yukihiro
Matsumoto.
Langage orient´
e-objet.
Typage dynamique.
Gestion automatique de la m´
emoire (garbage-collector).
Support de la r´
eflexivit´
e.
Mais :
8/40
Ruby on Rails
Framework destin´
e `
a la cr´
eation d’applications Web.
Utilisation du mod`
ele MVC (Mod`
ele-Vue-Contrˆ
oleur).
Prototypage rapide d’applications Web.
Largement utilis´
e, par exemple par Twitter pour l’interface
graphique de leur site Web.
Mod`
ele MVC
Mod`
ele : Le mod`
ele d´
efini les donn´
ees de l’application et les
m´
ethodes d’acc`
es. Tout les traitements sont effectu´
es dans
cette couche.
Vue : La vue prend les informations en provenance du mod`
ele
et les pr´
esente `
a l’utilisateur.
Controlleur : Le contrˆ
oleur r´
epond aux ´
ev´
enements de
l’utilisateur et commande les actions sur le mod`
ele. Cela peut
entrainer une mise `
a jour de la vue.
10/40
Application d´
evelopp´
ee par Kereval.
D´
evelopp´
ee en Ruby en utilisant le framework Ruby On Rails
(RoR) destin´
e aux applications Web.
Il s’agit d’une application de commerce en ligne.
Application trois-tiers :
Serveur Web.
Interpr´
eteur Ruby embarqu´
e.
12/40 class UsersController signup login logout class ProductsController show filter class ReviewsController index new create find_product router http://myHost.com:3000/users/login controller action Model View invokes interacts
instantiate users controller and calls login action
1
2
3 4
Failles dans l’application Insecure
Cette application pr´
esente certaines des failles commun´
ement
rencontr´
ees dans ce type d’applications :
Injection SQL.
Modification des param`
etres des requˆ
etes.
Manipulation de cookie.
Exemple d’attaque
Injection SQL
Saisie des informations
xxxx ’OR’ ’1’=’1’
pour les champs
login
et
password
.
La requˆ
ete ´
emise vers la base de donn´
ees est
select * from
table user where login=xxxx ’OR ’1’=’1’ and password = xxxx
’OR ’1’=’1’
Permet de se connecter en tant qu’administrateur du site de
vente sans en connaˆıtre le mot de passe.
16/40
G´en´eralit´es Contexte Construction du mod`ele R´esultats
Authentification sur l’application
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
params[ :user][ :login] == ”admin”
params[ :user][ :password] == ”secret”
G´en´eralit´es Contexte Construction du mod`ele R´esultats
Authentification sur l’application
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
params[ :user][ :login] == ”admin”
params[ :user][ :password] == ”secret”
session[ :user][ :login] == ”admin”
18/40 c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
params[ :user][ :login] == ”admin”
params[ :user][ :password] == ”secret”
session[ :user][ :login] == ”admin”
G´en´eralit´es Contexte Construction du mod`ele R´esultats
Impact de l’attaque au niveau de l’application
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
params[ :user][ :login] == ”xxxx ’OR’ ’1’=’1’”
params[ :user][ :password] == ”xxxx ’OR’ ’1’=’1’”
20/40
G´en´eralit´es Contexte Construction du mod`ele R´esultats
Impact de l’attaque au niveau de l’application
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
params[ :user][ :login] == ”xxxx ’OR’ ’1’=’1’”
params[ :user][ :password] == ”xxxx ’OR’ ’1’=’1’”
session[ :user][ :login] == ”admin”
Impact de l’attaque au niveau de l’application
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end endparams[ :user][ :login] == ”xxxx ’OR’ ’1’=’1’”
params[ :user][ :password] == ”xxxx ’OR’ ’1’=’1’”
session[ :user][ :login] == ”admin”
22/40 c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end
Construction des invariants
Utilisation d’un outil externe appel´
e Daikon.
D´
evelopp´
e au MIT par l’´
equipe Program Analysis Group
http ://groups.csail.mit.edu/pag/.
Outil issu du monde du test logiciel.
Destin´
e `
a v´
erifier la conformit´
e d’un logiciel vis-`
a-vis de sa
sp´
ecification.
24/40
Permet le calcul d’invariants potentiels.
Algorithme
Generate and check
`
A partir d’une trace contenant par exemple le contenu de
variables `
a certains instants de l’ex´
ecution, des invariants
potentiels sont d´
eriv´
es.
Ils sont invalid´
es au fur et `
a mesure du traitement des traces.
Au final ne sont conserv´
es que les invariants vrais pour toutes
les traces
R´
eduction du nombre d’invariants
Afin de diminuer le nombre d’invariants (potentiels), on ne
s’int´
eresse qu’aux variables qui d´
ependent des entr´
ees
utilisateur.
Ces variables sont les seules dont les valeurs peuvent ˆ
etre
influenc´
ees par l’utilisateur.
Afin de traquer ces variables, on se base sur la notion de
taint
checking
.
Propagation d’une marque appos´
ee sur les entr´
ees via le flot
de donn´
ees.
26/40
´
Etats de l’application
Plugin RoR ind´
ependant de l’application consid´
er´
ee
Pr´
eempte l’ex´
ecution de l’application `
a chaque instruction
Inspecte toutes les variables de l’application
Apprentissage automatique
Code `
a ex´
ecuter
d e f a c t i o n
i n s t r 1
i n s t r 2
i n s t r 3
28/40
Code `
a ex´
ecuter
d e f a c t i o n
i n s t r 1
i n s t r 2
i n s t r 3
end
Ex´
ecution r´
eelle
d e f f u n c g e t T a i n t e d V a r s ( ) S a v e T a i n t e d V a r s ( ) i n s t r 1 g e t T a i n t e d V a r s ( ) S a v e T a i n t e d V a r s ( ) i n s t r 2 g e t T a i n t e d V a r s ( ) S a v e T a i n t e d V a r s ( ) i n s t r 3 g e t T a i n t e d V a r s ( ) S a v e T a i n t e d V a r s ( ) C r e a t e T r a c e F i l e ( ) end
Apprentissage automatique
Parcours automatique de l’application
N´
ecessit´
e de parcourir l’application
Permet de couvrir l’ensemble des cas
normaux
30/40
G´en´eralit´es Contexte Construction du mod`ele R´esultats
Traces g´
en´
er´
ees
v a r i a b l e 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] v a r−k i n d v a r i a b l e dec−t y p e S t r i n g r e p−t y p e j a v a . l a n g . S t r i n g e n c l o s i n g−v a r 17 1 @ p a r a m s [ ” u s e r ” ] c o m p a r a b i l i t y 0 v a r i a b l e 19 2 @ s e s s i o n [ ” u s e r ” ] . @ a t t r i b u t e s [ ” l o g i n ” ] v a r−k i n d v a r i a b l e dec−t y p e S t r i n g r e p−t y p e j a v a . l a n g . S t r i n g e n c l o s i n g−v a r 19 2 @ s e s s i o n [ u s e r ] . @ a t t r i b u t e s c o m p a r a b i l i t y 0 . . . 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ” e v e t t e ” 1 19 2 @ s e s s i o n [ ” u s e r ” ] @ a t t r i b u t e s [ ” l o g i n ” ] ” e v e t t e ” 1
Traces g´
en´
er´
ees
v a r i a b l e 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] v a r−k i n d v a r i a b l e dec−t y p e S t r i n g r e p−t y p e j a v a . l a n g . S t r i n g e n c l o s i n g−v a r 17 1 @ p a r a m s [ ” u s e r ” ] c o m p a r a b i l i t y 0 v a r i a b l e 19 2 @ s e s s i o n [ ” u s e r ” ] . @ a t t r i b u t e s [ ” l o g i n ” ] v a r−k i n d v a r i a b l e dec−t y p e S t r i n g r e p−t y p e j a v a . l a n g . S t r i n g e n c l o s i n g−v a r 19 2 @ s e s s i o n [ u s e r ] . @ a t t r i b u t e s c o m p a r a b i l i t y 0 . . . 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ” e v e t t e ” 1 19 2 @ s e s s i o n [ ” u s e r ” ] @ a t t r i b u t e s [ ” l o g i n ” ] ” e v e t t e ” 132/40
Traces
Invariants
Weaver
Application
code
Instrumented
code
Daikon
'SHI HI
Code du contrˆ
oleur sensible `
a une attaque par injection
SQL
c l a s s U s e r s C o n t r o l l e r< A p p l i c a t i o n C o n t r o l l e r d e f l o g i n i f r e q u e s t . p o s t ? # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end34/40
17 1 @ params[user][name]
d e f l o g i n i f r e q u e s t . p o s t ? i f i s D e f i n e d ? ( ’ @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ) end # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) i f i s D e f i n e d ? ( ’ @ s e s s i o n [ : u s e r ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 19 2 @ s e s s i o n [ : u s e r ” ] [ : l o g i n ] ’ , @ s e s s i o n [ : u s e r ] [ : l o g i n ] ) a s s e r t E q u a l V a r ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , ’ 19 2 @ s e s s i o n [ : u s e r ] [ : l o g i n ] ’ ) end f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end endCode instrument´
e automatiquement
19 2 @ session[user].@attributes[name]
d e f l o g i n i f r e q u e s t . p o s t ? i f i s D e f i n e d ? ( ’ @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ) end # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) i f i s D e f i n e d ? ( ’ @ s e s s i o n [ : u s e r ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 19 2 @ s e s s i o n [ : u s e r ” ] [ : l o g i n ] ’ , @ s e s s i o n [ : u s e r ] [ : l o g i n ] ) a s s e r t E q u a l V a r ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , ’ 19 2 @ s e s s i o n [ : u s e r ] [ : l o g i n ] ’ ) end f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e36/40
V´
erification de l’assertion
d e f l o g i n i f r e q u e s t . p o s t ? i f i s D e f i n e d ? ( ’ @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ) end # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) i f i s D e f i n e d ? ( ’ @ s e s s i o n [ : u s e r ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 19 2 @ s e s s i o n [ : u s e r ” ] [ : l o g i n ] ’ , @ s e s s i o n [ : u s e r ] [ : l o g i n ] ) a s s e r t E q u a l V a r ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , ’ 19 2 @ s e s s i o n [ : u s e r ] [ : l o g i n ] ’ ) end f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e f l a s h . now [ : e r r o r ] = ’ L o g i n f a i l e d ’ end end endCode instrument´
e automatiquement
17 1 @ params[user][name] == 19 2 @ session[user].@attributes[name]
d e f l o g i n i f r e q u e s t . p o s t ? i f i s D e f i n e d ? ( ’ @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ) end # w h o l e u s e r i s s t o r e d i n t h e s e s s i o n i f s e s s i o n [ : u s e r ] = U s e r . a u t h e n t i c a t e ( p a r a m s [ : u s e r ] [ : l o g i n ] , p a r a m s [ : u s e r ] [ : p a s s w o r d ] ) i f i s D e f i n e d ? ( ’ @ s e s s i o n [ : u s e r ] [ ” l o g i n ” ] ’ ) #A u t o G e n e r a t e d I D S A s s e r t s . s t o r e ( ’ 19 2 @ s e s s i o n [ : u s e r ” ] [ : l o g i n ] ’ , @ s e s s i o n [ : u s e r ] [ : l o g i n ] ) a s s e r t E q u a l V a r ( ’ 17 1 @ p a r a m s [ ” u s e r ” ] [ ” l o g i n ” ] ’ , ’ 19 2 @ s e s s i o n [ : u s e r ] [ : l o g i n ] ’ ) end f l a s h [ : n o t i c e ] = ’ You h a v e b e e n s u c c e s s f u l l y l o g g e d i n . ’ i f s e s s i o n [ : u s e r ] . admin r e d i r e c t t o : c o n t r o l l e r => ’ / admin /home ’ , : a c t i o n => ’ i n d e x ’ e l s e r e d i r e c t t o : c o n t r o l l e r => ’ / u s e r /home ’ , : a c t i o n => ’ i n d e x ’ end e l s e38/40
Fichier Nombre de lignes initial Nombre de lignes du code instrument´e application controller.rb 20 20 home controller.rb 11 537 products controller.rb 26 1503 reviews controller.rb 37 1547 users controller.rb 51 1681
Temps moyen d’ex´
ecution :
Avant instrumentation : 16
.
5
ms
.
Apr`
es instrumentation : 125
ms
.
Conclusion
R´
esultats encourageants `
a l’´
evaluation.
Encore des am´
eliorations `
a apporter au niveau de
l’apprentissage (diminution du taux de faux positifs).
Optimisation de l’impl´
ementation ´
eventuelle afin de diminuer
le surcoˆ
ut `
a l’ex´
ecution.
40/40