Sécurité Java 2. Première approche. Installation des exemples. Exemple d'une applet



Documents pareils
Le Modèle de Sécurité dans JAVA

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Java Licence professionnelle CISII,

RMI le langage Java XII-1 JMF

Remote Method Invocation (RMI)

Introduction au langage Java

Interfaces graphiques avec l API Swing

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp


Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Installation et prise en main

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

contact@nqicorp.com - Web :

Logiciel Enterprise Guide Version 1.3 Windows

Retrospect 7.7 Addendum au Guide d'utilisation

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

Oracle WebLogic Server (WLS) 11gR1 ( et ) Installation sur Oracle Linux 5 et 6 Hypothèses Installation Oracle Linux 5 (OL5)

Sage CRM. 7.2 Guide de Portail Client

Java 7 Les fondamentaux du langage Java

Onglet sécurité de Windows XP Pro et XP Home

GUIDE DE L UTILISATEUR Recoveo Récupérateur de données

Déployer les Fonts, Icones, et Images avec Forms Services 11G

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Traitement de données

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

HelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM. Manuel d'utilisation

TD/TP 1 Introduction au SDK d Android

v7.1 SP2 Guide des Nouveautés

Fichiers d'archives java - *.jar

Manuel d installation pour L ARENAC

Systeme d'exploitation

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Phone Manager Soutien de l'application OCTOBER 2014 DOCUMENT RELEASE 4.1 SOUTIEN DE L'APPLICATION

Formateurs : Jackie DAÖN Franck DUBOIS Médiapôle de Guyancourt

Le meilleur de l'open source dans votre cyber cafe

Les tableaux de bord de pilotage de nouvelle génération. Copyright PRELYTIS

Guide d'intégration à ConnectWise

contact@nqicorp.com - Web :

AxCrypt pour Windows


CONDITIONS D UTILISATION VERSION NOMADE

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Cours 420-KEG-LG, Gestion de réseaux et support technique. Atelier No2 :

La double authentification dans SharePoint 2007

Dossier. Développer en Java sur téléphone mobile. Benjamin Damécourt UFR SITEC Master 2 EESC 11 janvier 2012

Utilisation d'un réseau avec IACA

Création de formulaires interactifs

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Version Wraptor Laboratories. Installation de SpamWars 4.0 Édition Entreprise

Quick Start Installation de MDweb version 2.3

Guide pas à pas. McAfee Virtual Technician 6.0.0

Installation d'une galerie photos Piwigo sous Microsoft Windows.

Didacticiel de mise à jour Web

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

et Groupe Eyrolles, 2006, ISBN :

Bases Java - Eclipse / Netbeans

Application de lecture de carte SESAM-Vitale Jeebop

Introduction à Eclipse

Informations sur la sécurité

OneDrive, le cloud de Microsoft

SERVEUR DE MESSAGERIE

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Serveur d'archivage 2007 Installation et utilisation de la BD exist

La base de données XML exist. A. Belaïd

Java - la plateforme

Projet de Veille Technologique

Guide de l'utilisateur de l'application mobile

Exemples et tutoriels Version 7.5. Tutoriel de l'exemple Recrutement de personnel pour IBM Process Designer

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Septembre 2012 Document rédigé avec epsilonwriter

TAGREROUT Seyf Allah TMRIM

AFTEC SIO 2. Christophe BOUTHIER Page 1

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

claroline classroom online

LES ACCES ODBC AVEC LE SYSTEME SAS

À propos du Guide de l'utilisateur final de VMware Workspace Portal

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

Sage 50 Version 2014 Guide d installation. Sage Suisse SA

Installation FollowMe Q server

Manuel d utilisation. Copyright 2012 Bitdefender

Seafile, pour simplifier l'accès à ses fichiers, les partager et les synchroniser

Qu'est-ce que c'est Windows NT?

Documentation CAS à destination des éditeurs

Serveur d application WebDev

Support technique logiciel HP

Titre: Version: Dernière modification: Auteur: Statut: Licence:

CONFIGURATION IP. HESTIA FRANCE S.A.S 2, rue du Zécart TEMPLEUVE +33 (0) (0) Site internet:

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

Phone Manager Soutien de l'application OCTOBER 2014 DOCUMENT RELEASE 4.1 SOUTIEN DE L'APPLICATION

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

ultisites S.A. module «services»

1 / Introduction. 2 / Gestion des comptes cpanel. Guide débuter avec WHM. 2.1Créer un package. 2.2Créer un compte cpanel

Courriel Archiver Version 2: Sommaire. Archiver : Sommaire. Comment ça marche Support Technique Préférences. Recherche

Informatique : Création de site Web Master 2 ANI TP 1

Transcription:

Sécurité Java 2 Première approche L 'internet permet une multiplication des moyens de diffusion des applications. Le courrier électronique, le Web, le FTP sont autant de moyens de distribuer des composants exécutables, que ce soit des Applets, des ActiveX ou des applications. Chacun de ces composants exécutables est suceptible d'agir de manière hostile, une fois installé sur la machine hôte. Le système d'exploitation offre la plupart du temps, le moyen de réduire l'accès aux fichiers ou aux ressources de la machine, cependant le composant exécutable a, le plus souvent, les mêmes droits que l'utilisateur qui l'exécute. Ceci permet donc au composant d'accéder à tous les fichiers de l'utilisateurs et d'en faire ce qu'il en veut : effacement, modification, envoi vers une autre machine etc. On le voit les systèmes d'exploitation ne permettent pas un niveau de sécurité suffisant. Idéalement, il devrait être possible de surveiller l'exécution d'un composant exécutable afin de l'empécher d'agir de manière hostile. Cet idéal existe quand le composant est exécuté par une machine virtuelle Java 2. Dans ce cas il est possible de définir finement les permissions accordées au composant, par exemple : les fichiers qu'il a le droit de lire ou de modifier, la possibilité d'accéder au presse-papier, la possibilité d'accéder à l'imprimante. Installation des exemples Pour installer les exemple de cet article, recopiez le dossier security du CD-ROM à la racine de votre disque dur C:. Veillez à ce que le répertoire bin du JDK (au minimun 1.2.2, de préférence 1.3) soit dans le PATH, ceci vous permettra d'accéder à java.exe, appletviewer.exe et policytool.exe. Tous les exemples seront lancés à l'aide de la ligne de commande. AppletExample.java contient le code source de l'applet (voir listing 1), AppletExample.html est la page Web qui accueille l'applet (voir listing 2) Pour exécuter l'applet, lancer la fenêtre de ligne de commande ("fenêtre DOS"), se déplacer dans le dossier C:\security\applet\, et lancer AppletExample1.bat (voir listing 3). Appuyer sur le bouton Write, une exception est alors immédiatement levée et apparaît dans la zone texte (voir figure 1). Cette exception indique que l'applet n'a pas la permission d'écrire le fichier Word.txt dans le dossier C:\security\data\. L'exception est précisemment levée au moment de l'appel du constructeur dans la ligne de code suivante : Appuyer sur le bouton Write, une exception est alors immédiatement levée et apparaît dans la zone texte (voir figure 1) : appletviewer file://c:/security/applet/appletexample.html > listing 3 : AppletExample1.bat Cette exception indique que l'applet n'a pas la permission d'écrire le fichier Word.txt dans le dossier C:\security\data\. java.security.accesscontrolexception: access denied (java.io.filepermission C:\security\data\Word.txt write) L'exception est précisemment levée au moment de l'appel du constructeur dans la ligne de code suivante : Writer w = new FileWriter(folderJTextField.getText() + "Word.txt"); Exemple d'une applet Prenons le cas d'une Applet simple, que nous allons décrire. Elle permet de saisir le chemin d'un dossier et un mot. En appuyant sur un bouton, on crée, dans le dossier saisi, le fichier Word.txt qui contient le mot saisi. Tous les fichiers nécessaires au bon déroulement de l'exemple se trouvent dans le répertoire C:\security\applet : > Figure 1 : Exécution de AppletExample1.bat.

Gestionnaire de sécurité En fait, toute Applet est exécutée sous le contrôle de ce que l'on appelle un gestionnaire de sécurité ou Security Manager. Le gestionnaire de sécurité s'interpose entre l'applet et les ressources du système. Il autorise ou n'autorise pas l'accès aux ressources du système en fonction de ce que l'on appelle une politique de sécurité ou Security Policy (voir figure 2). Une politique de sécurité définit les permissions accordées au code (On entend ici par code, l'ensemble des.class de l'applet). le fichier java.policy situé également dans le dossier lib\security\ du JDK : pour simplifier, il participe à la description des permissions du bac à sable..java.policy situé dans le dossier de l'utilisateur en cours : il est facultatif. En revanche s'il est présent dans le dossier de l'utilisateur, il sera pris en considération pour constituer la politique de sécurité active. Donner des permissions à l'applet Il est possible de rendre le bac à sable moins restrictif en lui ajoutant des permissions supplémentaires. Pour cela, on utilise l'utilitaire policytool (voir figure 3) du JDK pour créer un fichier.policy décrivant les permissions supplémentaires à accorder. À noter, qu'il est également possible de créer un fichier.policy à l'aide d'un éditeur de texte. > Figure 2 : Gestionnaire de sécurité et politique de sécurité. Quand une Applet tente d'accéder à une ressource du système, le gestionnaire de sécurité vérifie que le code a la permission d'accéder à la ressource en consultant la politique de sécurité. Si la permission est accordée, tout se passe normalement, dans le cas contraire, une exception AccessControlException est levée. C'est ce qui de passe dans notre exemple. Politique de sécurité Une politique de sécurité se compose d'un ensemble de fichiers.policy au format texte. Chaque fichier.policy contient un ensemble de permissions qui spécifient ce qu'un code a le droit de faire en fonction de sa provenance (URL du code, signataire du code). Lorsqu'aucune politique de sécurité n'est spécifiée, le gestionnaire de sécurité utilise la politique de sécurité par défaut, plus connue sous le nom de bac à sable ou Sandbox. Le bac à sable est une politique de sécurité très restrictive qui garantit que l'applet ne pourra pas avoir de comportement hostile. Entre autre, le bac à sable empèche l'accès à toutes les ressources de la machine locale. En revanche, le bac à sable autorise l'applet à accéder à la machine depuis laquelle elle a été téléchargée. Dans le cas de notre Applet, c'est bien le bac à sable qui est la politique de sécurité active. De manière générale, la politique de securité active est déduite de 3 fichiers principaux : java.security, java.policy,.java.policy : le fichier java.security situé dans le dossier lib\security\ du JDK : entre autres, il énumère les fichiers.policy pris en compte pour constituer la politique de sécurité active. S'il n'a pas été modifié, il fait référence à java.policy et.java.policy. > Figure 3 : L'utilitaire policytool du JDK. Le fichier AppletExample.policy (voir listing 4) donne à tout code (fichier.class) situé dans le dossier C:\security\applet\, la permission d'écrire le fichier Word.txt dans le dossier C:\security\data\. grant codebase "file:///c:/security/applet/" { permission java.io.filepermission C:\\security\\data\\Word.txt", "write"; ; > listing 4 : AppletExample.policy Pour exécuter l'applet en tenant compte du fichier AppletExample.policy, lancer AppletExample2.bat (voir listing 5). À noter qu'il aurait été également possible de créer un fichier.java.policy identique dans le répertoire d'utilisateur. Ce fichier aurait automatiquement été pris en compte sans préciser quoi que ce soit dans la ligne de commande, c'est à dire en utilisant AppletExample1.bat. appletviewer -J -Djava.security.policy=AppletExample.policy file:///c:/security/applet/appletexample.html > listing 5 : AppletExample2.bat En appuyant sur le bouton Write, tout se passe sans problème, et le fichier Word.txt est effectivement écrit dans le dossier C:\security\data\. Si on saisit un

autre dossier et appuie sur le bouton Write, une exception AccessControlException est levée. Tout fonctionne comme prévu : ce qui est permis est possible, ce qui n'est pas permis, n'est pas possible. > Figure 4 : Execution de AppletExample2.bat. Exemple d'une application Nous allons utiliser une application en tout point similaire à l'applet précédente, à ceci près, qu'il s'agit maintenant d'une application et non plus d'une Applet. Tous les fichiers nécessaires au bon déroulement de l'exemple se trouvent dans le répertoire C:\security\application\. Le fichier ApplicationExample.java contient le code de l'application qui a été compilée. L'application est livrée sous forme d'un fichier JAR baptisé Application Example.jar. Nous allons procéder en 3 étapes et expliquer chaque fois ce qui se produit. Auparavant lancer une fenêtre de ligne de commande et se placer dans le dossier C:\security\application\. Lancer ApplicationExample1.bat (voir listing 6). Appuyer sur le bouton Write, tout de passe sans problème, le fichier est bien créé. Saisir un autre dossier, et appuyer de nouveau sur le bouton Write, tout se passe également sans problème, le fichier est bien créé. java -classpath ApplicationExample.jar ApplicationExample > listing 6 : ApplicationExample1.bat En fait, dans le cas présent, aucun gestionnaire de sécurité n'est activé, l'application a donc le droit de faire tout ce qu'elle veut. Dans cette deuxième étape, nous allons activer un gestionnaire de sécurité. Lancer Application Example2.bat (voir listing 7). Appuyer sur le bouton Write, une exception AccessControlException est levée. java -Djava.security.manager -classpath ApplicationExample.jar ApplicationExample > listing 7 : ApplicationExample2.bat Dans le cas présent, un gestionnaire de sécurité est activé. En l'absence d'indications supplémentaires, c'est la politique de sécurité par défaut qui est activée, c'est à dire le bac à sable. Dans cette troisième et dernière étape, nous allons activer une gestionnaire de sécurité et rendre le bac à sable moins restrictif par ajout d'une permission. Nous utiliserons pour cela le fichier Application Example.policy (voir listing 8). Le fichier ApplicationExample.policy donne à tout code situé dans le fichier JAR C:\security \application\applicationexample.jar, la permission d'écrire le fichier Word.txt dans le dossier C:\security\data\. grant codebase"file:///c:/security/application/applicationexample.jar " { ; permission java.io.filepermission "C:\\security\\data\\Word.txt", "write"; > listing 8 : ApplicationExample.policy Lancer ApplicationExample3.bat (voir listing 9), appuyer sur le bouton Write, tout se passe sans problème, et le fichier Word.txt est effectivement écrit dans le dossier. java -Djava.security.manager -Djava.security.policy=ApplicationExample.policy -classpath ApplicationExample.jar ApplicationExample > listing 9 : ApplicationExample3.bat Applet et application Dans le cas d'une Applet, un gestionnaire d'application est démarré d'office par le Java Plugin ou l'applet Viewer. En revanche dans le cas d'une application, il est necéssaire d'activer un gestionnaire de sécurité de manière volontaire. Dans tous les cas, que ce soit une application ou une Applet, les mêmes mécanismes de sécurité sont utilisés, et la politique de sécurité est déterminée de la même manière. Un mot sur Java Web Start Idéalement, on devrait démarrer toute application Java téléchargée sous le contrôle d'un gestionnaire de sécurité, dans la pratique ce n'est pas forcément très évident, ni très pratique. Il existe pourtant un solution élégante et efficace offerte par le produit Java Web Start disponible récemment. Lorsqu'une application est téléchargée grâce à cette technologie, elle est automatiquement démarrée sous le contrôle d'un gestionnaire de sécurité. Ce dernier est un peu particulier. En effet, chaque fois que l'application requiert une permission, l'utilisateur est consulté pour savoir si oui ou non, il désire accorder cette permission (voir figure 5). Chaque demande est accompagnée d'une petite explication claire qui montre bien les enjeux de la sécurité. Java Web Start présente bien d'autres avantages, dont l'intérêt dépasse le cadre de cet article : mise à jour automatique de l'application, téléchargement automatique de la machine virtuelle adaptée, etc.

Permission : java.awt.awtpermission Cible : accessclipboard, l'accès au presse-papier Un détail de toutes les classes de permission est disponible dans la documentation du JDK : ne pas hésiter à le consulter pour plus d'informations. Vérification d'une permission Pour vérifier qu'une permission est accordée, les classes standard du JDK ont recours au gestionnaire de sécurité. Les classes utilisent pour celà un code qui s'apparente au code suivant, présenté ici à titre d'illustration (voir listing 10) : > Figure 5 : Java Web Start, exemple de demande de permission. Permissions Une permission est en fait une classe Java. Toute permission descend directement ou indirectement de la classe Permision qui se trouve dans le package java.security. La figure 6 montre la hiérarchie des permissions standard dans Java. Il est évidement // import java.lang.securitymanager; import java.security.permission; import java.io.filepermission; SecurityManager sm = System.getSecurityManager(); if (sm!= null) { Permission p = new FilePermission( "C:\\security\\data\\Word.txt", "write"); sm.checkpermission(p); > listing 10 :Code de vérification d'une permission > Figure 6 : Hiérarchie des permissions. possible de créer de nouvelles permissions en héritant d'une permission existante, le plus souvent Permission et plus rarement BasicPermission. L'accord d'une permission dans un fichier.policy se compose de 3 parties : le nom de la classe de permission qualifié par les packages, par exemple java.io.filepermission, la cible, c'est à dire ce qui est visé par la permission, par exemple C:\security\data\Word.txt, les actions qui sont permises sur la cible, par exemple write, read. Dans le cas de permissions descendant de BasicPermission, cette partie ne doit pas être précisée. Pour éclaircir ces notions, prenons un premier exemple complet : Permission : java.net.socketpermission, permission relative à une socket Cible : localhost:1024-, tous les ports de la machine locale supérieurs à 1024 Actions : accept, connect, listen, les actions autorisées sur ces ports Prenons un second exemple. Il s'agit d'une permission qui descend de BasicPermission. Dans ce cas, on ne trouve pas de partie "actions". > Figure 6 : Hiérarchie des permissions. Dans ce code, l'appel de la méthode checkpermission de la classe SecurityManager est le point précis où la permission est vérifié. C'est cette méthode qui lève une exception AccessControlException si la permission n'est pas accordée. L'exception AccessControlException descend indirectement de RuntimeException, c'est donc une exception non vérifiée (voir figure 7). La méthode getpermission de l'exception Access ControlException est particulièrement intéressante, elle permet de connaître la permission non accordée qui est à l'origine de l'exception. Contexte d'appel Mais comment une permission est-elle effectivement vérifiée? Que se passe-t-il dans la méthode checkpermission? En fait, la vérification se fait à partir de ce que l'on appelle le contexte d'appel. Il est établi, à partir de la pile d'appel (voir figure 8) de la manière qui suit. Pour

chaque appel de méthode présent dans la pile d'appel, on ne conserve que la classe. La liste de classes prises à partir du sommet de la pile jusqu'à sa base constitue alors le contexte d'appel. Pour chaque classe de cette liste, il est alors vérifié si la classe a effectivement la permission. Notons que les classes de la bibliothèque standard de Java ont toutes les permissions, ceci étant également valable pour les extensions. Dans la pratique seul le code personnel est succeptible de ne pas avoir la permission. Conclusion La sécurité Java 2 permet de contrôler finement l'exécution d'un Applet ou d'une application et ainsi d'empécher toute action hostile. Ceci n'est possible que parce que Java 2 repose sur une machine virtuelle. La sécurité Java 2 est un sujet vaste et parfois ardu, nous n'avons ici fait qu'effleurer le sujet. Par exemple, Nous n'avons pas ici couvert certaines notions telles que la signature de code. En effet, la sécurité Java 2 fournit des outils pour signer du code (plus exactement les JAR). Le système de permissions permet alors d'accorder des permissions spécifiques à du code signé par tel ou tel signataire. Pour finir, la sécurité Java 2 est particulièrement extensible. Il est possible de créer son propre gestionnaire de sécurité et ses propres permissions. L'auteur : Nicolas DASRIAUX Vous retrouverez l'ensemble des publications de Neoxia sur www.neoxia.com Vous pouvez être informé par mail de la parution des nouveaux articles Neoxia en vous inscrivant sur www.neoxia.com/fr/subscribe.php3 Il existe une liste de diffusion consacrée à l'architecture J2EE. Pour vous y abonner, référez vous à l'url suivante http://www.neoxia.com/fr/mailing-lists.php3 Tous droits réservés Copyright 2000-2001 Neoxia S.A. Le présent article a été publié dans le numéro #29 de la revue "Programmez!" (groupe Sepcom) Source de exemples > listing 1 : AppletExample.java import java.io.*; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class AppletExample extends JApplet { JToolBar jtoolbar = new JToolBar(); JButton writejbutton = new JButton(); JTextField folderjtextfield = new JTextField(); JTextField wordjtextfield = new JTextField(); JScrollPane logjscrollpane = new JScrollPane(); JTextArea logjtextarea = new JTextArea(); public AppletExample() { public void init() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName ()); jbinit(); catch(exception e) { e.printstacktrace(); private void jbinit() throws Exception { this.setsize(new Dimension(600, 300)); writejbutton.settext("write"); writejbutton.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(actionevent e) { writejbutton_actionperformed(e); ); folderjtextfield.settext("c:\\security\\data\\"); wordjtextfield.settext("hello"); this.getcontentpane().add(jtoolbar, BorderLayout.NORTH); jtoolbar.add(writejbutton, null); jtoolbar.add(folderjtextfield, null); jtoolbar.add(wordjtextfield, null); this.getcontentpane().add(logjscrollpane, orderlayout.center); logjscrollpane.getviewport().add(logjtextarea, null); void writejbutton_actionperformed(actionevent e) { try { logjtextarea.settext(""); Writer w = new FileWriter(folderJTextField.getText() + "Word.txt"); w.write(wordjtextfield.gettext()); w.close();

logjtextarea.append( "Word '" + wordjtextfield.gettext() + "' was successfully written in file '" + folderjtextfield.gettext() + "Word.txt'." ); catch (Exception ex) { Writer w = new StringWriter(); PrintWriter pw = new PrintWriter(w); ex.printstacktrace(pw); logjtextarea.append(w.tostring()); pw.close(); Neoxia techconsulting 41, rue Boissy d'anglas F-75008 Paris > listing 2 : AppletExample.html <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; harset=windows-1252"> <title> Applet Example </title> </head> <body> <h1> Applet Example </h1> <applet codebase = "file:///c:/security/applet/" code = "AppletExample.class" name = "TestApplet" width = "600" height = "300" hspace = "0" vspace = "0" align = "middle"> </applet> </body> T +33 (0) 158.18.38.96 F +33 (0) 158.18.38.99 info@neoxia.com www.neoxia.com </html>