L’architecture de s´ecurit´e de Java MISC n˚7, Mai/Juin 2003
5.2 Rˆole dans le m´ecanisme d’ex´ecution s´ecuris´ee
Les ClassLoaders jouent un rˆole fondamental dans la mise en place de l’architecture de
s´ecurit´e. Comme indiqu´e plus haut, chaque classe d’un programme doit appartenir `a un do-
maine (d´ecrit par une instance de ProtectionDomain) dont la mise en place est assur´ee par le
ClassLoader (qui se charge donc de renseigner les informations importantes, `a savoir l’origine
du byte-code et les ´eventuelles signatures).
D’autre part, on utilise g´en´eralement plusieurs ClassLoaders pour ´eviter certaines at-
taques. En effet, pour des raisons d’efficacit´e, les classes sont charg´ees par la JVM de fa¸con
paresseuse, c’est-`a-dire quand on en a besoin. De plus, un ClassLoader ne recharge jamais une
classe qu’il connaˆıt d´ej`a. On imagine alors facilement une attaque de la fa¸con suivante. On
s’arrange pour faire charger par la JVM le programme d’attaque avant le programme attaqu´e.
Dans le programme d’attaque, on inclut des classes qui portent le mˆeme nom que les classes
sensibles du programme attaqu´e, et qui reproduisent les interfaces de celles-ci, mais en ajou-
tant des portes d´erob´ees. Par exemple, on peut rendre une variable sensible publique. Quand
le programme attaqu´e est charg´e, il utilise naturellement les classes d´ej`a charg´ees qui rem-
placent donc les classes qu’il devrait normalement utiliser. Le programme d’attaque peut alors
utiliser ses portes d´erob´ees pour obtenir des informations sensibles, modifier le comportement
du programme attaqu´e, etc.
Diverses techniques sont propos´ees pour rendre impossible ce genre d’attaque. Pour lutter
directement contre l’attaque d´ecrite ci-dessus, les navigateurs web (par exemple) utilisent un
ClassLoader diff´erent par applet. Les m´ecanismes de la JVM interdisent totalement les acc`es
entre des classes charg´ees par des ClassLoaders distincts. Plus pr´ecis´ement, une classe donn´ee
n’a acc`es directement qu’au ClassLoader qui l’a charg´ee. Grˆace `a la structure hi´erarchique
des ClassLoaders elle peut ensuite acc´eder au p`ere de son ClassLoader, puis de remonter dans
la hi´erarchie jusqu’au bootstrap. Cependant, la descente n’est pas possible : aucune m´ethode
de ClassLoader n’existe pour acc´eder aux fils d’un chargeur donn´e. Si un navigateur doit
charger deux applets A et B, il fabrique donc deux ClassLoaders, LA et LB, sans relation
hi´erarchique. Toutes les classes de A sont charg´ees par LA, alors que celles de B sont charg´ees
par LB. Mˆeme si A et B d´efinissent chacun une classe fr.toto.Foo, les deux applets poss`edent
une version chacune de cette classe, sans aucune interaction possible.
Pour pr´eserver les classes syst`emes, les ClassLoaders standards (d´eriv´es de SecureClass-
Loader) utilisent un m´ecanisme de d´el´egation. Quand une classe D demande le chargement
d’une autre classe C, la JVM v´erifie que C n’a pas d´ej`a ´et´e charg´ee. Si ce n’est pas le cas, elle
demande le chargement de C au ClassLoader de D, LD. Celui-ci d´el`egue le chargement `a son
p`ere. Si le p`ere n’arrive pas `a charger C, alors LD tente un chargement direct, par l’appel d’une
m´ethode sp´ecifique (par exemple par t´el´echargement du byte-code). Comme le m´ecanisme de
d´el´egation est r´ecursif, toute classe syst`eme est charg´ee par le ClassLoader bootstrap. Bien
entendu, rien n’empˆeche de fabriquer un ClassLoader qui ne d´el`egue pas. C’est pourquoi la
cr´eation d’un ClassLoader est une op´eration consid´er´ee comme sensible et prot´eg´ee par le m´e-
canisme de s´ecurit´e. Notons d’autre part qu’une application Java classique est charg´ee par un
ClassLoader standard (`a savoir l’URLClassLoader) qui respecte bien entendu le m´ecanisme
de d´el´egation. Conjointement avec le m´ecanisme d´ecrit ci-dessous, il n’est donc pas possible
d’´ecraser les classes syst`emes (au sein de la JVM).
D’autres attaques et protections sont d´ecrites dans [6] et [3].
Copyright MISC & Fabrice Rossi, 2003 5/10