Développement sécurisé Android Johan Leuenberger Software Security Engineer Application Security Forum - 2012 Western Switzerland 7-8 novembre 2012 - Y-Parc / Yverdon-les-Bains https://www.appsec-forum.ch
2 Bio Software security engineer chez ELCA Spécialisé dans le développement Android Réalisation d elcardm Android Solution d authentification forte sur smartphone «Android Fanboy»
3 Agenda Android Menaces Protections Conclusion
4 Android facts 1 million de nouveaux appareils Android chaque jour. 1.5 milliard d applications téléchargées chaque mois 700 000 applications disponibles http://developer.android.com/about/index.html https://www.lookout.com/resources/reports/state-of-mobile-security-2012
5 Applications en tous genres Jeux Divers Finances
6 Applications en tous genres Jeux Divers Finances
7 Applications en tous genres Jeux Divers Finances
8 Applications en tous genres Jeux Divers Finances
9 Agenda Android Menaces Protections Conclusion
10 Menaces Reverse engineering Abus du Google Play Store Copie de l application Vol d informations (mot de passe, etc)
11 Scénario 1) Récupération d une application existante et décompilation 2) Ajout de fonctionnalités 3) Packaging de la nouvelle application 4) Publication de l application sur le Google Play Store
12 Reverse engineering - outils APK Android Application Package File classes.dex classes compilées resources.arsc + res resources AndroidManifest.xml fichier décrivant l application Outils adb communication avec un appareil Android dex2jar Java Decompiler ~.java apktool.smali
13 Reverse engineering - smali.class public LHelloWorld;.super Ljava/lang/Object;.method public static main([ljava/lang/string;)v.registers 2 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "Hello World!" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void.end method
14 Reverse engineering - Demo Modification d une application afin de récupérer le compte et le mot de passe d un utilisateur
15 Reverse engineering SMS Receiver AndroidManifest.xml <uses-permission android:name="android.permission.receive_sms" /> <receiver android:name="ch.elca.appsec.smsreceiver" android:enabled="true"> <intent-filter> <action android:name="android.provider.telephony.sms_received" /> </intent-filter> </receiver>
16 Reverse engineering SMS Receiver SmsReceiver public class SmsReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Bundle pudsbundle = intent.getextras(); Object[] pdus = (Object[]) pudsbundle.get("pdus"); SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]); String smstext = messages.getmessagebody(); } forwardtoserver(smstext);
17 Abus du Google Play Store Les applications sont «self-signed» Publication aisée Validation pré-publication Google Bouncer (BH2012 Bypassing Google s Bouncer) Retrait post-publication Remote removal
18 Vol de données Pas de keystore Application sandbox Faillible au root Carte SD
19 Agenda Android Menaces Protections Conclusion
20 Protections exposition Store données reverse engineering copie de l application obfuscation module natif externe clé dynamique
21 Reverse engineering Pas de solution miracle! Rendons la vie difficile! Etape 0 Activer Proguard proguard.config=default_proguard.cfg 10 sec
Proguard (avec / sans) 22
23 Module natif Android NDK (Native Development Kit) Code natif exécutable sous Android Basé sur JNI (Java Native Interface) Code accessible sous forme binaire uniquement Code binaire peut également être obfusqué Comment ca marche? Code écrit en C / C++ Compilé via les outils fournis par Google (ndk-build) => libmymodule.so
24 Android NDK - Exemple Java C 0110101
Android NDK C jbytearray Java_ch_elca_appsec_NativeCaller_decrypt(JNIEnv* env, jobject this, jobject context, jbytearray data) {... deviceid = getdeviceid(context);... cleardata = decrypt(deviceid, data); jbytearray result = (*env)->newbytearray(env, len); (*env)->setbytearrayregion(env, result, 0, len, cleardata); return result; } jstring getdeviceid(jnienv* env, jobject context) { jstring device_id; jmethodid mid = (*env)->getmethodid(env, (*env)->getobjectclass(env,context), "getsystemservice", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject telephony_manager = (*env)->callobjectmethod(env, context, mid, (*env)->newstringutf(env,"phone")); mid = (*env)->getmethodid(env,(*env)->getobjectclass(env,telephony_manager), "getdeviceid", "()Ljava/lang/String;"); device_id = (jstring)(*env)->callobjectmethod(env,telephony_manager,mid); return device_id; } 25 C 0110101
26 Module natif externe La librairie est chargée lors de l exécution Elle n a pas besoin d être packagée dans l application Uniquement disponible aux utilisateurs légitimes
27 Séparation de l application coquille module externe - Publié sur le Store - Contient le minimum de logique - Contient l UI - Téléchargé durant l exécution de l application - Compilé à la volée sur un serveur - Unique par utilisateur et par appareil
28!(Reverse engineering + copie) Empreinte hardware Mot de passe utilisateur Génération du module Compilation Module (format binaire) Obfuscation Installation du module
29 Clé dynamique anti-copie Client f(r0, s0) = s1 decrypt(c1, s1) = m1 Secret initial partagé: s0 r0, c1 Serveur r0 = random() f(r0, s0) = s1 encrypt(m1,s1) = c1 r1 = random() f(r1, s1) = s2 encrypt(m2,s2) = c2 r1, c2 f(r1, s1) = s2 decrypt(c2, s2) = m2
30 Clé dynamique anti-copie Client s1 Serveur s1 Client copié s2 s2 s1
31 Clé dynamique anti-copie Client Serveur Client copié s1 s1 s1 s1 s2 s2 ERROR
32 Protections exposition Store données reverse engineering copie de l application obfuscation module natif externe clé dynamique
33 Conclusion Beaucoup de possibilités QR Code Push GCM GPS Etc. Android évolue constamment Chaque version essaie de corriger certaines vulnérabilités
34 Conclusion Le port d une application sur Android n est généralement pas direct (par exemple à partir d une application iphone) un certain raisonnement est nécessaire Le développement d applications sécurisées demande du temps et de l effort
35 Questions? johan.leuenberger@elca.ch
36 Merci/Thank you! Contact: johan.leuenberger@elca.ch http://www.secutalk.ch Slides: http://slideshare.net/asf-ws/presentations