2
différentes, comme par exemple Windows et UNIX, les programmes écrits en Java et
compilés en fichiers de classe peuvent être exécutés, et ce sans même devoir les
recompiler, sur n’importe quel ordinateur utilisant une de ces plates-formes. C’est le
concept « Write once, run anywhere », élégamment matérialisé par Java.
Comme Java visait essentiellement l’implantation d’un système à code mobile
lors de son apparition officielle en 1995, la garantie de sa sécurité était impérative. Il a
donc été élaboré avec cette idée en tête : personne ne veut voir l’Internet gagner en
versatilité au risque de perdre des informations cruciales ou de les voir s’étendre à travers
celui-ci comme une traînée de poudre.
Java est devenu le standard en matière de contenus exécutables sur Internet et en
fait donc une cible de choix pour les utilisateurs malicieux. Ainsi, sa sécurité demande
d’être vérifiée et même étendue afin de prévoir les problèmes potentiels et ainsi pouvoir
les prévenir. La première étape consiste à comprendre les différents mécanismes en
fonction. Nous allons donc présenter d’une façon concise les principaux aspects de la
sécurité de Java, présents au niveau de la MVJ, c’est-à-dire du code objet.
2.2 Sécurité au niveau de la machine virtuelle Java
Malgré toutes les vérifications effectuées par le compilateur Java et autres
mécanismes présents au niveau du langage, il n’en demeure pas moins qu’il y a toujours
des possibilités d’attaques de la MVJ en utilisant un compilateur comportant des erreurs
ou des malices. Il ne faut pas oublier que la machine virtuelle n’a pas de compilateur
intégré et n’utilise donc pas les fichiers contenant le code source Java afin de les compiler
avant de les exécuter. Elle s’attend plutôt à recevoir directement des fichiers de classe.
Ainsi, à prime abord, elle n’a pas la capacité de savoir si ces fichiers de classe ont été
produits par un compilateur correct ou carrément générés à la main par un utilisateur
malicieux espérant l’exploiter.
Un autre problème qu’entraîne la vérification effectuée seulement au moment de
la compilation est une confusion potentielle au niveau des versions des classes compilées.
En effet, pour dérouter les vérifications faites sur les modificateurs, par exemple, un
programmeur pourrait compiler une première version d’une classe, disons
ClasseContenantAttributsPrives, comportant des attributs déclarés privés et ensuite
modifier l’accès à ces attributs en les déclarant publics de façon à pouvoir compiler avec
succès une autre classe, nommée ClasseUtilisantLesAttributs, par exemple, qui utilise
directement ces derniers. Si la machine virtuelle n’effectuait pas certaines vérifications,
elle permettrait ainsi à la classe ClasseUtilisantLesAttributs de faire directement
référence aux attributs, pourtant déclarés privés, de la classe
ClasseContenantAttributsPrives.
Tous les fichiers de classe chargés par la machine virtuelle Java sont donc
analysés statiquement avant d’être utilisés d’une quelconque façon. C’est le vérificateur
de code objet (de l’anglais « Bytecode Verifier ») qui est responsable de cette tâche.