Laboratoire Bordelais de Recherche en Informatique Réunion PROGSI : Sécurité Java Card TM Équipe : Systèmes et Objets Distribués Un Survol des Méthodes Formelles pour TM Java Card Davy Rouillard [email protected] Damien Sauveron [email protected] http://dept-info.labri.u-bordeaux.fr/~sauveron 21 novembre 2002 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Plan L’architecture Java Card : vue générale des aspects ciblés. Projets “orientés plate-forme” : prouver des propriétés liées au langage et la JCVM (typage, gestion mémoire, BCV). Projets “orientés applications” : prouver qu’un programme particulier satisfait des propriétés données (invariants sur les données, séquencement des transactions). Davy Rouillard Damien Sauveron Page 2 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués L’architecture Java Card Station de travail (hors carte) Carte Niveau Applicatif Java Card Applet A (Paquetage 1) Applet B (Paquetage 1) Firewall Applet C (Paquetage 2) Installateur Fichier(s) exp Fichier exp Fichier(s) class Fichier CAP Niveau Applicatif Java Card APIs spécifiques à l’industrie (OP, ...) APIs Java Card Classes systèmes Communication I/O Niveau JCVM Gestion des Transactions Gestion des Applets et divers Interpréteur Convertisseur Niveau JCVM JCRE Bibliothèque native nécessaire à Java Card Niveau Applicatif Natif Bibliothèque native Programme d’installation Composants systèmes CAD Communication I/O Gestion de la mémoire Divers Processeur Niveau Hardware Hardware & OS natif Davy Rouillard Damien Sauveron Page 3 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Projets “orientés plate-forme” ☞ Le projet CertiCartes (Inria Sophia-Antipolis : G. Barthe, G. Dufay, B. Serpette...) • Formalisation du langage de bytecode en C oq. ☞ Le projet Bali (Münich : G. Klein, T.Nipkow,...) • Formalisation du langage JavaCard en I sabelle. Ces projets sont inclus dans VerifiCard. (Université de Nijmegen, INRIA, Universités de Münich et Kaiserslautern, Swedish Institute of Computer Science, SchlumbergerSema.) Davy Rouillard Damien Sauveron Page 4 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Bali et CertiCartes s’appuient sur un assistant de preuve (logique d’ordre supérieur). ☞ Définition de types et de constantes : type primitif, accès, classe, methode, programme ... ☞ Preuve de lemmes. ☞ Des techniques pour prouver plus facilement des propriétés : règles de réécritures, règles de raisonnement. Davy Rouillard Damien Sauveron Page 5 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Le projet Certicard Contient une formalisation de la plate-forme au niveau bytecode. ☞ formalisation d’un programme (format CAP). ☞ formalisation de la machine virtuelle embarquée. ☞ formalisation des instructions et leur sémantique (opérationnelle). Davy Rouillard Damien Sauveron Page 6 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Formalisation d’un programme Record : jcprogram Set := { classes : ( list Class ); methods : ( list Method ); interfaces : Interface ) ( list }. Record : Interface Set := { statusshareable : bool ; super_int : ( list Int_id : cap_interf_idx ); cap_interf_idx }. Record Method : Set := { signature : ( signature_type ∗type ); local : bytecode : ( list statusstatic : handler_list : ( list method_id : cap_method_idx ; owner : cap_class_idx nat ; Instruction ); bool ; handler_type ); }. Davy Rouillard Damien Sauveron Page 7 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Formalisation de la JCVM Definition Inductive jcvm_state obj : := static_heap ∗heap∗stack . S e t := Instance : t y p e _ i n s t a n c e −> o b j Array : t y p e _ a r r a y −> o b j . := ( list Definition heap Definition static_heap Definition stack obj ). := ( list := ( list | valu ). frame ). Davy Rouillard Damien Sauveron Page 8 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Formalisation des instructions j c v m _ s t a t e ∗ o p e r a n d s −> r e t u r n e d _ s t a t e Inductive returned_state : Set := j c v m _ s t a t e −>r e t u r n e d _ s t a t e | Normal : Abnormal : x c p t −>j c v m _ s t a t e −>r e t u r n e d _ s t a t e . Definition NOP : = [ state : jcvm_state ] Cases state of ( sh , ( hp , ( ( c o n s h l f ) a s s ))) = > ( update_frame ( update_pc ( S ( p_count h ) ) h ) state ) | _ => ( AbortCode state_error state ) end . Davy Rouillard Damien Sauveron Page 9 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Application de Certicard Description et vérification d’un vérificateur de bytecode (BCV). A démontrer : A tout point du programme, les variables locales et les opérandes de pile sont correctement typées pour l’instruction à exécuter. Ce qui est prouvé : ☞ Le BCV termine. ☞ Si la vérification de bytecodes est un succès → AbortCode ne sera pas appelée. Davy Rouillard Damien Sauveron Page 10 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Application de Bali package public java_lang interface public Base { HasFoo foo ( Base z ); } public class Base static boolean public HasFoo public Base return implements arr [] = new HasFoo { public boolean [2]; vee ; foo ( Base Ext extends public int vee ; public Ext foo ( Base z) { (( Ext ) z ). vee z; return Base { z) { = 1; null ; } } } class } BaseCl :: class "BaseCl == (|access=Public, cfields=[(arr, (|access=Public,static=True ,type=PrimT Boolean.[]|)), (vee, (|access=Public,static=False,type=Iface HasFoo |))], methods=[Base_foo], init=Expr(arr_viewed_from Base Base :=New (PrimT Boolean)[Lit (Intg 2)]), super=Object, superIfs=[HasFoo]|)" Davy Rouillard Damien Sauveron Page 11 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Exemples de propriétés package public java_lang interface public Base { HasFoo foo ( Base z ); } public class Base static boolean public HasFoo public Base return implements arr [] = new HasFoo { public boolean [2]; vee ; foo ( Base class Ext extends public int vee ; public Ext foo ( Base z) { (( Ext ) z ). vee z; return Base { z) { = 1; null ; } } } } 1. “La seule interface est HasFoo” 2. “foo est déclarée dans Ext” 3. “Ext foo surcharge Base foo” Davy Rouillard Damien Sauveron Page 12 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués A quoi cela peut-il donc servir ? ☞ Évaluation de plate-forme : prouver la correction de certains aspects (BCV, firewall, transaction) en établissant une abstraction avec la formalisation de référence. ⇒ complexe à mettre en oeuvre sans outil (projet Jakarta) ☞ Évaluation d’application : • un compilateur .cap → jcprogram est fourni par le projet Jakarta. • des outils de traduction spécification → théories I sabelle/C oq ⇒ reste à identifier les propriétés à vérifier et le niveau le plus approprié : solde ≥ 0 ; min ≤ val ≤ max ; vérification de type énuméré. Davy Rouillard Damien Sauveron Page 13 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Projets orientés “applications” ☞ Extended Static Checker ESC/Java (Compaq System Research Center) vérifie à la compilation les assertions ESC/Java ou JML ☞ JML : Java Modeling Language (Université de l’Iowa) ☞ compilateur LOOP (Université de Nijmegen) traduit le code annoté en JML −→ PVS ou Isabelle). ☞ projet Bandera • un langage de spécification des propriétés (logique temporelle) • des outils pour extraire un modèle à état fini à partir des programmes. • un langage d’abstraction et un moteur d’abstraction. ☞ JavaPathFinder. Davy Rouillard Damien Sauveron Page 14 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language ☞ Développé par l’université de l’état de l’Iowa. ☞ Il permet d’exprimer des assertions à inclure dans le code Java en spécifiant, par exemple : • les pré-conditions et post-conditions, • les invariants, • etc. ☞ Se rapproche de Eiffel (vérification à l’exécution pour le debug) et de l’approche “Design by Contract”. ☞ Super ensemble de ESC/Java. Utilisation = annotation du source Java ou Java Card précédée de //@ ou entourée par /*@ et @*/ directement dans le .java ou dans un fichier .jml Davy Rouillard Damien Sauveron Page 15 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language Préconditions et Postconditions en JML /∗@ n o r m a l b e h a v i o r @ @ r e q u i r e s : < p r e c o n d i t i o n >; e n s u r e s : < p o s t c o n d i t i o n >; @∗/ Exitence des quantificateurs ☞ universels (\forall) ☞ existentiels (\exist) Davy Rouillard Damien Sauveron Page 16 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language Traitement des exceptions /∗@ b e h a v i o r @ r e q u i r e s : < p r e c o n d i t i o n >; @ ensures : <p o s t c o n d i t i o n >; @ s i g n a l s : ( E x c e p t i o n 1 ) < c o n d i t i o n 1 >; . . . s i g n a l s : ( E x c e p t i o n n ) < c o n d i t i o n n >; @∗/ normal_behavior = behavior avec signals: (java.lang.Exception) false; Davy Rouillard Damien Sauveron Page 17 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language invariant et modifiable Pour la classe APDU (Application Protocol Data Unit), voici un invariant /∗@ i n v a r i a n t : b u f f e r ! = n u l l @ && b u f f e r . l e n g t h == APDU.BUFFERSIZE; @∗/ modifiable:x spécifie qu’une méthode peut changer seulement le champ x. Davy Rouillard Damien Sauveron Page 18 Laboratoire Bordelais de Recherche en Informatique JML : Java Modeling Language Équipe : Systèmes et Objets Distribués modifiable p u b l i c s t a t i c n a t i v e b y t e a r r a y C o m p a r e ( b y t e [ ] src , short srcOff , byte [ ] dest , short destOff , short length ) throws ArrayIndexOutOfBoundsException , NullPointerException ; /∗@ n o r m a l b e h a v i o r @ @ r e q u i r e s : s r c ! = n u l l && d e s t ! = n u l l && @ s r c O f f >= 0 && d e s t O f f >= 0 && l e n g t h >= 0 && @ s r c O f f + l e n g t h <= s r c . l e n g t h && @ d e s t O f f + l e n g t h <= d e s t . l e n g t h ; @ @ modifiable : \ nothing ; @ @ ensures : true @∗/ Davy Rouillard Damien Sauveron Page 19 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language modifiable p u b l i c s t a t i c n a t i v e s h o r t a r r a y C o p y ( b y t e [ ] src , short srcOff , byte [ ] dest , short destOff , short length ) throws ArrayIndexOutOfBoundsException , NullPointerException , TransactionException ; /∗@ b e h a v i o r @ @ r e q u i r e s : s r c ! = n u l l && d e s t ! = n u l l && @ s r c O f f >= 0 && d e s t O f f >= 0 && l e n g t h >= 0 && @ s r c O f f + l e n g t h <= s r c . l e n g t h && @ d e s t O f f + l e n g t h <= d e s t . l e n g t h ; @ @ m o d i f i a b l e : d e s t [ d e s t O f f . . d e s t O f f+l e n g t h − 1 ]; @ @ ensures : true ; @ @ s i g n a l s : ( TransactionException ) true ; @∗/ Davy Rouillard Damien Sauveron Page 20 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language Exemple receiveBytes 1 setIncomingAndReceive 2 sendBytes 3 setOutgoingLength 4 setOutgoing setOutgoingNoChaining 5 sendBytes setOutgoingLength setOutgoingAndSend //@ p u b l i c model i n t APDU state ; //@ p u b l i c i n v a r i a n t : 1 <= APDU state && //@ p u b l i c model i n t Lr ; Davy Rouillard Damien Sauveron 6 7 APDU state <= 7; Page 21 Laboratoire Bordelais de Recherche en Informatique JML : Java Modeling Language Équipe : Systèmes et Objets Distribués Exemple public short setIncomingAndReceive ( ) throws APDUException ; /∗@ p u b l i c b e h a v i o r @ @ requires : APDU state == 1; @ @ modifiable : APDU state , b u f f e r [ 5 . . 5 + \ r e s u l t − 1 ]; @ @ @ ensures : APDU state == 2 && ( ∗ data r e c e i v e d in b u f f e r [5..5+ \ r e s u l t −1] ∗); @ @ s i g n a l s : ( APDUException ) t r u e ; @∗/ Davy Rouillard Damien Sauveron Page 22 Laboratoire Bordelais de Recherche en Informatique JML : Java Modeling Language Équipe : Systèmes et Objets Distribués Exemple public short receiveBytes ( short bOff ) throws APDUException ; /∗@ p u b l i c b e h a v i o r @ @ requires : @ APDU state == 2 && 0 <= b O f f && b O f f+g e t I n B l o c k S i z e () <= BUFFERSIZE; @ @ modifiable : APDU state , b u f f e r [ b O f f . . b O f f+\ r e s u l t − 1]; @ @ ensures : APDU state == 2 && @ 0 <= \ r e s u l t && @ b O f f+\ r e s u l t <= BUFFERSIZE && @ ( ∗ d a t a r e c e i v e d i n b u f f e r [ b O f f . . b O f f+\ r e s u l t − 1 ] ∗ ) ; @ @ s i g n a l s : ( APDUException ) t r u e ; @∗/ Davy Rouillard Damien Sauveron Page 23 Laboratoire Bordelais de Recherche en Informatique JML : Java Modeling Language Équipe : Systèmes et Objets Distribués Exemple public short setOutgoing ( ) throws APDUException ; /∗@ p u b l i c b e h a v i o r @ @ requires : APDU state = = 1 | | APDU state == 2; @ @ modifiable : APDU state ; @ @ ensures : APDU state == 3; @ @ s i g n a l s : ( APDUException ) t r u e ; @∗/ Davy Rouillard Damien Sauveron Page 24 Laboratoire Bordelais de Recherche en Informatique JML : Java Modeling Language Équipe : Systèmes et Objets Distribués Exemple public void setOutgoingLength ( short len ) throws APDUException ; /∗@ p u b l i c b e h a v i o r @ @ requires : ( APDU state == 3 && 0 <= l e n && l e n <= 256) | | ( APDU state == 5 && @ 0 <= l e n && l e n <= g e t O u t B l o c k S i z e () −2); @ @ @ modifiable : APDU state , Lr ; @ @ @ ensures : APDU state == \ o l d ( APDU state)+1 && Lr == l e n ; @ @ s i g n a l s : ( APDUException ) t r u e ; @∗/ Davy Rouillard Damien Sauveron Page 25 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués JML : Java Modeling Language Résultats sur l’ADPU ☞ A permis de redécouvrir des idées de design de la classe qui avaient disparues dans les spécifications informelles. ☞ A permis de lever des problèmes dans l’implémentation de référence. ☞ A permis de rendre plus compréhensible les spécifications informelles. Davy Rouillard Damien Sauveron Page 26 Laboratoire Bordelais de Recherche en Informatique Équipe : Systèmes et Objets Distribués Annexe Record frame (∗ : Set operand := { stack : ( list opstack (∗ local variables location of : method_loc (∗ context : whether analyzed (∗ program p_count the ∗) Package ; is being analyzed ∗) bool ; counter : ∗) cap_method_idx ; method : valu ); method information context_ref (∗ the valu ); ∗) : ( list locvars (∗ ∗) ∗) bytecode_idx }. Davy Rouillard Damien Sauveron Page 27