Dal file APK al codice sorgente in poche semplici mosse
Google dà molta importanza alla sicurezza di Android. Una vulnerabilità nel sistema operativo che ormai fa girare qualche milione di dispositivi mobile in giro per il mondo si può facilmente tradurre in un grosso danno di immagine.
Nella knowledge base di Android viene suggerito proguard come libreria per offuscare il codice. E’ importante offuscare il nostro codice altrimenti, come vedremo in questo post, è possibile fare il reverse di un file APK in pochissimo tempo e con alte probabilità di successo.
Perché fare il reverse?
Precisiamo, fare il reverse di un file APK è un’attività che può essere considerata sulla linea di confine tra il lecito e l’illecito. Se non esplicitamente espresso dalla licenza, alcune infatti esplicitano il diniego ad attività di reversing, il confine potrebbe essere oltrepassato solo nel caso si voglia pacchettizzare un’applicazione modificata con backdoor o trojan o altre porcate simili.
Io per il progetto “Stand by Wordpress” ho fatto il reverse del file APK dell’applicazione WordPress per android per soli fini di studio. Sto eseguendo una code review e condividerò con loro i risultati sperando possano capire le motivazioni alla base.
Sicuramente è un’attività che, se fatta esclusivamente ai fini di studio, porta grandi benefici in termini di cose imparate… e ti fa acquistare fin da subito 100 punti code review.
Il file APK
Innanzitutto, tecnicamente voi non dovreste aver accesso ai file APK
installati sul vostro dispositivo. Questo perché, in teoria, voi non dovreste
aver ottenuto i privilegi di root sul proprio dispositivo.
Nel caso, fortuito, voi siate UID=0
sul vostro device, allora potete
scaricare il file dell’applicazione.
In alternativa, perché c’è sempre un’alternativa, voi potete andare sul sito www.apkmirror.com e scaricare il file APK che vi interessa analizzare.
Una volta scaricata l’applicazione, ci troviamo di fronte alla prima sorpresa. Per chi non lo sapesse, il file APK non è altro che un archivio ZIP contenente tutto quello che serve alla nostra applicazione per funzionare. Lo stesso concetto dei file .app di Mac OS X per intenderci. Nel nostro file APK, troveremo quindi:
- immagini
- file xml contenenti testi vari
- una directory META-INF che contiene il file MANIFEST.MF ed il certificato utilizzato per firmare l’applicazione prima della pubblicazione sullo store. Il file MANIFEST.MF contiene invece le permission di cui avrà bisogno l’applicazione per essere installata. E’ qui che lo store leagge le informazioni che vi vengono presentate al momento del download e che dovrebbero mettervi in allarme se un giochino ha bisogno di accedere alla videocamera.
- il file classes.dex
A noi serve quest’ultimo, quindi estraiamolo.
Il file classes.dex
Il file classes.dex non è altro che l’insieme dei file .class
di cui è
composta l’applicazione, in un formato tradotto per
Dalvik, la virtual machine di
Android.
A questo punto, siamo a metà del nostro percorso. Abbiamo bisogno di tradurre il formato per Dalvik nel bytecode Java standard per poter utilizzare uno dei tanti decompilatori che ci sono in giro su Internet.
Scarichiamo, quindi, il tool dex2jar e traduciamo il nostro file classes.dex in un archivio JAR contenenti classi nel consueto formato tipico delle applicazioni java.
L’output è un file chiamato classes-dex2jar.jar
che potremo scompattare
in maniera molto semplice, se ci serve accedere ai file .class, sempre con
unzip
oppure che possiamo dare in input al nostro tool di scansione del
codice nel caso supporti anche i file JAR come input.
Siamo arrivati ad avere il bytecode… ora manca un ultimo passaggio.
I file sorgenti
Uno dei decompilatori Java più completi, ce ne sono veramente molti, è JD-GUI. JD-GUI, si presenta come frontend grafico al decompilatore vero e proprio, molto pulita e semplice da usare. Una volta aperto il file JAR, i file class vengono decompilati e presentati a video.
Off by one
Ci si mette di più a leggere questo post che a fare tutta l’operazione. A
questo punto parte il divertimento vero e proprio. Codice decompilato alla
mano, potete giocare con qualche espressione regolare o qualche colpo di
grep
alla ricerca di pattern noti di cattiva programmazione o alla
ricerca di parole chiavi come secret, password o sha7.
I file .class possono essere utilizzati con Findbugs ad esempio, per una prima analisi statica automatica.
Non c’è ancora uno strumento che ha preso il posto di Owasp Orizon nello scacchiere opensource dell’analisi statica per codice Java. Visto che mi serve, un po’ per lavoro, un po’ perché sto ancora rispondendo a persone che mi chiedono aiuto su Orizon e un po’ perché manca anche uno strumento per l’analisi di codice Android, ho ripreso in mano Decompiling Java ed ho iniziato a buttar giù qualche idea che unisca un po’ i punti che ho lasciato aperti durante il mio viaggio nell’analisi statica di codice Java.
Enjoy it e dimmi cosa ne pensi!
Vuoi aiutarmi a portare avanti il progetto Codice Insicuro con una donazione? Fantastico, allora non ti basta che premere il pulsante qui sotto.
Supporta il progetto