Ethical Hacking: Android: inserire un malware in un APK

Archivio news Tecninf.

Capire come agiscono gli attaccanti per individuare le APP infette.

Per la serie “conoscerli per combatterli”, vedremo in questo articolo come iniettare del malware in un'applicazione Android. A fine 2017, il solo Grabos, codice maligno presente in oltre 150 app su Play Store, ha infettato più di 17 milioni di utenti Android, e non si tratta né del primo né dell'unico malware presente su Play Store nascosto all'interno di applicazioni insospettabili.

È quindi evidente come si tratti di una minaccia molto comune. Per eseguire un'analisi di un'applicazione infetta bisogna innanzitutto capire come agiscono gli attaccanti: di seguito vedremo in dettaglio come una normale applicazione mobile possa essere alterata inserendo del codice ostile.

Disassemblare un'applicazione. Per prima cosa è necessario scegliere una app da infettare. Per scaricare l'applicazione, se non abbiamo un dispositivo Android a portata di mano, è possibile utilizzare un servizio come APK Downloader o simili. In generale, 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, bisogna disassemblare l'applicazione per poterla modificare. Utilizziamo Apktool ottenendo i file dell'applicazione. Tra i file prodotti, quelli che ci interessano sono contenuti nella directory smali/, che include tutti i file dell'applicazione scritti in 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 ma, non essendo lo Smali un linguaggio di alto livello, non risultano immediatamente leggibili.

Se invece vogliamo capire per grandi linee come l'app è fatta, ci è più utile uno strumento come dex2jar che trasforma un file .dex in un archivio JAR, analizzabile con un 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.

Apktool è uno strumento per il reverse engineering dei binari Android: permette di disassemblare l'app e, cosa ancor più importante, di ricostruire il file APK dopo 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 abbiamo anche original (che contiene META-INF e i file xml utili per mantenere la firma originale) e unknown (file e cartelle non parte di AOSP).

Preparare il malware. Il passo successivo consiste nella scrittura dell'applicazione malware in Java con Android Studio. Per semplicità creiamo un malware elementare: un'applicazione che legge gli SMS e li inoltra via email a un indirizzo scelto dall'attaccante. Se il malware ha bisogno di permessi aggiuntivi rispetto all'app ospite, questi vanno richiesti nel manifesto e, nelle ultime versioni di Android, controllati a runtime con ContextCompat.checkSelfPermission() e ContextCompat.requestPermissions().

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). Serve quindi una classe che eredita da BroadcastReceiver e che rimane in ascolto dell'arrivo di un SMS: all'arrivo di un messaggio ne estrae il mittente e il contenuto e invia una email tramite una classe SendMail che usa internamente le API di JavaMail. Nel manifesto va specificato il receiver e l'azione associata (android.provider.Telephony.SMS_RECEIVED).

Iniettare il codice e ricostruire l'applicazione. Costruito l'APK del malware con Android Studio, lo disassembliamo per ottenere il codice Smali da iniettare. Per trasformare l'applicazione lecita in malware basta copiare il contenuto della directory smali/ (tranne android/) del malware nella directory smali/ dell'app ospite; faremo lo stesso per i file in unknown/. Dopo aver inserito il codice, ricreiamo l'applicazione e la firmiamo con Uber APK Signer o tramite APK Studio (che costruisce con APK Tool, firma con Uber APK Signer e ottimizza con Zip Align).

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; disassemblare il malware con APK Tool; copiare la directory smali/ del malware in quella dell'app ospite; costruire, firmare e ottimizzare l'app con APK Studio; installare l'app con ADB. Sembrano molti passi ma sono tutti semplici e immediati. Eseguiamo normalmente l'applicazione, che continuerà a fare il suo lavoro, ma al primo SMS ricevuto scatterà il comportamento da malware: invierà un'email con mittente e testo del messaggio.