TP Sécurité Java, applets

Richard Grin (grin@unice.fr) Retour TPs

Préliminaire :

Quand vous chargez cette page il devrait s'afficher une fenêtre vous demandant d'accepter un certificat d'un certain "M. le Maudit". Evidemment il ne faut d'ordinaire jamais accepter un tel certificat, sauf si vous connaissez bien le propriétaire de ce certificat et que vous savez pourquoi il vous demande d'accepter son certificat. En effet, si vous l'acceptez, le code signé par propriétaire du certificat (par exemple une applet) pourra faire tout ce qu'il veut en ayant vos droits (par exemple supprimer tous vos fichiers !). Pour ce TP, ayez confiance ; c'est moi qui l'ai signé et il ne vous arrivera rien. Ce certificat vous sera utile pour l'avant-dernier exercice et vous pouvez le refuser tant que vous n'êtes pas arrivé à cet exercice. De toute façon, avant de l'accepter ou de le refuser il faut examiner le certificat avant de prendre une décision. Faites-le. N'acceptez pas le certificat "pour toujours". Si vous l'avez fait, il faut aller dans le ControlPanel (voir ci-dessous) pour le supprimer.

Ce TP porte sur le système de sécurité fourni par Java 2. Comme il utilise des applets, il fonctionnera différemment selon les navigateurs (y compris selon les versions de ces navigateurs) et selon la version de Java utilisée pour exécuter les applets. Il a été testé avec plusieurs environnements dont Mozilla et Firefox. Si vous avez testé d'autres environnements, merci de me dire si ça fonctionne.

Navigateur à utiliser pour ce TP : le plugin Java doit être installé sur votre navigateur. Il faut les droits de l'administrateur système pour installer le plugin. Fin novembre 2006, ce plugin est déjà installé sur la version 2 de firefox nouvellement installée sous /usr/local/bin/firefox. Utilisez donc ce navigateur. Ne lancez pas le navigateur avec la commande "firefox" sans être certain que cette commande lance bien cette version (commande "whence firefox" si votre shell est zsh).

Pour commencer vous allez tester si le plugin Java fonctionne avec votre navigateur et voir quelle version du plugin est installée. Pour cela, connectez vous à l'adresse http://www.java.com/fr/download/help/testvm.xml. Vous devriez voir danser Duke, la petite mascotte Java, en dessous d'informations donnant la version Java du plugin. Normalement vous devez avoir une version 1.5 (correspond à la version 5 de Java).

Avec les dernières versions des navigateurs, la différence essentielle se rencontre avec les applets signées : l'utilisateur peut accepter le certificat, et dans ce cas, l'applet est autorisée à faire ce qu'elle veut sans tenir compte de la politique de sécurité locale. Heureusement, il est possible de modifier ce comportement comme on le verra à la fin du TP.

L'applet ne sera pas toujours exécutée par le plugin. Ca dépend du navigateur et du tag utilisé par la page HTML pour inclure l'applet. En deuxième lecture, vous pourrez consulter les informations données dans cette page.

Affichage de la console Java du plugin Java

Dans ce TP il est indispensable de voir les exceptions qui seront levées par les différentes applets. Pour cela il faut faire afficher la "console Java", fenêtre dans laquelle vous aurez des informations sur le fonctionnement des applets Java exécutées par le plugin Java.

Avec Firefox, il faut commencer par lancer le programme de contrôle du fonctionnement de Java. Ce programme se lance par la commande ControlPanel (ou javacpl) située dans le répertoire bin de la dernière version de Java installée (allez voir sous /usr/local). Quand ce programme est lancé, allez dans l'onglet "Avancé", puis ouvrez "Console Java", puis cochez "Afficher la console".

Avec Mozilla : menu Outils / Développement Web / Console Java.

Sous Windows, si vous avez installé le plugin Java au moment de l'installation de Java vous devez avoir une petite icône Java (une tasse de café) dans la barre d'état du bas. Cliquez avec le bouton droit sur cette icône et choisissez "Ouvrir la console".


Exercice préliminaire : Tester une application

Testez cette application. Lisez et comprenez le code. Après quelques modifications que vous lui apporterez, elle affichera

Cet exercice est là uniquement pour vous montrer comment afficher des propriétés système en Java. Vous verrez dans l'exercice suivant que le même code dans une applet n'a pas l'autorisation de s'exécuter.


Le bac à sable des applets

Voici un exemple d'exécution d'une applet. Elle affiche des informations dans la zone placée juste en dessous de ce paragraphe. Elle affiche quelques propriétés et lit un fichier placé sur le serveur Web (chez moi donc). Allez voir les messages d'erreur dans la console Java du plugin (pour la lecture de certaines propriétés). Quand vous modifierez votre politique de sécurité, par exemple pour donner l'autorisation aux applets de cette page (pas des autres URL) de lire user.home, relisez cet affichage pour voir s'il a changé. On ne vous demande pas de modifier votre politique de sécurité dans cet exercice. Le but est ici de vous montrer qu'une applet ne peut exécuter n'importe quel code ; elle n'a pas le droit, par exemple, de faire lire le nom de l'utilisateur qui exécute le code de l'applet.

La zone d'affichage réservée à l'applet se trouve juste en dessous de cette ligne...

Correction

Outre les réponses aux questions de ce TP, les corrections comportent le code des applets.

TestAppletProprietes.java

Gestionnaire de sécurité avec une applet

  1. A la suite de cet énoncé se trouve une zone réservée à une applet. Cette applet utilise des classes internes et toutes les classes ont été réunies dans un fichier jar. Examinez dans le source de cette page le tag associé à l'applet quand elle est dans un fichier jar.
    L'applet comporte :

Question : où se trouve le fichier dont les lignes sont affichées quand vous cliquez sur le bouton "Lire" (on ne vous demande pas un endroit précis) ? Pourquoi l'applet a-t-elle le droit de le lire ? En fait c'est le même fichier qui a été lu par l'applet de l'exercice précédent.

  1. Testez cette applet. Vous pouvez modifier la zone de texte, par exemple en ajoutant des lignes, avant l'enregistrement. Evidemment vous aurez un message d'erreur au moment de l'enregistrement. Utilisez la console Java pour voir les messages d'erreur.
  2. Modifiez votre politique de sécurité pour permettre l'enregistrement (attention, seulement pour le fichier ~/tmp/lignes et pour aucun autre fichier, et seulement pour les applets qui viennent de la page que vous êtes en train de lire). Pour l'enregistrement, le répertoire tmp doit déjà exister.
    La technique : lancez l'applet et allez voir le message d'erreur dans la console Java du plugin. Copiez/coller le message du début dans votre fichier de politique de sécurité, ajoutez ce qu'il faut pour respecter la syntaxe des permissions. Relancez le navigateur et l'applet et recommencez la manoeuvre précédente jusqu'à ce que l'applet marche. Ainsi vous donnerez le minimum de permissions pour que l'applet marche.
    Attention, si vous changez votre fichier de politique pendant les tests, le plugin Java n'en tiendra compte que si vous lui indiquez de tenir compte de la nouvelle politique. Pour cela, vous pouvez taper la commande "r" dans la console Java (toutes les commandes disponibles sont affichées au début de la console) ; vous pouvez aussi quitter le navigateur pour le relancer. Pensez-y si les modifications du fichier de politique semblent ne pas être prises en compte. Pour n'avoir que les derniers messages d'erreurs, il est aussi conseillé d'effacer régulièrement la console avec la commande "c" (ou le bouton "Effacer" s'il y en a un). Une autre commande pourra vous être utile si la fenêtre qui demande d'accepter le certificat ne s'affiche pas comme il le faut : "x" vide le cache des chargeurs de classes.

Correction :

EcrireLignesLuesApplet.java
Fichier de sécurité

Donner des permissions à une applet signée

Depuis la version 1.4 du plugin, si une applet signée est dans la page Web, un message demande à l'utilisateur s'il fait confiance à l'applet. Si l'utilisateur répond qu'il lui fait confiance, l'applet a toutes les permissions. Essayez avec l'applet ci-dessous.

Si un administrateur n'a pas confiance dans les utilisateurs qui vont utiliser les applets, il doit empêcher que, par mégarde ou méconnaissance des dangers, ils acceptent de faire confiance à une applet signée. En ce cas, les applets n'auront que les permissions qui sont indiquées dans la politique de sécurité installée sur l'ordinateur. Pour cela, il faut ajouter aux permissions données à l'applet la permission "usePolicy". Par exemple, si on a

grant codeBase xxx {

  permission yyyy;

  permission java.lang.RuntimePermission "usePolicy";

}

les applets qui viendront de xxx n'auront que l'autorisation yyy, même si elles sont signées. Le navigateur ne demandera pas à l'utilisateur s'il accepte de donner tous les droits à l'applet signée.

Récupérez ce certificat (ayez confiance... ;-) ) et importez-le dans votre entrepôt de certificats (fichier nommé .keystore par défaut) avec l'alias "toto" (voir le cours sur la sécurité en Java, dans la section sur les outils Java pour la sécurité). C'est vous qui choisissez le nom "toto" ; il s'agit en fait de l'alias que vous donnez au propriétaire du certificat que vous allez enregistrez dans votre entrepôt de certificat. Vous pouvez lui donner un autre nom si vous le voulez.

Changez votre politique de sécurité pour que seules les applets signées par "toto" puissent écrire dans le fichier local ~/tmp/lignes. Testez à nouveau l'applet de l'exercice précédent. Elle ne devrait plus fonctionner car cette applet n'est pas signée par toto. N'oubliez pas de faire relire la nouvelle politique par le plugin pour qu'elle soit prise en compte.

Ci-dessous, une applet qui fait la même chose que l'applet de l'exercice précédent mais qui est dans un jar signé par toto (celui dont vous avez récupéré un certificat). Elle devrait fonctionner. Pour le vérifier, ajoutez des lignes nouvelles dans le texte et allez voir le contenu du fichier. Allez aussi voir les messages dans la console Java du plugin.

Correction :

Démarche à suivre

Gestionnaire de sécurité avec une application

  1. Reprenez l'application du départ. Lancez l'application avec le gestionnaire de sécurité par défaut (celui qui restreint au bac à sable). Voyez les messages d'erreur.
  2. Signez l'application (il faut donc la mettre dans un fichier jar) et changez votre politique de sécurité pour que l'application fonctionne sans erreur pour cette application signée. La démarche pour la signature est expliquée ici (et dans le cours).

Correction :

Démarche à suivre
Fichier de sécurité
EcrireLignesLues.java

Pour ceux qui veulent en savoir plus sur la sécurité en Java...

Tutoriel sur la sécurité de Sun

Retour TPs