Su HTML.it abbiamo parlato abbondantemente di Android nella nostra guida, ed abbiamo spiegato come questo sistema operativo mobile permette agli elementi con che compongono un'applicazione di comunicare ed interagire tra di loro attraverso svariate tecniche. Una tipologia di comunicazione che vediamo più comunemente all'interno delle app Android è quella che avviene tramite gli Intent. Questi scambi di dati, però, se non correttamente gestiti e attenzionati, possono causare delle falle nella sicurezza delle applicazioni stesse. In questo articolo vedremo che cosa si intente per Intent Spoofing, e che danni può comportare ad un'app Android.
Intent Spoofing: definizione e basi
I navigati della sicurezza informatica saranno senz'altro a conoscenza del termine spoofing, ma volendone dare ugualmente un accenno diciamo che lo spoofing è un tipo di attacco informatico che consta nella manipolazione di dati per ottenere la falsificazione della propria identità e, in senso più generico, per ottenere la falsificazione di informazioni applicative.
Per spiegare in cosa consiste l'Intent Spoofing, che è una particolare tipologia di attacco basato su spoofing, dobbiamo prima elencare i principali componenti con i quali è possibile dare vita ad un'applicazione Android. Ne abbiamo già parlato in un'apposita lezione della guida ad Android, ma li riprendiamo rapidamente di seguito:
- Activity: rappresentano una schermata dell'applicazione, e contengono gli elementi grafici che permettono all'utente di interagire con essa
- Services: sono componenti che vengono eseguiti in background e sono adoperati per elaborare operazioni che hanno necessità di durare a lungo
- Broadcast receivers: sono invece componenti ai quali ci si registra per ricevere notifiche di particolari eventi
Ognuno dei componenti sopra elencati ha la possibilità di comunicare tramite l'uso degli Intent. Come comportamento di default, tutti i componenti possono ricevere Intent solo dai componenti appartenenti all'applicazione stessa, ma non da applicazioni esterne (sebbene questa possibilità può essere abilitata tramite l'AndroidManifest, utilizzando l'attributo android:exported
).
Un Intent, nella sua accezione più comune, può quindi essere definito come una richiesta da parte di un componente di una funzionalità che viene implementata in un altro componente. Questo meccanismo è ben conosciuto dai fruitori di app, e anche se possono non esserne consapevoli, ogni volta che un'applicazione chiede il permesso di poter accedere a una funzionalità del cellulare, come per esempio l'uso della fotocamera, non si sta facendo altro che sfruttare un Intent.
Gli Intent si suddividono essenzialmente in due categorie:
- Intent espliciti
- Intent impliciti
Gli Intent espliciti indicano esplicitamente il componente che si vuole richiamare, utilizzando l'appropriata classe Java che lo rappresenta:
Intent i = new Intent(contex, ActivityB.class);
Gli Intent impliciti, di rimando, indicano soltanto l'azione che si vuole eseguire, e sarà il framework Android a proporre all'utente le diverse possibilità:
Intent i = newIntent(action, uri);
Sfruttando gli Intent, abbiamo quindi la possibilità di perpetrare due tipologie di attacchi: l'Intent Interception e l'Intent spoofing:
- l'Intent interception è un tipo di attacco che consiste nel ricevere un Intent che non era stato richiesto, con la successiva perdita di informazioni sensibili ma, soprattutto, con l'attivazione di un componente che non era stato voluto, e che può risultare potenzialmente dannoso per l'utente
- l'Intent spoofing è invece l'attacco di cui parleremo, ed induce dei comportamenti indesiderati tramite l'esecuzione di un Intent manipolato ad hoc.
Scenario
Un tipico scenario che rappresenta un attacco di tipo Intent spoofing è quello rappresentato nella figura seguente:
In questo scenario abbiamo due entità principali: una normale app, rappresentata dal riquadro Messenger App, e una seconda app malevola, rappresentata dal riquadro Malicious App. Vediamo che Messenger App sta mandando, tramite un Intent, delle informazioni dall'Activity Message Composer (che pensiamo possa servire per comporre un messaggio di testo) all'Activity Message Sender (che pensiamo possa occuparsi dell'invio del suddetto messaggio).
Un'applicazione malevola potrebbe eseguire un attacco di tipo Intent spoofing registrandosi come Activity capace di ricevere una tipologia di Intent per modificarne il contenuto con parametri o dati malevoli.
Per verificare la presenza di possibili falle nelle proprie applicazioni, il framework Android offre un'utility chiamata am (che sta per Activity Manager). Questa utility permette di creare ed inviare Intent alle Activity delle app installate sul proprio emulatore Android. Per lanciare l'utility, bisogna prima accedere alla console dell'emulatore Android tramite il comando:
adb shell
Con il comando am è possibile creare degli Intent ed assegnare ad essi dei dati per mandarli alle Activity scelte dall'attaccante. Per esempio, il codice seguente crea un Intent da inviare all'Activity A, contenente come parametri una stringa e un intero.
am start \
-a android.intent.action.SENDTO \
--es com.test.android.app.Telefono 329111 \
--ei com.test.android.app.Civico 10 \
-n com.test.android.app/.activity.Activity_A
Capiamo subito che, se le nostre applicazioni non sono adeguatamente progettate, chiunque, tramite la creazione di Intent, sarebbe in grado di poter interagire con le nostre Activity, facendo eseguire dei comportamenti inaspettati o comunque dannosi.
Proteggersi dall'Intent Spoofing
Ecco quindi alcuni semplici consigli per progettare applicazioni a prova di Intent Spoofing:
- evitare l'uso di Intent impliciti, optando invece per quelli espliciti
- nell'AndroidManifest, impostare per ogni componente il valore
android:exported
: questo eliminerà il rischio che Intent non esplicitamente richiesti possano interagire con la nostra app - se è necessario accettare Intent da applicazioni esterne, dobbiamo controllare attentamente i dati che vengono mandati tramite opportuni controlli via codice