Compromission d'une application bancaire JavaCard par attaque logicielle J. Lancia SERMA Technologies, CESTI Symposium sur la sécurité des technologies de l'information et des communications, 2012 1 / 39 Compromission d'une application bancaire JavaCard
Plan 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 2 / 39 Compromission d'une application bancaire JavaCard
Outline Expertise sécuritaire Java Card Mécanismes de sécurité 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 3 / 39 Compromission d'une application bancaire JavaCard
Présentation du produit attaqué Expertise sécuritaire Java Card Mécanismes de sécurité Plateforme Java Card 2.2.2 Machine virtuelle à faible empreinte mémoire dédiée aux cartes à puces Applications codées avec un sous-ensembe de Java Applet bancaire embarquée Protège les biens sécuritaires : PIN, clés, algorithmes cryptographiques Cible de notre expertise Plateforme ouverte Possibilité de charger des applets en phase opérationelle Ouvre la voie aux attaques logiques institution-log 4 / 39 Compromission d'une application bancaire JavaCard
Présentation du produit attaqué Expertise sécuritaire Java Card Mécanismes de sécurité Plateforme Java Card 2.2.2 Machine virtuelle à faible empreinte mémoire dédiée aux cartes à puces Applications codées avec un sous-ensembe de Java Applet bancaire embarquée Protège les biens sécuritaires : PIN, clés, algorithmes cryptographiques Cible de notre expertise Plateforme ouverte Possibilité de charger des applets en phase opérationelle Ouvre la voie aux attaques logiques institution-log 4 / 39 Compromission d'une application bancaire JavaCard
Présentation du produit attaqué Expertise sécuritaire Java Card Mécanismes de sécurité Plateforme Java Card 2.2.2 Machine virtuelle à faible empreinte mémoire dédiée aux cartes à puces Applications codées avec un sous-ensembe de Java Applet bancaire embarquée Protège les biens sécuritaires : PIN, clés, algorithmes cryptographiques Cible de notre expertise Plateforme ouverte Possibilité de charger des applets en phase opérationelle Ouvre la voie aux attaques logiques institution-log 4 / 39 Compromission d'une application bancaire JavaCard
Règles du jeu Expertise sécuritaire Java Card Mécanismes de sécurité Contraintes Temps contraint : 15 jours Nombre d'échantillons contraint : 20 échantillons Atouts Clés de chargement d'applets disponibles Code disponible (applet et plateforme)...... vraiment nécessaire? 5 / 39 Compromission d'une application bancaire JavaCard
Règles du jeu Expertise sécuritaire Java Card Mécanismes de sécurité Contraintes Temps contraint : 15 jours Nombre d'échantillons contraint : 20 échantillons Atouts Clés de chargement d'applets disponibles Code disponible (applet et plateforme)...... vraiment nécessaire? 5 / 39 Compromission d'une application bancaire JavaCard
Outline Expertise sécuritaire Java Card Mécanismes de sécurité 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 6 / 39 Compromission d'une application bancaire JavaCard
Sécurité des plateformes Java Card Expertise sécuritaire Java Card Mécanismes de sécurité Sécurité du code Vérication statique de bytecode Vérications dynamiques ( ex. cast) Vérication de bytecode La vérication de bytecode est faite ocard. Il est possible de modier le bytecode entre la vérication et le chargement. 7 / 39 Compromission d'une application bancaire JavaCard
Sécurité des plateformes Java Card Expertise sécuritaire Java Card Mécanismes de sécurité Sécurité du code Vérication statique de bytecode Vérications dynamiques ( ex. cast) Vérication de bytecode La vérication de bytecode est faite ocard. Il est possible de modier le bytecode entre la vérication et le chargement. 7 / 39 Compromission d'une application bancaire JavaCard
Sécurité des plateformes Java Card Expertise sécuritaire Java Card Mécanismes de sécurité Partage d'objets entre applets Notion de propriété d'instance Tous les partages entre applets sont contôlés par le rewall Même quand tout se passe mal Un attaquant obtient une référence sur une instance d'une autre applet Le rewall bloque l'accès 8 / 39 Compromission d'une application bancaire JavaCard
Sécurité des plateformes Java Card Expertise sécuritaire Java Card Mécanismes de sécurité Partage d'objets entre applets Notion de propriété d'instance Tous les partages entre applets sont contôlés par le rewall Même quand tout se passe mal Un attaquant obtient une référence sur une instance d'une autre applet Le rewall bloque l'accès 8 / 39 Compromission d'une application bancaire JavaCard
Sécurité additionnelle du produit Expertise sécuritaire Java Card Mécanismes de sécurité Pile typée Représentation interne diérente pour les références et les types natifs Méta-données sur les objets Informations supplémentaires gérées par la machine virtuelle Permet des vérications supplémentaires pendant l'exécution Nombre de champs, classe de l'objet 9 / 39 Compromission d'une application bancaire JavaCard
Sécurité additionnelle du produit Expertise sécuritaire Java Card Mécanismes de sécurité Pile typée Représentation interne diérente pour les références et les types natifs Méta-données sur les objets Informations supplémentaires gérées par la machine virtuelle Permet des vérications supplémentaires pendant l'exécution Nombre de champs, classe de l'objet 9 / 39 Compromission d'une application bancaire JavaCard
Sécurité additionnelle du produit Expertise sécuritaire Java Card Mécanismes de sécurité Chirement par applet Les données sensibles (clés, PIN...) sont stockées chirées La clé de chirement est diérente pour chaque applet Même quand tout se passe mal Un attaquant lit toute la mémoire d'une autre applet Les données sensibles restent protégées Que va-t-on bien pouvoir faire? 10 / 39 Compromission d'une application bancaire JavaCard
Sécurité additionnelle du produit Expertise sécuritaire Java Card Mécanismes de sécurité Chirement par applet Les données sensibles (clés, PIN...) sont stockées chirées La clé de chirement est diérente pour chaque applet Même quand tout se passe mal Un attaquant lit toute la mémoire d'une autre applet Les données sensibles restent protégées Que va-t-on bien pouvoir faire? 10 / 39 Compromission d'une application bancaire JavaCard
Outline La faille de la cuirasse De Charybde en Scylla 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 11 / 39 Compromission d'une application bancaire JavaCard
Confusion de type La faille de la cuirasse De Charybde en Scylla Principe Convertion illégale entre objets de types incompatibles 12 / 39 Compromission d'une application bancaire JavaCard
Accéder à un objet comme un short La faille de la cuirasse De Charybde en Scylla Forger des références vers les objets d'autres applets Lire la représentation interne des objets Impossible à cause de la pile typée 13 / 39 Compromission d'une application bancaire JavaCard
La faille de la cuirasse De Charybde en Scylla Accéder à un objet comme un objet d'un autre type Lire au delà des limites de l'objet Impossible à cause des meta-données 14 / 39 Compromission d'une application bancaire JavaCard
La faille de la cuirasse De Charybde en Scylla Accéder à un tableau de shorts comme un tableau de bytes Les bytes sont sur 1 octet, les shorts sont sur 2 octets Lire au delà des limites du tableau Pas détecté par la VM Tous les tableaux en Java sont de la classe Objet Les types natifs ne sont pas distingués dans les méta données 15 / 39 Compromission d'une application bancaire JavaCard
Outline La faille de la cuirasse De Charybde en Scylla 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 16 / 39 Compromission d'une application bancaire JavaCard
Allocation indirecte La faille de la cuirasse De Charybde en Scylla Allocation de deux tableaux de bytes successifs Confusion de type sur le premier tableau Accès illégal à l'en-tête du 2 tableau Modication de la taille dans l'en-tête du 2 tableau Accès illégal à 32 kb maximum en lecture/écriture institution-log 17 / 39 Compromission d'une application bancaire JavaCard
Allocation indirecte La faille de la cuirasse De Charybde en Scylla Allocation de deux tableaux de bytes successifs Confusion de type sur le premier tableau Accès illégal à l'en-tête du 2 tableau Modication de la taille dans l'en-tête du 2 tableau Accès illégal à 32 kb maximum en lecture/écriture institution-log 17 / 39 Compromission d'une application bancaire JavaCard
Accès mémoire illégal La faille de la cuirasse De Charybde en Scylla Lecture L'AID de l'application bancaire est présent dans les données Analyse en rétro-conception des octets lus Les données sensibles sont chirées par applet Pas accessibles par lecture du tableau Ecriture Modication du code de l'application bancaire 18 / 39 Compromission d'une application bancaire JavaCard
Outline 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 19 / 39 Compromission d'une application bancaire JavaCard
Présentation de l'attaque PIN Donnée critique de l'application bancaire Permet d'authentier le porteur de la carte Objectif Modier le code de la carte pour qu'elle accepte un PIN incorrect 20 / 39 Compromission d'une application bancaire JavaCard
Présentation de l'attaque PIN Donnée critique de l'application bancaire Permet d'authentier le porteur de la carte Objectif Modier le code de la carte pour qu'elle accepte un PIN incorrect 20 / 39 Compromission d'une application bancaire JavaCard
Retro conception du code de VERIFY Bytecode L3 : s l o a d 4 ; s l o o k u p s w i t c h L6 2 90 L5 165 L4 ; L4 : g e t f i e l d _ a _ t h i s 0 ; i n v o k e v i r t u a l 1 8 ; r e t u r n ; L5 : s s p u s h 2 5 5 3 6 ; g e t f i e l d _ a _ t h i s 0 ; i n v o k e v i r t u a l 1 9 ; s o r ; i n v o k e s t a t i c 2 0 ; L6 : s s p u s h 8531; i n v o k e s t a t i c 2 0 ; r e t u r n ; Java Card r e s u l t=ownerpin. c h e c k ( pin, o f f s e t, SIZE ) ;... s w i t c h ( r e s u l t ) { c a s e TRUE : resetptc ( ) ; r e t u r n ; c a s e FALSE : U s e r E x c e p t i o n. t h r o w I t ( ( s h o r t ) (0 x63c0 ( PTC [ 0 ] ) ) ) ; d e f a u l t : b r e a k ; } I S O E x c e p t i o n. t h r o w I t ( T e r m i n a t e ) ; 21 / 39 Compromission d'une application bancaire JavaCard
Modication du code de VERIFY Traitement du résultat de la vérication de PIN slookupswitch L6 2 90 L5 165 L4; Code original 90 L5 = Cas défavorable Si la variable vaut 0x5A, jump à L5 165 L4 = Cas favorable Si la variable vaut 0xA5, jump à L4 Code modié 90 L4 = Cas FAVORABLE 165 L4 = Cas favorable institution-log 22 / 39 Compromission d'une application bancaire JavaCard
Modication du code de VERIFY Traitement du résultat de la vérication de PIN slookupswitch L6 2 90 L5 165 L4; Code original 90 L5 = Cas défavorable Si la variable vaut 0x5A, jump à L5 165 L4 = Cas favorable Si la variable vaut 0xA5, jump à L4 Code modié 90 L4 = Cas FAVORABLE 165 L4 = Cas favorable institution-log 22 / 39 Compromission d'une application bancaire JavaCard
Code de VERIFY après l'attaque r e s u l t=ownerpin. c h e c k ( pin, o f f s e t, SIZE ) ; s w i t c h ( r e s u l t ) { c a s e TRUE : c a s e FALSE : resetptc ( ) ; r e t u r n ; d e f a u l t : b r e a k ; } I S O E x c e p t i o n. t h r o w I t ( T e r m i n a t e ) ; Sortie de la commande VERIFY Quel que soit le code PIN présenté : La carte émet une réponse positive Le compteur d'essais est remis à 0 institution-log 23 / 39 Compromission d'une application bancaire JavaCard
Outline 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 24 / 39 Compromission d'une application bancaire JavaCard
Présentation de l'attaque clés Kmac Kenc Objectif Données critiques de l'application bancaire Permet d'authentier la banque Modication du PIN, mise à zero des compteurs de transaction Validation des transactions Modier le code de la carte pour accéder aux clés Plan d'attaque Déterminer les identiants de champs correspondant aux clés Modication d'une portion de code qui renvoie des données pour renvoyer les clés institution-log 25 / 39 Compromission d'une application bancaire JavaCard
Présentation de l'attaque clés Kmac Kenc Objectif Données critiques de l'application bancaire Permet d'authentier la banque Modication du PIN, mise à zero des compteurs de transaction Validation des transactions Modier le code de la carte pour accéder aux clés Plan d'attaque Déterminer les identiants de champs correspondant aux clés Modication d'une portion de code qui renvoie des données pour renvoyer les clés institution-log 25 / 39 Compromission d'une application bancaire JavaCard
Présentation de l'attaque clés Kmac Kenc Objectif Données critiques de l'application bancaire Permet d'authentier la banque Modication du PIN, mise à zero des compteurs de transaction Validation des transactions Modier le code de la carte pour accéder aux clés Plan d'attaque Déterminer les identiants de champs correspondant aux clés Modication d'une portion de code qui renvoie des données pour renvoyer les clés institution-log 25 / 39 Compromission d'une application bancaire JavaCard
Où sont mes clés? Quand tout semble aller de travers, l'application exécute le code suivant : g e t f i e l d _ a _ t h i s 2 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 3 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 4 ; i n v o k e i n t e r f a c e 1 13 0 ; On en déduit qu'il s'agit du code d'eacement des clés : SMI_K. c l e a r K e y ( ) ; SMC_K. c l e a r K e y ( ) ; AC_K. c l e a r K e y ( ) ; Les identiants des clés sont 2, 3, 4 institution-log 26 / 39 Compromission d'une application bancaire JavaCard
Où sont mes clés? Quand tout semble aller de travers, l'application exécute le code suivant : g e t f i e l d _ a _ t h i s 2 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 3 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 4 ; i n v o k e i n t e r f a c e 1 13 0 ; On en déduit qu'il s'agit du code d'eacement des clés : SMI_K. c l e a r K e y ( ) ; SMC_K. c l e a r K e y ( ) ; AC_K. c l e a r K e y ( ) ; Les identiants des clés sont 2, 3, 4 institution-log 26 / 39 Compromission d'une application bancaire JavaCard
Où sont mes clés? Quand tout semble aller de travers, l'application exécute le code suivant : g e t f i e l d _ a _ t h i s 2 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 3 ; i n v o k e i n t e r f a c e 1 13 0 ; g e t f i e l d _ a _ t h i s 4 ; i n v o k e i n t e r f a c e 1 13 0 ; On en déduit qu'il s'agit du code d'eacement des clés : SMI_K. c l e a r K e y ( ) ; SMC_K. c l e a r K e y ( ) ; AC_K. c l e a r K e y ( ) ; Les identiants des clés sont 2, 3, 4 institution-log 26 / 39 Compromission d'une application bancaire JavaCard
Extraction des clés méthode getkey de la classe DESKey byte getkey ( byte [] keydata, short ko ) méthode generatedata de la classe RandomData void generatedata ( byte [] buer, short oset, short length ) Similarités : remplissent un tableau de bytes passés en argument acceptent un oset Diérence : generatedata a un argument de longueur institution-log 27 / 39 Compromission d'une application bancaire JavaCard
Retro conception du code de GET CHALLENGE Génération d'aléa dans la méthode GET CHALLENGE random.generatedata(tmpbuer,(short)0,size); Bytecode g e t f i e l d _ a _ t h i s 1 ; g e t f i e l d _ a _ t h i s 7 ; sconst_0 ; sload_2 ; i n v o k e v i r t u a l 2 2 ; c h a r g e random c h a r g e t m p b u f f e r c h a r g e ( s h o r t ) 0 c h a r g e s i z e i n v o c a t i o n de g e n e r a t e D a t a 28 / 39 Compromission d'une application bancaire JavaCard
Modication du code de GET CHALLENGE Lecture de la clé Bytecode byte getkey ( byte [] keydata, short ko ) > g e t f i e l d _ a _ t h i s 2 ; g e t f i e l d _ a _ t h i s 7 ; sconst_0 ; > nop ; > i n v o k e i n t e r f a c e 4 ; c h a r g e SMI_K à l a p l a c e de random c h a r g e t m p b u f f e r c h a r g e ( s h o r t ) 0 ne c h a r g e pas s i z e i n v o c a t i o n de getkey 29 / 39 Compromission d'une application bancaire JavaCard
Code de GET CHALLENGE après l'attaque Code Java Card SMI_K. getkey ( t m p b u f f e r, ( s h o r t ) 0) ; U t i l. arraycopynonatomic ( t m p b u f f e r, ( s h o r t ) 0, a p d u B u f f e r, ( s h o r t ) 0, s i z e ) ; apdu. s e t O u t g o i n g L e n g t h ( s i z e ) ; apdu. s e n d B y t e s ( ( s h o r t ) 0, s i z e ) ; Sortie de la commande GET CHALLENGE L'application bancaire renvoie les 8 premiers octets de la clé de protection en intégrité Kmac Les 8 octets suivants peuvent être obtenus en modiant l'oset 30 / 39 Compromission d'une application bancaire JavaCard
Rappel Chirement par applet Les données sensibles (clés, PIN...) sont stockées chirées La clé de chirement est diérente pour chaque applet Même quand tout se passe mal Un attaquant lit toute la mémoire d'une autre applet Les données sensibles restent protégées 31 / 39 Compromission d'une application bancaire JavaCard
Rappel Chirement par applet Les données sensibles (clés, PIN...) sont stockées chirées La clé de chirement est diérente pour chaque applet Et pourtant C'est l'applet compromise qui lit ses clés...... et nous les donne! 31 / 39 Compromission d'une application bancaire JavaCard
Réalisation d'un YES Card 32 / 39 Compromission d'une application bancaire JavaCard
33 / 39 Compromission d'une application bancaire JavaCard
Outline Résumé Contre-mesures 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 34 / 39 Compromission d'une application bancaire JavaCard
Bref j'ai craqué une carte à puces Résumé Contre-mesures Un produit bien sécurisé Sécurité de Java Card Sécurité additionnelle du produit Attaque par confusion de type Accès en lecture/écriture au code de l'applet Compromission de l'applet bancaire PIN clés cryptographiques et potentiellement toutes les données de l'application institution-log 35 / 39 Compromission d'une application bancaire JavaCard
Outline Résumé Contre-mesures 1 Expertise sécuritaire Java Card Mécanismes de sécurité 2 La faille de la cuirasse De Charybde en Scylla 3 4 5 Résumé Contre-mesures institution-log 36 / 39 Compromission d'une application bancaire JavaCard
Réalisme de l'attaque Résumé Contre-mesures Code malicieux Le code de l'applet d'attaque ne passe pas le bytecode verier Impossible à embarquer dans un applet légitime Chargement de l'applet Il faut disposer des clés de chargement de la carte Ces clés sont distribuées de manière sécurisée 37 / 39 Compromission d'une application bancaire JavaCard
Contre-mesures Résumé Contre-mesures Contre-mesures possibles Etendre les méta-données aux types natifs Utilisation de la segmentation mémoire matérielle Contre-mesure mise en place Recommendations sécuritaires dans les guides d'utilisation Vérier systématiquement le code des applets N'autoriser le chargement d'applets qu'aux entités de conance 38 / 39 Compromission d'une application bancaire JavaCard
Résumé Contre-mesures Des questions? 39 / 39 Compromission d'une application bancaire JavaCard