Rimuovere il controllo sui permessi di root da una app Android

Lavorando nell’ambito della consulenza mi capita di dover analizzare il funzionamento di app e programmi realizzati da terzi, come avevo già avuto modo di raccontare in un talk sul reverse engineering dei dispositivi IoT. Lo scopo di questo articolo è raccontarvi un esempio pratico di quanto mi è capitato a febbraio, spiegando la metodologia utilizzata e fornendovi alcuni spunti di approfondimento.

In realtà in questo caso non si è trattato di lavoro, ma di una scena quantomeno bizzarra accaduta al bar assieme ad altri membri del GrappaLUG. Un amico mi ha esposto il suo problema:

Andrea guarda, la banca ora non ci manda più gli SMS con comunicazioni e codici, ci hanno detto di installare questa app. Quando l’ho avviata mi ha detto di disattivare il debug USB, ora mi dice che ho il root. Ma io non l’ho mai fatto, né ho cambiato il software di sistema, uso il telefono così come l’ho comprato.

Un’applicazione problematica

L’app bancaria in questione è Notify, la quale ha ricevuto moltissime recensioni da 1 stella per malfunzionamenti vari. Molti dei commenti lamentano lo stesso problema trattato in questo post.

All’avvio l’app tenta di effettuare un paio di controlli di sicurezza, presumibilmente per proteggere gli utenti da potenziali furti di codici. Il problema è che si rifiuta totalmente di funzionare se pensa non siano stati superati. L’utente non viene avvertito, ma totalmente tagliato fuori dall’app.

Mentre il debug USB è molto semplice da disattivare, togliere il root è più complicato… specialmente se il telefono non è sbloccato ma la app si rifiuta lo stesso di funzionare!

Dopo aver ragionato per qualche minuto ho capito che il mio amico non aveva molte opzioni ed era necessario modificare l’app per rimuovere il controllo per poter continuare a usare il conto corrente.

Cosa dice la legge

A questo punto, se siete persone prudenti e magari anche fan dei film di Antonio Albanese, vi sarà sicuramente venuta in mente una citazione:

Sì ma, è legale questa cosa?

Cetto La Qualunque

Si tratta di una giusta osservazione, in quanto il reverse engineering di codice di terze parti potrebbe sembrare una potenziale violazione di copyright. Fortunatamente la “Direttiva 2009/24/CE del Parlamento europeo e del Consiglio, del 23 aprile 2009, relativa alla tutela giuridica dei programmi per elaboratore” è piuttosto esplicita su questo punto:

Possono comunque sussistere circostanze in cui tale riproduzione del codice e la traduzione della sua forma sono indispensabili per ottenere le informazioni necessarie per conseguire l’interoperabilità con altri programmi di un programma creato autonomamente. Si deve pertanto ritenere che, solo in tali limitate circostanze l’esecuzione degli atti di riproduzione e traduzione della forma del codice, da parte o per conto di una persona avente il diritto di usare una copia del programma, è legittima e compatibile con una prassi corretta e pertanto essa non richiede l’autorizzazione del titolare del diritto. Uno degli obiettivi di tale eccezione è di consentire l’interconnessione di tutti gli elementi di un sistema informatico, compresi quelli di fabbricanti differenti, perché possano funzionare insieme.

Problema risolto. Il mio obiettivo era proprio quello di rendere interoperabile l’app della banca con il sistema operativo Android del mio amico, nonostante ci fosse un piccolo bug che ne impediva il corretto caricamento.

Analisi e modifica dell’app

L’ultima volta che ho parlato di analisi di un’app Android, avevo fatto riferimento al fatto che è abbastanza facile decompilare un file APK e ottenere del codice Java che spesso è praticamente perfetto. Questo è estremamente comodo per leggere come funziona un’applicazione, ma si tratta di un problema se si vuole modificarla e creare un nuovo APK.

Infatti se il codice decompilato è “quasi” giusto ma non perfetto, ricompilarlo risulta impossibile. Quello che invece conviene fare è lavorare sul codice smali, che è praticamente l’equivalente di assembly per Dalvik, la macchina virtuale Java di Android.

La procedura per modificare un’app si suddivide quindi nei seguenti passi:

  1. Estrarre il bytecode classes.dex dall’APK
  2. Disassemblarlo in codice smali
  3. Modificare il codice con attenzione
  4. Riassemblare il codice
  5. Rigenerare un APK con il codice modificato
  6. Firmare digitalmente l’APK

Questo procedimento richiede l’uso di vari strumenti, tra cui apktool e dex2jar. Si tratta di passaggi semplici (a parte la modifica del codice), ma sono ripetitivi ed è meglio automatizzarli. A tale scopo sono nati vari progetti per tutte le piattaforme. Per esempio, su Linux si può usare Adus.

Mentre ero lì che cercavo qualche idea su come agire, ho casualmente scoperto APK Easy Tool, un programma per Windows molto pratico che fornisce poche icone a portata di mouse. Siccome volevo sbrigarmela in pochi minuti e avevo una macchina virtuale Windows sul portatile, ho deciso di provarlo.

APK Easy Tool in azione

Dopo aver reperito una copia dell’app da APKMonk, ho provveduto a caricarla e ho premuto il tasto Decompile. In breve tempo ho trovato il risultato nella cartella Decompiled APKs, con un bel po’ di file da analizzare.

Cercando la stringa Errore: ho trovato subito una corrispondenza nel file smali/it/phoenixspa/notify/MainActivity.smali, in particolare nel metodo ALY6W. Lo stesso metodo viene invocato al termine del metodo SKMXK e dal codice notiamo delle parti molto interessanti:

.method public SKMXK()V
.locals 2
new-instance v0, Lit/phoenixspa/notify/check/CheckerService;
invoke-direct {v0}, Lit/phoenixspa/notify/check/CheckerService;->()V
invoke-virtual {v0, p0}, Lit/phoenixspa/notify/check/CheckerService;->ELG2Z(Lit/phoenixspa/notify/MainActivity;)Ljava/lang/String;

move-result-object v1
const-string v0, "phone"
invoke-virtual {p0, v0}, Lit/phoenixspa/notify/MainActivity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Landroid/telephony/TelephonyManager;
invoke-virtual {v0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
move-result-object v0
invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-nez v0, :cond_0
invoke-virtual {p0, v1}, Lit/phoenixspa/notify/MainActivity;->ALY6W(Ljava/lang/String;)V
:goto_0
return-void
:cond_0
invoke-virtual {p0}, Lit/phoenixspa/notify/MainActivity;->O2SHI()V
goto :goto_0

.end method

Ho tolto le righe bianche per questioni di spazio. Il metodo richiama un CheckerService e il codice presente in smali/it/phoenixspa/notify/check/CheckerService.smali ha chiari riferimenti alla libreria rootbeer. Perciò verifica se lo smartphone ha i permessi di root.

Alla fine del codice c’è un controllo. Se il valore di v0 è uguale a 0, viene invocato ALY6W, dando un messaggio di errore. Altrimenti, l’esecuzione salta all’etichetta :cond_0 che invoca 02SHI e poi salta nuovamente a :goto_0 per restituire void.

Il flusso di esecuzione è abbastanza semplice e si dovrebbe capire leggendo lo smali, ma per renderlo più chiaro ho generato questo diagramma di flusso con androguard:

Flusso di esecuzione del metodo SKMXK originale

Il controllo si può aggirare rimuovendo l’if-nez e i relativi salti, invocando sempre 02SHI senza controllare v0. Ho modificato l’ultima parte in questo modo:

    invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
invoke-virtual {p0}, Lit/phoenixspa/notify/MainActivity;->O2SHI()V
return-void

.end method
Flusso di esecuzione del metodo SKMXK con patch

Tramite APK Easy Tool è bastato un click per ottenere un nuovo APK firmato automaticamente e pronto per essere installato. Per l’installazione, il modo più semplice è usare adb (va attivato il debug USB):

adb install it.phoenixspa.notify_2018-10-05.apk 

Ricordatevi che prima la versione originale deve essere rimossa, perché non abbiamo il certificato “vero” dello sviluppatore e perciò la nostra versione modificata è incompatibile con quella scaricata da Google Play.

L’app in esecuzione dopo la modifica

Conclusioni

Tutto il lavoro di analisi e modifica ha richiesto circa 15 minuti, seduti al tavolo di un bar, senza conoscenze troppo approfondite di smali. Volendo si sarebbe potuto rimuovere anche il controllo sul debug USB, ma quello è facile da disattivare e non è un grosso problema.

Sono comunque rimasto perplesso dalla necessità di dover arrivare a tanto per colpa di una scelta di sviluppo poco attenta, che di fatto taglia fuori alcune persone dall’utilizzo del proprio conto corrente. Ho detto al mio amico:

Accidenti, ti rendi conto di cosa è stato necessario fare? Una persona “comune” cosa fa? O cambia smartphone, o cambia banca… è assurdo.

Se non altro ora ho una copia dell’APK che posso usare per aiutare eventuali altri conoscenti che usano la stessa banca. Mi è già capitato con un famigliare!

L’analisi delle applicazioni Android è un argomento molto affascinante, utile anche per testarne la sicurezza o effettuare analisi forensi relative al funzionamento interno dell’app e di come vengono gestiti eventuali dati memorizzati.

In questo post abbiamo visto un semplice esempio di come una piccola modifica possa essere risolutiva, ma l’argomento è molto vasto. Perciò vi vorrei segnalare alcune risorse interessanti per approfondire l’argomento:

HTC Wildfire: Android perfetto per l’università

Vi ho più volte accennato di aver cambiato telefono e finalmente è arrivato il momento di parlarne. Non sarà una recensione qualunque, ne potete trovare tante in giro. Mi voglio invece concentrare su una lista di applicazioni Android perfette per l’università e più in generale per gli studenti.

Tutto il contenuto della lista è frutto della mia esperienza personale. Ciò da un lato significa che potete “fidarvi” sul fatto che io abbia provato veramente ciò di cui scrivo (sono programmi che uso abitualmente); d’altro canto però vale a dire anche che non è un elenco esaustivo. Anzi, se conoscete altre applicazioni utili a riguardo dello studio o della produttività sono felicissimo di ricevere le vostre segnalazioni e discuterne nei commenti.

Perché il Wildfire?

Esistono della convinzioni abbastanza sbagliate sul mondo degli smartphone in generale. Una ad esempio è quella che se un telefono costa meno di 500€, non ha la schermo in HD e non ha la CPU di un computer di 3-4 anni fa significa che è pessimo.

Ovvio che metà di questi luoghi comuni li crea ad-hoc Apple, ma non voglio divagare su questo. Sta di fatto che l’HTC Wildfire è un cellulare eccellente. Ha uno schermo grande quanto basta per vederci benissimo e allo stesso tempo poter stare in tasca. Il processore da 500MHz gli consente la fluidità necessaria a tenere almeno 4 o 5 applicazioni aperte contemporaneamente (senza contare quelle in background). Come se non bastasse monta Android (versione 2.1), cosa importantissima anche per lo scopo di questo post, il quale è open source e meraviglioso: potete capirlo dopo averlo provato.

È un HTC, Garanzia di qualità per quanto concerne l’hardware. Inoltre questa azienda sviluppa un sistema Android con HTC Sense, un’interfaccia molto migliorata con alcune applicazioni in più e l’integrazione con i social network. Infine è uno dei pochi smartphone sul mercato con un prezzo onesto: 300€.

Forse è superfluo dirlo, ma preciso che ovviamente tutti i programmi suggeriti sono gratuiti (al limite ad-supported) in quanto non è mia intenzione suggerirvi di comprare applicazioni: non serve a niente. Inoltre mi auguro che tutti voi abbiate un account Google e ne facciate già intenso uso per organizzare la vostra vita. Se non è così vedrete a grandi linee come sfruttarlo al meglio leggendo fino in fondo.

Comunicazione a portata di tap

Uno dei punti di forza di un dispositivo multimediale di questo livello è indubbiamente l’ampia rosa di possibilità legate alla comunicazione. Con queste applicazioni potete coprire praticamente qualsiasi mezzo esistente:

  • Contatti La rubrica integrata nel Wildfire ha ottime funzioni di integrazione tra Gmail, Facebook e Twitter. Permette anche un mash-up semi automatico dei contatti, perciò appena inseriti i miei account posso già vedere il numero di telefono di un amico salvato su Gmail con la sua foto di Facebook
  • FriendStream, Peep e Facebook Le prime due sono le applicazioni HTC per gestire gli status di Facebook e Twitter, vi conviene comunque installare anche l’applicazione ufficiale di Facebook per avere alcune funzioni in più, per esempio i messaggi privati. Se usate un dispositivo Android che non è di HTC avete ottime alternative come TweetDeck e Seesmic. Il vantaggio di quest’ultimo è che ha anche un’interfaccia web da usare sul PC.
  • Gmail e Posta La prima è inclusa in tutti i dispositivi Android con le applicazioni di Google. La seconda è di HTC e serve per altri servizi tramite POP o IMAP (quindi potete fare a meno di usarla…). Se non adoperate Gmail come vostro indirizzo di posta è ora di ricredervi!
  • Gtalk, Imo e Nimbuzz Personalmente odio l’impostazione di Gtalk che fa partire il programma con l’avvio di Android, per cui vi consiglio di disattivarla. Imo e Nimbuzz vi permettono di chattare su tantissimi network come Yahoo, Msn, e altri, incluso Skype. Con Nimbuzz potete anche effettuare chiamate su Skype gratis verso Skype e pagando con SkypeOut per gli altri numeri. Contiene anche un proprio servizio di chiamate.

Informazioni sempre aggiornate

Con una connessione a internet, specialmente wireless, è comodissimo anche accedere alle informazioni in rete. Non solo tramite browser.

  • News e Greed2 HTC fornisce una applicazione per leggere gli RSS, ma non si integra per nulla con Google Reader. Per questo ho deciso di usare questa applicazione di terze parti che ha anche dei comodi pulsanti per le funzioni più comuni (like, share, ecc.) e si sincronizza con il nostro account Google. Se siete stufi dei banner in modalità orizzontale (che danno veramente fastidio per leggere, mentre in verticale no) potete bloccare nel vostro router l’accesso a admob.com così almeno a casa la lettura è tranquilla.
  • DB Navigator I pendolari troveranno in questa applicazione la salvezza! Sviluppata dalle ferrovie tedesche (che a quanto pare lavorano assai meglio delle nostre) contiene orari da tutta Europa, quindi anche quelli italiani, e permette di salvare nei preferiti diverse tratte in modo da avere le tabelle orarie sempre a disposizione.
  • Wapedia A dire la verità ho smesso di usare questa applicazione perché la usavo poco, ma per chi è abituato a sfogliare Wikipedia sempre e comunque fornisce una comoda interfaccia al sito (e ad altre wiki minori).
  • Wolfraroid Questa applicazione è solo una interfaccia per accedere rapidamente al servizio WolframAlpha (che spero conosciate) ma è comunque ottima per ottenere rapidamente la soluzione di un equazione, oppure lo schema molecolare della caffeina!

Gestione di lezioni e documenti

Queste funzioni sono utili specialmente per chi passa tanto tempo in treno e vuole trovare il modo per renderlo utile, per esempio con un ripassino veloce di qualche concetto importante.

  • PDF Viewer e Adobe Reader è vero che il Wildfire ha già un lettore di PDF più che soddisfacente, ma ho installato anche l’applicazione di Adobe perché fornisce una feature particolare ma molto utile: la ridisposizione del testo! A volte è un po’ lento ma consente di leggere i PDF di pagine piene di testo senza dover scorrere continuamente in laterale, perché sono i paragrafi ad adattarsi allo schermo.
  • Astro File Manager Praticamente indispensabile, consente di accedere ai file sul telefono e soprattutto in memoria. Un utilizzo banale ma interessante è quello di creare le cartelle per suddividere le foto senza dover usare il PC! Ha anche alcuni moduli a parte, tra cui quello per il Bluetooth.
  • Calendario Un altro ottimo esempio di integrazione. L’agenda del Wildfire si integra con Google Calendar e i compleanni di Facebook. Perfetto per avere sempre sott’occhio le lezioni e i treni. L’unico difetto è che non rispetta sempre i colori che si impostano sull’interfaccia web di Google Calendar e non si possono correggere. Vi consiglio di creare su Calendar un calendario dedicato all’università e impostare le vostre lezioni usando la funzione di ripetizione settimanale. Facendo lo stesso anche per i treni/bus/trasporti vari avrete una visione d’insieme efficacissima. Vi consiglio anche la lettura di questo ottimo articolo.
  • Dropbox Credo anche questo non abbia bisogno di presentazioni: è il client mobile dell’omonimo programma per computer. A differenza degli altri non scarica automaticamente tutti i file (altrimenti saturerebbe subito la memoria) ma è assai utile per tenere aggiornata la copia delle varie lezioni in PDF che ogni bravo universitario dovrebbe tenere su Dropbox. Per caricare i file richiede un file manager come Astro. Mancano alcune funzioni particolari, e purtroppo non si può impostare il download automatico sulle cartelle, ma va bene anche così.

Prendere note e appunti

Spesso quando sono in giro preferisco non perdermi con fogli e foglietti (che non si trovano mai) al contrario di ciò che faccio solitamente a casa. Vi presento alcune opzioni per note e appunti.

  • android.icio.us Si può usare per salvare i link interessanti e utili trovati navigando col browser del telefono e permette di scorrere quelli già salvati in precedenza nel proprio account Delicious. Forse l’interfaccia è un po’ povera ma fa il suo dovere.
  • Evernote Purtroppo uso pochissimo questo software avendo problemi con la connessione VPN della mia università, ma sono sicuro che se avessi il wireless godrei tantissimo dell’applicazione (le funzionalità sono alquanto limitate quando si è offline). Permette di annotare testi, foto, registrazioni audio. Inoltre fa una scansione OCR delle immagini per poterne ricercare il testo contenuto. Devo ancora provare Springpad invece, ma promette bene.
  • Gtasks Dato che uso Gmail e Calendar trovo veramente comodo avere le liste di cose da fare di fianco a queste due applicazioni, usando i Google Task. Questa applicazione fornisce una comodissima interfaccia sul Wildfire, e in più anche un widget da mettere su un home screen. Ha il pulsante di sincronizzazione manuale e si sincronizza quando aprite l’applicazione. Devo però provare anche Taskos! Se preferite Remember The Milk (ma chi ve lo fa fare?) potete usare l’applicazione ufficiale con servizio a pagamento o altre fatte da terzi.

Conclusione

Come avete visto le possibilità sono molte, e sicuramente mi saprete consigliare anche voi altre applicazioni interessanti. Come ultima cosa prima di finire il post, vi voglio consigliare di tenere traccia di tutto ciò che avete aperto con Mini Task Manager, in modo da “uccidere” le applicazioni che pensate di avere chiuso ma stanno continuando ad appesantire il sistema e consumano batteria.

Aspetto i vostri suggerimenti!